1、spark on yarn有两种模式,一种是cluster模式,一种是client模式。
a.执行命令“./spark-shell --master yarn”默认运行的是client模式。
b.执行"./spark-shell --master yarn-client"或者"./spark-shell --master yarn --deploy-mode client"运行的也是client。
c.执行"./spark-shell --master yarn-cluster"或者"./spark-shell --master yarn --deploy-mode cluster"运行的是cluster模式。
##但是,以上两个启动cluster模式的命令是不可用的,这就牵涉到这两种模式的区别。
d.client和cluster模式的主要区别在于,前者的driver是运行在客户端进程中,后者的driver是运行在NodeManager的ApplicationMaster之中。我们知道,driver是负责分发作业的,运行在ApplicationMaster里的driver是无法直接与客户端进行通信的,故而c中所提到的两条命令不可用。
##对应的spark-sql中的一些命令也是不可用的。
注:生产上我们通常使用spark on yarn-cluster模式,由于client模式的driver在客户端上,客户端可能与executor不在同一局域网,他们之间的通信会很慢。
2、spark on yarn的两种模式的详细介绍
3、提交作业的方式
./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 #传入类中所需要的参数
4、提交作业时yarn会将spark jars分发到yarn的container中,这十分耗费资源,故而我们可以将spark jars放在一个yarn可以访问到的目录中,具体做法如下:
vi spark-default.cong 添加
spark.yarn.jars hdfs://ip:8021/somepath/*
保存生效,并将所有的spark jars上传至hdfs://ip:9000/somepath/即可。
4所说的是一个调优点哦
5、spark对于同时运行的作业数目有一定的限制,该限制由参数"spark.port.maxRetries"决定,该参数默认值为16,表明同一时间运行的作业最多为17个(不是16个哦),生产上16肯定太小,我们可以更改这一数字,具体做法如下:
vi spark-default.cong 添加
spark.port.maxRetries ${业务所需要的数值}
6、启动spark on yarn的命令:“/spark-shell --master yarn --jars mysql驱动包绝对路径”
是不是超级麻烦,来来来,大佬帮你们简化
vi spark-defaults.cong 添加
spark.executor.extraClassPath mysql驱动包绝对路径
spark.driver.extraClassPath mysql驱动包绝对路径
保存生效,则启动命令变成:“/spark-shell --master yarn ”
####当某个jar包啊或者某个类找不到的时候,都可以用这种方式手动指定类或jar包的路径
继续简化,vi spark-defaults.cong
该配置文件中有一行“#spark.master local[3]”,将#去掉,将local[3]改成yarn即可。
保存生效,则启动命令变成:“/spark-shell ”
7、但是,6中这种对于spark-defaults.conf的修改,会作用于其他的spark模式,这样容易产生一些问题。
那怎么做呢?
我们可以将spark-defaults.conf.template拷贝一份(当然啦,你拷贝spark-defaults.conf也行,只要spark-defaults.conf这个配置文件定义生效的参数你用的到),你命名成什么名字都行,接着在该配置文件中个性化定义你的属性。然后以命令“/spark-shell --properties-file ${你拷贝的配置文件绝对路径}”即可。
8、另一种传入属性的方法:
“/spark-shell --master yarn --conf spark.属性=值”
9、其他重要的属性
spark.yarn.maxAppAttempts
该属性用来设置作业最大重试次数,它不应该大于yarn配置中设置的全局最大重试数。默认是等于的。