Spark 之环境搭建与任务执行流程
- Spark 环境搭建
- 常用端口号
- TIPS
- Standalone环境搭建
- Spark On Yarn
- standalone-client
- standalone-cluster
- Yarn Client
- Notice
- Spark Master HA
- Yarn Cluster
- Tips
- Pipeline 计算模式
- Q&A
Spark 环境搭建
常用端口号
- HDFS: http://node1:50070/
- HBase: http://node1:60010/master-status
- Yarn: http://node3:8088/cluster
- Spark: Master :8088 Worker :8081
TIPS
linux vim 命令下,esc + : + ! 可以输出路径
killall java
Standalone环境搭建
下载地址:spark-2.2.1-bin-hadoop2.7.tgz
1. 上传 spark-2.2.1-bin-hadoop2.7.tgz
2. tar -zxvf spark-2.2.1-bin-hadoop2.7.tgz /usr/local/software
3. 设置环境变量
vim /etc/profile
export SPARK_HOME=/usr/local/software/spark-2.2.1-bin-hadoop2.7
PATH=$SPARK_HOME/bin:$SPARK_HOME/sbin
export PATH
:wq
//使配置生效
source /etc/profile
4. cd $SPARK_HOME/conf
cp slaves.template slaves
vim slaves
//配置资源调度从节点
node2
node3
//保存退出
:wq
5. cp spark-env.sh.template spark-env.sh
vim spark-env.sh
# 配置JAVA_HOME,一般来说,不配置也可以,但是可能会出现问题,还是配上吧
export JAVA_HOME=/usr/local/java/jdk1.8.0_181
# 设置Master的主机名
export SPARK_MASTER_HOST=node1
# 提交Application的端口,默认就是这个,万一要改呢,改这里
export SPARK_MASTER_PORT=7077
# 每一个Worker最多可以使用的cpu core的个数,我虚拟机就一个...
# 真实服务器如果有32个,你可以设置为32个
export SPARK_WORKER_CORES=1
# 每一个Worker最多可以使用的内存,我的虚拟机就2g
# 真实服务器如果有128G,你可以设置为100G
export SPARK_WORKER_MEMORY=1g
#export SPARK_LIBRARY_PATH=/
#export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib/hadoop/lib/native/
export SPARK_LOG_DIR=/opt/log/spark
//保存退出
:wq
6. cd $SPARK_HOME/sbin
//hadoop 中有start-all.sh 为区别,将spark中的start-all.sh 更名为spark-start-all.sh,stop-all.sh 更名为 spark-stop-all.sh
mv start-all.sh spark-start-all.sh
mv stop-all.sh spark-stop-all.sh
7. 分发到其他节点
scp /usr/local/software/spark-2.2.1-bin-hadoop2.7 node2:`pwd`
scp /usr/local/software/spark-2.2.1-bin-hadoop2.7 node3:`pwd`
8. 启动
spark-start-all.sh
9. 验证
ndoe1:8080
ndoe2:8081
ndoe3:8081
//启动端口可以更改
vim start-master.sh
//搜索8080
/8080
//找到即可以更改
10. 运行example
cd /usr/local/software/spark-2.2.1-bin-hadoop2.7/examples/jars
spark-submit --master local --class org.apache.spark.examples.SparkPi ./spark-examples_2.11-2.2.1.jar 10
Spark On Yarn
向Yarn提交任务,将node4作为客户端,单独配置,此时yarn作为资源调度,spark作为分布式计算
官方文档: http://spark.apachecn.org/#/docs/17
1.vim spark-env.sh
export JAVA_HOME=/usr/local/java/jdk1.8.0_181
export HADOOP_CONF_DIR=/usr/local/software/hadoop-2.6.0/etc/hadoop
//保存退出
2. slaves 直接删除即可
3. 确保hdfs/yarn 已经成功启动
4. 提交任务
cd /usr/local/software/spark-2.2.1-bin-hadoop2.7/examples/jars
spark-submit --master yarn-cluster --class org.spark.apache.examples.SparkPi ./spark-examples_2.11-2.2.1.jar 10
5. 登录yarn页面查看执行状态
Yarn: http://node3:8088/cluster
standalone-client
1.Driver 与集群之间有哪些通信?
- 分发task
- 回收计算结果
- 监控task执行情况
2.当每一次在client提交spark应用程序的时候,都会在client启动一个Driver进程
-避免同时提交太多任务,适用于测试环境。
standalone-cluster
1.client提交spark application到Master
2.向Master申请资源启动Driver
3.Master收到请求之后会在Worker节点中随机找一台节点启动Driver
4.Driver启动之后申请资源执行Application
5.回收结果到客户端
Yarn Client
./spark-submit --master yarn --deploy-mode client --class ...
1. client 提交spark application ,会在client端启动Driver进程
2. 向RM请求资源,在NodeManager启动ApplicationMaster
3. AM向RM请求资源,用于启动Executor,RM返回NM到AM
4. AM连接满足要求的NM启动Executor(线程池-Thread Pool,用于执行task),反向注册到Driver
5. Driver发送task到Executor,回收结果
Notice
- ApplicationMaster作用
- 请求资源
- 启动Executor
每一次在client中提交任务的时候,都会在client短启动一个Driver,如果同时提交多任务,就会与集群有大量的通信,会造成网卡流量激增问题。适用于测试,不适用于真实生产环境
Spark Master HA
Yarn Cluster
./spark-submit --master yarn --deploy-mode cluster --class ...
1. client 提交spark application,向RM发送请求,请求启动AM
2. RM收到请求,随机在NM所在的节点上启动AM(Driver)
3. AM向RM请求资源用于启动Executor,RM返回满足资源的节点
4. AM连接相应的节点启动Executor(Thread Pool),发送Task,回收结果
Tips
- Spark粗粒度资源申请(也可以支持细粒度),Application执行之前先向集群申请资源,如果申请到了则执行,task执行的时候直接使用申请到的资源就可以。等到最后一个task执行完成之后这部分资源才会释放。
-优点: Application执行之前,资源已经申请完毕,task执行的时候不用自己申请资源,task执行快–> stage 快–> job 也就快了
-缺点:资源不能充分被利用- 细粒度资源申请。每个task执行的时候自己申请资源,task执行完毕后资源直接释放(MR)
-优点:资源充分利用
-缺点:task自己申请资源,则最后Application也就慢了
Pipeline 计算模式
1. 数据什么时候落地?有shuffle write的时候
2. 怎么提高并行度? 增加分区
3. stage是什么(一组并行的task)
4. partition 中存储的是计算逻辑,不存储数据
Q&A
1.yarn log 日志存放
<property>
<description>Where to aggregate logs to.(hdfs)</description>
<name>yarn.nodemanager.remote-app-log-dir</name>
<value>/yarn/apps</value>
</property>
<property>
<description>Where to aggregate logs to.</description>
<name>yarn.nodemanager.remote-app-log-dir-suffix</name>
<value>logs</value>
</property>
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
//拉取日志命令
yarn logs -applicationId application_1545126742521_0001 > application_1545126742521_0001.log
2. 历史日志服务器
<property>
<name>yarn.log.server.url</name>
<value>http:***/jobhistory/logs/</value>
</property>
3.
Exception in thread "main" org.apache.spark.SparkException: Yarn application has already ended! It might have been killed or unable to launch application master.
at org.apache.spark.scheduler.cluster.YarnClientSchedulerBackend.waitForApplication(YarnClientSchedulerBackend.scala:85)
at org.apache.spark.scheduler.cluster.YarnClientSchedulerBackend.start(YarnClientSchedulerBackend.scala:62)
at org.apache.spark.scheduler.TaskSchedulerImpl.start(TaskSchedulerImpl.scala:173)
at org.apache.spark.SparkContext.<init>(SparkContext.scala:509)
at org.apache.spark.SparkContext$.getOrCreate(SparkContext.scala:2516)
at org.apache.spark.sql.SparkSession$Builder$$anonfun$6.apply(SparkSession.scala:918)
at org.apache.spark.sql.SparkSession$Builder$$anonfun$6.apply(SparkSession.scala:910)
at scala.Option.getOrElse(Option.scala:121)
at org.apache.spark.sql.SparkSession$Builder.getOrCreate(SparkSession.scala:910)
at org.apache.spark.examples.SparkPi$.main(SparkPi.scala:31)
at org.apache.spark.examples.SparkPi.main(SparkPi.scala)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:775)
at org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:180)
at org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:205)
at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:119)
at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)
4. Driver 与集群之间有哪些通信?
- 分发task
- 回收计算结果
- 监控task执行情况
5.