环境说明
centos 7.5
spark-2.1.1
Spark 内置模块
Spark local 模式
安装
直接解压即可,无需配置(spark-2.1.1-bin-hadoop2.7.tgz 集成hadoop环境包 )
local 模式下测试
# 提交任务 使用spark案例 计算pi
bin/spark-submit --master local[20] \
--class org.apache.spark.examples.SparkPi \
./examples/jars/spark-examples_2.11-2.1.1.jar 100
# 也可以使用提供的脚本
bin/run-example SparkPi 100
启动 SparkShell
bin/spark-shell --master 'local[2]'
参数说明:--master 'local[2]'
可以不指定 默认local[*] , [] 中表示并行度
Spark context Web UI available at http://192.168.9.21:4040
Spark context available as 'sc' (master = local[*], app id = local-1596820563191).
Spark session available as 'spark'.
- 启动SparkShell 可以使用浏览器访问 ip:4040 登陆Spark DriverUI监控页面查看信息
- 在sparkshell 中自动创建 Spark Context 对象 sc
SparkShell执行WorkCount
bin/spark-shell
scala> sc.textFile("/root/input").flatMap(_.split("\\W+")).map((_,1)).reduceByKey(_ + _).collect
res7: Array[(String, Int)] = Array((min,1), (sum_low_carbon,3), (u_002,1), (user_low_carbon,7), (pre2diff,2), (100g,2), (partition,7), (19,2), (2017,5), (order,8), (between,2), (0,3), (with,1), (t2,2), (2,6), (cousd,5), (as,3), ("",62), (lag,2), (floor,2), (after1diff,3), ...
scala>
Spark角色
Master 角色
Spark standalone 资源调度系统的Leader。掌管整个集群的资源信息,类似与Yarn中的ResourceManager
- 负责监听Worker工作是否正常
- Master对Worker、Application等管理(接收Worker的注册,Client 的Application提交,调度等待中的Application向Worker提交)
Worker 角色
Spark 特有资源调度系统的 Slave ,类似Yarn框架中的NodeManager,类似Yarn的NodeManager
- 通过RegisterWorker 注册到Master
- 定时发送心跳给Master
- 根据Master发送的Application配置进程环境,并启动ExecutorBackend(执行Task所需的临时进程)
Driver Program 线程
每个Spark应用都包含一个driver program 即驱动程序,负责将并行任务发布到集群中,驱动程序包含Spark应用程序中的主函数,定义了分布式数据集并应用在集群中
在之前使用的SparkShell 就是一类驱动程序,我们可以在SparkShell应用程序中键入任何Spark操作,然后由它负责发布
驱动程序通过SparkContext对象来访问Spark,SparkContext对象相当于一个到Spark集群的接连.
在sparkshell中会自动创建 Spark Context 对象 sc
创建 RDD 弹性分布式数据集 (Resilient Distributed Dataset)
Executor 进程
Worker中的一个进程(ExecutorBackend),负责具体执行计算和为应用存储数据
Spark会发送应用程序代码(jar包)到每隔执行器,最后SparkContext对象发送任务到执行器开始执行程序
Cluster Manager 集群管理器
- Spark own standalone Cluster Manager
- Mesos
- YARN
SparkContext对象连接到上述Cluster Manager 获取分配资源, 也可以连接多种Cluster Manager跨应用分配资源
Standalone 模式
独立模式(寂寞模式).该模式下调度器使用 独立调度器(Spark own standalone Cluster Manager)
安装
-
解压
-
重命名并编辑conf/spark-env.sh master地址以及通讯端口(默认7077 可以不配置)
SPARK_MASTER_HOST=spark-node01 SPARK_MASTER_PORT=7077
-
重命名并编辑conf/slaves 写入worker地址
spark-node01 spark-node02 spakr-node03
-
分发conf文件夹到所有spark节点
启动
在配置master的节点上sbin/start-all.sh
[root@spark-node01 sbin]# jps
2503 Master
2599 Worker
2699 Jps
启动后可 使用 master hostname:8080 查看Spark WebUI
测试程序
bin/spark-submit --master spark://spark-node01:7077 \
--class org.apache.spark.examples.SparkPi \
./examples/jars/spark-examples_2.11-2.1.1.jar 1000
启动SparkShell
bin/spark-shell --master spark://spark-node01:7077
参数说明:Standalone模式需要指定 --master
Deploy Mode
- Cluster Mode : 该模式会在集群中随机一节点开启Driver,该模式日志会存储在集群中
- 默认 Client : 该模式会在Clinet 客户端启动Driver ,该模式日志会打印在Client控制台,不会保存
通过 --deploy-mode cluster
修改为 Cluster Mode.
bin/spark-submit --master local[20] \
--class org.apache.spark.examples.SparkPi \
--deploy-mode cluster \
./examples/jars/spark-examples_2.11-2.1.1.jar 1000
执行上述代码后 不会输出结果,因为Driver 在集群中某一节点,此时需要通过WebUI查看
WEB UI 端口
Driver : 4040 (只能在运行时查看,或配置历史服务器)
Master : 8080
Worker :8081 (若同一节点开启多个Worker 8082,8083…)
Hsitory UI :18080
配置历史服务器
-
重命名并编辑 conf/spark-defaults.conf
# spark.master spark://spark-ndoe01:7077 spark.eventLog.enabled true spark.eventLog.dir hdfs://hadoop-node01:8021/spark-log
-
在hadoop创建对应目录 /spark-log
-
在 conf/spark-env.sh 文件,添加如下配置
export SPARK_HISTORY_OPTS="-Dspark.history.ui.port=18080 -Dspark.history.retainedApplications=30 -Dspark.history.fs.logDirectory=hdfs://hadoop-node01/spark-log"
-
分发配置
-
启动
sbin/start-history-server.sh
进程名称 HistoryServer -
WebUI地址 : 启动的节点host名称:18080
Master HA
通过配置多个Master,实现高可用,先启动节点处于Active状态,其他都处于Standby状态
-
编辑 conf/spark-env.sh 添加如下配置
# 注释以下内容: #SPARK_MASTER_HOST=hadoop201 #SPARK_MASTER_PORT=7077 # 添加以下内容: export SPARK_DAEMON_JAVA_OPTS="-Dspark.deploy.recoveryMode=ZOOKEEPER -Dspark.deploy.zookeeper.url=zk-node01:2181,zk-node02:2181,zk-node03:2181 -Dspark.deploy.zookeeper.dir=/spark"
-
分发配置文件
-
启动zookeeper
-
启动/重启全部spark节点
-
启动从master
sbin/start-master.sh
-
通过从master节点WebUI 可以看到状态为standby,当处于alive状态的master节点宕机,处于standby会自动切换到alive状态
YARN 模式
Spark Clinet 直接连接到Yarn,不需要构建Spark集群。Yarn集群中的节点不需要安装Spark环境,Spark Clinet会将Spark任务所需要的jar包打包提交到RM(hdfs中) 可以理解为该模式下 Spark仅为客户端
Deploy Mode
同Standalone 一样 Yarn 也有两种模式
-
client :Driver 程序运行在客户端,用于交互、调试,可立即看到app输出
-
cluster :Driver 程序运行在ResourceManager 启动的ApplicationMaster上,适用于生产环境
安装
-
测试环境配置 : 防止内存不足导致任务被意外杀死, 编辑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>
-
解压Spark安装包(spark-2.1.1-bin-hadoop2.7.tgz)
-
重命名并编辑 spark-env.sh 配置yarn地址,添加以下配置
YARN_CONF_DIR=/opt/module/hadoop-2.7.2/etc/hadoop
-
配置历史服务器 (参考上述) 并启动
-
Yarn Web UI (8088) 与 Spark历史服务器连接配置,编辑 conf/spark-default.conf 加入如下配置
spark.yarn.historyServer.address=spark-node01:18080 spark.history.ui.port=18080
-
如运行是报lzo压缩无法找到错误,可在 conf/spark-default.conf 加入以下配置指定lzo jar包位置
spark.jars=/opt/hadoop-2.7.2/share/hadoop/common/hadoop-lzo-0.4.20.jar
测试程序
bin/spark-submit \
--master yarn --deploy-mode cluster \
--class org.apache.spark.examples.SparkPi \
./examples/jars/spark-examples_2.11-2.1.1.jar 1000
启动SparkShell
在yarn 模式只能读取hdfs中的文件
bin/spark-shell --master yarn
scala> sc.textFile("/opt/input").flatMap(_.split("\\W+")).map((_,1)).reduceByKey(_ + _).collect
三种模式对比
模式 | Spark安装节点数 | 启动进程 | 所属者 |
---|---|---|---|
local | 1 | 无 | spark |
Standalone | 多台 | Master Worker | spark |
Yarn | 1 | Yarn HDFS | Hadoop |