1 启动方式
- 执行命令
默认运行的是client模式。./spark-shell --master yarn
- 执行
或者./spark-shell --master yarn-client
运行的也是client。./spark-shell --master yarn --deploy-mode client
- 执行
或者./spark-shell --master yarn-cluster
运行的是cluster模式。(自己是是可行吗?后面讲解)./spark-shell --master yarn --deploy-mode cluster
2 spark.yarn.jars参数
spark on yarn模式,默认情况下会读取spark本地的jar包(再jars目录下)分配到yarn的containers中,我们可以观察使用spark-shell启动时的日志:
18/04/21 09:31:45 WARN Client: Neither spark.yarn.jars nor spark.yarn.archive is set, falling back to uploading libraries under SPARK_HOME.
18/04/21 09:32:04 INFO Client: Uploading resource file:/tmp/spark-a02aba59-216a-4f48-90ad-1feac7ef3ca3/__spark_libs__1710985531662084339.zip -> hdfs://192.168.137.130:9000/user/hadoop/.sparkStaging/application_1524244764594_0002/__spark_libs__1710985531662084339.zip
18/04/21 09:32:11 INFO Client: Uploading resource file:/tmp/spark-a02aba59-216a-4f48-90ad-1feac7ef3ca3/__spark_conf__9148717454674942843.zip -> hdfs://192.168.137.130:9000/user/hadoop/.sparkStaging/application_1524244764594_0002/__spark_conf__.zip
这样每次启动会很慢,读取很多东西,可以通过spark.yarn.jars参数指定放在hdfs上;
调优
官网提供了一个参数
spark.yarn.jars
默认是没有设置的,我们看看官网给我们的解释:
默认情况下会把Spark中的jars目录里面的jar包通过本地上传,但是这样不能达到一个公用的效果每次提交job都要去从本地上传,所有我们可以设置全局的把它放置在一个公用的地方这样每次应用程序运行时都不需要分发它。例如,要指向HDFS上的jar,请将此配置设置为hdfs:/// some / path。 可以共用。
把jars目录下的jar包上传到hdfs
[[email protected] spark-2.2.0-bin-2.6.0-cdh5.7.0]$ hdfs dfs -mkdir -p /spark/jars
[[email protected] spark-2.2.0-bin-2.6.0-cdh5.7.0]$ hdfs dfs -put jars/ /spark/jars
conf目录下:
vi spark-defaults.conf
spark.yarn.jars hdfs:///spark/jars/jars/*
注意: hdfs:///spark/jars/jars/* 如果不加/*就会报错的。
3 简化启动spark on yarn的命令
启动spark on yarn的命令:
spark-shell --master yarn --jars mysql驱动包绝对路径
感觉是不是很麻烦,可以修改conf目录下的spark-defaults.conf配置文件。
官方参数:所有参数我们都可以去官网查找,其实最全的还是在源码中我们的
SparkSubmitArguments
这个类。有兴趣的同学可以去源码中看看。
添加下面配置:
spark.executor.extraClassPath mysql驱动包绝对路径
spark.driver.extraClassPath mysql驱动包绝对路径
spark.master yarn
这里executor和driver都要加,因为我们通过--jars设置的话,默认是给我们加到executor和driver,所以都要同时加,否则会把找不到驱动的错误
注意:
- 当某个jar包啊或者某个类找不到的时候,都可以用这种方式手动指定类或jar包的路径。
- 如果设置spark.master local[2] 即为local模式。
- 如果不想再spark-defaults.conf配置文件文件中加入jar包,可以直接丢入jars目录下(个人感觉应该没啥区别)。
- 某些版本可能存在问题,一般executor,driver要同时设置,要不然可能报错。
4 自定义配置文件
对于3上面说的修改spark-defaults.conf大家有什么想法呢?
首相spark-defaults.conf是一个全局的配置文件,要是存在多个业务线该怎么办呢?,这时候我们可以使用
--properties-file
参数可以根据不同的业务线自定义配置文件,如果没有设置该参数那么就通过spark-defaults.conf这个配置文件中去查找。(实现原理就是scala中的默认参数default)
cp spark-defaults.conf spark-yarn.conf
进行修改
执行:
spark-shell --properties-file /opt/software/spark-2.2.0-bin-2.6.0-cdh5.7.0/conf/spark-yarn.conf
5 spark.port.maxRetries
spark对于同时运行的作业数目是有限制,该限制由参
spark.port.maxRetries
决定,该参数默认值为16,表明同一时间运行的作业最多为17个我们可以更改这一数字,具体做法如下:
vi spark-default.cong 添加
spark.port.maxRetries ${业务所需要的数值}
6 自定义属性
/spark-shell --master yarn --conf spark.属性=值
注意: 这里必须以spark开头,有兴趣的小伙伴可以到源码中找到答案。
7 spark.yarn.maxAppAttempts
该属性用来设置作业最大重试次数。默认情况应该是偏小的适当放大