1、Spark on Yarn 有两种模式,一种是cluster模式,一种是client模式。
a.执行命令 “./spark-shell --master yarn” 默认运行的是client模式。
b.执行 "./spark-shell --master yarn-client" 或者 "./spark-shelll --master yarn --deploy-mode client",运行client模式。
c.执行 "./spark-shell --master yarn-cluster" 或者 "./spark-shell --master yarn --deploy-mode cluster"。
d.client 和 cluster模式的主要区别:前者的driver是运行在客户端进程中,后者的driver是运行在NodeManager的ApplicationMaster之中。driver是负责分发作业的,运行在ApplicationMaster里的driver是无法直接与客户端进行通信的。
注:生产上通常使用的是spark on yarn-cluster模式,由于client模式的driver在客户端上,可能与executor不在同一局域网,两者之间的通信会很慢。
2、提交作业的方式
./spark/bin/spark-submit --class org.apache.spark.examples.SparkPi \ #作业类名
--master yarn \ #spark模式
--deploy-mode cluster \ #spark on yarn 模式
--driver-memory 4g \ #每一个driver的内存
--executor-memory 2g \ #每一个executor的内存
--executor-cores 1 \ #每一个executor占用的core数量
--queue thequeue \ #作业执行的队列
examples/jars/spark-examples*.jar \ #jar包
10 #传入类中所需要的参数
3、提交作业时 yarn 会将spark jars分发到 yarn 的container中,这十分耗费资源,故而可以将spark jars放在一个yarn可以访问到的目录中,具体的做法如下(调优点):
vim spark-default.conf 添加
spark.yarn.jars hdfs://ip:8021/somepath/*
保存生效,并将所有的spark jars上传至 hdfs://ip:9000/somepath/即可
4、spark对于同时运行的作业数目有一定的限制
该限制由参数 "spark.port.maxRetries"决定,该参数默认值为16,表明同一时间运行的作业最多为17个(不是16个),可以进行更改:
vim spark-default.conf 添加
spark.port.maxRetries ${业务所需要的数值}
5、启动spark on yarn 的命令优化
举个栗子:"/spark-shell --master yarn --jars mysql驱动包绝对路径" ,该命令相对较繁琐
vim spark-defaults.conf 添加
spark.executor.extraClassPath mysql驱动包绝对路径
spark.driver.extraClassPath mysql驱动包绝对路径
保存生效,则启动命令变成:“/spark-shell --master yarn”
注:当某个jar包或者某个类找不到的时候,都可以用这种方式手动指定类或jar包的路径
继续简化,vim spark-defaufs.conf 添加
spark.master spark
则启动命令变成:"/spark-shell"
6、直接修改spark.defaults.conf,会对其它spark模式产生影响
可以拷贝一份spark-defaults.conf,重命名后配置个性化参数,然后以命令:
/spark-shell --properties-file ${你拷贝的配置文件绝对路径} 启动
7、命令行传入属性的方法
/spark-shell --master yarn --conf spark.属性 = 值
8、作业最大重试次数
作业最大重试次数默认是等于yarn配置中设置的全局最大重试数,可以进行设置:
spark.yarn.maxAppAttempts=值
但不应该大于yarn设置的全局最大重试次数。