01-spark-入门简介:
Spark 是一种基于内存的快速、通用、可扩展的大数据分析计算引擎。
一次性数据计算:框架在处理数据的时候,从存储设备中读取数据,进行逻辑操作,然后将结果存储到介质中。
Hadoop 的 MR 框架和 Spark 框架(spark基于内存,mr和磁盘交互。spark快。)
1、Hadoop MapReduce 由于其设计初衷并不是为了满足循环迭代式数据流处理,因此在多并行运行的数据可复用场景(如:机器学习、图挖掘算法、交互式数据挖掘算法)中存在诸多计算效率等问题。所以 Spark 应运而生,Spark 就是在传统的 MapReduce 计算框
架的基础上,利用其计算过程的优化,从而大大加快了数据分析、挖掘的运行和读写速度,并将计算单元缩小到更适合并行计算和重复使用的 RDD 计算模型。
2、机器学习中 ALS、凸优化梯度下降等。这些都需要基于数据集或者数据集的衍生数据反复查询反复操作。MR 这种模式不太合适,即使多 MR 串行处理,性能和时间也是一个问题。数据的共享依赖于磁盘。另外一种是交互式数据挖掘,MR 显然不擅长。而park 所基于的 scala 语言恰恰擅长函数的处理。
3、Spark 是一个分布式数据快速分析项目。它的核心技术是弹性分布式数据集(Resilient Distributed Datasets),提供了比 MapReduce 丰富的模型,可以快速在内存中对数据集进行多次迭代,来支持复杂的数据挖掘算法和图形计算算法。
4、Spark 和Hadoop 的差异是多个作业之间的数据通信问题 : Spark 多个作业数据通信是基于内存,而 Hadoop 是基于磁盘。
5、 Spark Task 的启动时间快。Spark 采用 fork 线程的方式,而 Hadoop 采用创建新的进程的方式。
6、 Spark 只有在 shuffle 的时候将数据写入磁盘,而 Hadoop 中多个 MR 作业之间的数据交互都要依赖于磁盘交互
7、Spark 的缓存机制比 HDFS 的缓存机制高效。 Spark 是基于内存的,所以在实际的生产环境中,由于内存的限制,可能会
由于内存资源不够导致 Job 执行失败,此时,MapReduce 其实是一个更好的选择,所以 Spark并不能完全替代 MR。(看场景)
hadoop-mr,spark基本区别
Spark核心模块
➢ Spark Core
Spark Core 中提供了 Spark 最基础与最核心的功能,Spark 其他的功能如:Spark SQL,Spark Streaming,GraphX, MLlib 都是在 Spark Core 的基础上进行扩展的
➢ Spark SQL
Spark SQL 是 Spark 用来操作结构化数据的组件。用户可以使用 SQL或者 HQL来查询数据。
➢ Spark Streaming
Spark Streaming 是 Spark 平台上针对实时数据进行流式计算的组件,提供了丰富的处理数据流的 API。
➢ Spark MLlib
MLlib 是 Spark 提供的一个机器学习算法库。MLlib 不仅提供了模型评估、数据导入等额外的功能,还提供了一些更底层的机器学习原语。
➢ Spark GraphX
GraphX 是 Spark 面向图计算提供的框架与算法库。
1.快速入门spark项目1
创建项目,引入scala。wordcount案例思路
路径:big-data-study\Spark-demo\src\main\java\com\myspark\demo\wordcount
2、spark运行环境
本地运行模式:解压缩文件:将 spark-3.0.0-bin-hadoop3.2.tgz 文件上传到 Linux 并解压缩,放置在指定位置,重命名
tar -zxvf spark-3.0.0-bin-hadoop3.2.tgz -C /opt/module
mv spark-3.0.0-bin-hadoop3.2 spark-local
启动 Local 环境 本地模式
- 进入解压缩后的路径,执行
bin/spark-shell
在spark-local/data/下创建测试文件
scala> sc.textFile("data/word.txt").flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_).collect
res3: Array[(String, Int)] = Array((Hello,3), (Scala,1), (Spark,2))
- 启动成功后,可以输入网址进行 Web UI 监控页面访问
http://虚拟机地址:4040
3.提交应用测试
bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master local[2] \
./examples/jars/spark-examples_2.12-3.0.0.jar \
10
1) --class 表示要执行程序的主类,此处可以更换为咱们自己写的应用程序
2) --master local[2] 部署模式,默认为本地模式,数字表示分配的虚拟 CPU 核数量
3) spark-examples_2.12-3.0.0.jar 运行的应用类所在的 jar 包,实际使用时,可以设定为咱们自己打的 jar 包
4) 数字 10 表示程序的入口参数,用于设定当前应用的任务数量
Standalone 模式
local 本地模式用来练习演示的,真实需将应用提交到对应的集群中去执行,集群模式,独立部署(Standalone)模式。Spark 的 Standalone 模式也是经典的 master-slave 模式。集群规划:
修改配置文件
- 进入解压缩后路径的 conf 目录,修改 slaves.template 文件名为 slaves
tar -zxvf spark-3.0.0-bin-hadoop3.2.tgz -C /opt/module
cd /opt/module
mv spark-3.0.0-bin-hadoop3.2 spark-standalone
mv slaves.template slaves
- 修改 slaves 文件,添加 work 节点
192.168.1.102
192.168.1.103
192.168.1.104
- 修改 spark-env.sh.template 文件名为 spark-env.sh
mv spark-env.sh.template spark-env.sh
- 修改 spark-env.sh 文件,添加 JAVA_HOME 环境变量和集群对应的 master 节点
export JAVA_HOME=/opt/module/jdk1.8.0_251
SPARK_MASTER_HOST=192.168.1.102
SPARK_MASTER_PORT=7077
注意:7077 端口,相当于 hadoop3 内部通信的 8020 端口,此处的端口需要确认自己的 Hadoop配置
- 分发 spark-standalone 目录
xsync spark-standalone
启动集群
- 执行脚本命令:
sbin/start-all.sh
查看 Master 资源监控 Web UI 界面: http://192.168.1.102:8080
提交应用
bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master spark://192.168.1.102:7077 \
./examples/jars/spark-examples_2.12-3.0.0.jar \
10
1) --class 表示要执行程序的主类
2) --master spark://192.168.1.102:7077 独立部署模式,连接到 Spark 集群
3) spark-examples_2.12-3.0.0.jar 运行类所在的 jar 包
4) 数字 10 表示程序的入口参数,用于设定当前应用的任务数量
提交参数说明
配置历史服务
由于 spark-shell 停止掉后,集群监控 hadoop102:4040 页面就看不到历史任务的运行情况,所以
开发时都配置历史服务器记录任务运行情况。
- 修改 spark-defaults.conf.template 文件名为 spark-defaults.conf
mv spark-defaults.conf.template spark-defaults.conf
- 修改 spark-default.conf 文件,配置日志存储路径
spark.eventLog.enabled true
spark.eventLog.dir hdfs://192.168.1.102:8020/directory
注意:需要启动 hadoop 集群,HDFS 上的 directory 目录需要提前存在。
sbin/start-dfs.sh
hadoop fs -mkdir /directory
- 修改 spark-env.sh 文件, 添加日志配置
export SPARK_HISTORY_OPTS="
-Dspark.history.ui.port=18080
-Dspark.history.fs.logDirectory=hdfs://192.168.1.102:8020/directory
-Dspark.history.retainedApplications=30"
参数 1 含义:WEB UI 访问的端口号为 18080
参数 2 含义:指定历史服务器日志存储路径
参数 3 含义:指定保存 Application 历史记录的个数,如果超过这个值,旧的应用程序信息将被删除,这个是内存中的应用数,而不是页面上显示的应用数。
-
分发配置文件,xsync conf
-
重新启动集群和历史服务
sbin/start-all.sh
sbin/start-history-server.sh
- 重新执行任务
bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master spark://192.168.1.102:7077 \
./examples/jars/spark-examples_2.12-3.0.0.jar \
10
- 查看历史服务:http://192.168.1.102:18080
配置高可用(HA)
-
停止集群 sbin/stop-all.sh
-
启动 Zookeeper xstart zk
-
修改 spark-env.sh 文件添加如下配置
注释如下内容:
#SPARK_MASTER_HOST=hadoop102
#SPARK_MASTER_PORT=7077
添加如下内容:
#Master 监控页面默认访问端口为 8080,但是可能会和 Zookeeper 冲突,所以改成 8989,也可以自定义,访问 UI 监控页面时请注意
SPARK_MASTER_WEBUI_PORT=8989
export SPARK_DAEMON_JAVA_OPTS="
-Dspark.deploy.recoveryMode=ZOOKEEPER
-Dspark.deploy.zookeeper.url=192.168.1.102,192.168.1.103,192.168.1.104
-Dspark.deploy.zookeeper.dir=/spark"
-
分发配置文件 xsync conf/
-
启动集群 sbin/start-all.sh
-
启动 linux2 的单独 Master 节点,此时 linux2 节点 Master 状态处于备用状态
[root@linux2 spark-standalone]# sbin/start-master.sh
- 提交应用到高可用集群
bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master spark://192.168.1.102:7077,192.168.1.103:7077 \
./examples/jars/spark-examples_2.12-3.0.0.jar \
10
-
停止 hadoop102 的 Master 资源监控进程
-
查看 linux2 的 Master 资源监控 Web UI,稍等一段时间后,linux2 节点的 Master 状态提升为活动状态
Yarn 模式
独立部署(Standalone)模式由 Spark 自身提供计算资源,无需其他框架提供资源。这种方式降低了和其他第三方资源框架的耦合性,独立性非常强。但是Spark 主要是计算框架,而不是资源调度框架,所以本身提供的资源调度并不是它的强项,所以还是和其他专业的资源调度框架集成会更靠谱一些。
将 spark-3.0.0-bin-hadoop3.2.tgz 文件上传到 linux 并解压缩,放置在指定位置。
tar -zxvf spark-3.0.0-bin-hadoop3.2.tgz -C /opt/module
cd /opt/module
mv spark-3.0.0-bin-hadoop3.2 spark-yarn
修改配置文件
- 修改 hadoop 配置文件/opt/module/hadoop/etc/hadoop/yarn-site.xml, 并分发
<!--是否启动一个线程检查每个任务正使用的物理内存量,如果任务超出分配值,则直接将其杀掉,默认是 true -->
<property>
<name>yarn.nodemanager.pmem-check-enabled</name>
<value>false</value>
</property>
<!--是否启动一个线程检查每个任务正使用的虚拟内存量,如果任务超出分配值,则直接将其杀掉,默认是 true -->
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
- 修改 conf/spark-env.sh,添加 JAVA_HOME 和 YARN_CONF_DIR 配置
mv spark-env.sh.template spark-env.sh
export JAVA_HOME=/opt/module/jdk1.8.0_251
YARN_CONF_DIR=/opt/module/hadoop-3.1.4/etc/hadoop
启动 HDFS 以及 YARN 集群
提交应用
bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master yarn \
--deploy-mode cluster \
./examples/jars/spark-examples_2.12-3.0.0.jar \
10
配置历史服务器
- 修改 spark-defaults.conf.template 文件名为 spark-defaults.conf
mv spark-defaults.conf.template spark-defaults.conf
- 修改 spark-default.conf 文件,配置日志存储路径
spark.eventLog.enabled true
spark.eventLog.dir hdfs://192.168.1.102:8020/directory
注意:需要启动 hadoop 集群,HDFS 上的目录需要提前存在。
[root@hadoop102 hadoop]# sbin/start-dfs.sh
[root@hadoop102 hadoop]# hadoop fs -mkdir /directory
- 修改 spark-env.sh 文件, 添加日志配置
export SPARK_HISTORY_OPTS="
-Dspark.history.ui.port=18080
-Dspark.history.fs.logDirectory=hdfs://hadoop102:8020/directory
-Dspark.history.retainedApplications=30"
参数 1 含义:WEB UI 访问的端口号为 18080
参数 2 含义:指定历史服务器日志存储路径
参数 3 含义:指定保存 Application 历史记录的个数,如果超过这个值,旧的应用程序信息将被删除,这个是内存中的应用数,而不是页面上显示的应用数。
4)修改 spark-defaults.conf
spark.yarn.historyServer.address=hadoop102:18080
spark.history.ui.port=18080
-
启动历史服务 sbin/start-history-server.sh
-
重新提交应用
bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master yarn \
--deploy-mode client \
./examples/jars/spark-examples_2.12-3.0.0.jar \
10
Web 页面查看日志:http://192.168.1.102:18080/ http://192.168.1.103:8088
本地模式
将文件 spark-3.0.0-bin-hadoop3.2.tgz 解压缩到无中文无空格的路径中
- 执行解压缩文件路径下 bin 目录中的 spark-shell.cmd 文件,启动 Spark 本地环境
- 在 bin 目录中创建 input 目录,并添加 word.txt 文件, 在命令行中输入脚本代码
sc.textFile(“input/word.txt”).flatMap(.split(" ")).map((,1)).reduceByKey(+).collect
3、命令行提交应用
在 DOS 命令行窗口中执行提交指令
spark-submit --class org.apache.spark.examples.SparkPi --master local[2] …/examples/jars/spark-examples_2.12-3.0.0.jar 10
部署模式对比
端口号
➢ Spark 查看当前 Spark-shell 运行任务情况端口号:4040(计算)
➢ Spark Master 内部通信服务端口号:7077
➢ Standalone 模式下,Spark Master Web 端口号:8080(资源)
➢ Spark 历史服务器端口号:18080
➢ Hadoop YARN 任务运行情况查看端口号:8088
学习路径:https://space.bilibili.com/302417610/,如有侵权,请联系q进行删除:3623472230