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

spark任务提交yarn spark任务提交端口_scala

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

spark任务提交yarn spark任务提交端口_spark任务提交yarn_02

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
  1. 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
  1. Spark粗粒度资源申请(也可以支持细粒度),Application执行之前先向集群申请资源,如果申请到了则执行,task执行的时候直接使用申请到的资源就可以。等到最后一个task执行完成之后这部分资源才会释放。
    -优点: Application执行之前,资源已经申请完毕,task执行的时候不用自己申请资源,task执行快–> stage 快–> job 也就快了
    -缺点:资源不能充分被利用
  2. 细粒度资源申请。每个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.