公司最近的spark集群由原来的standalone迁移到spark on yarn了,在迁移相关的程序时,发现调整还是有一些的,以下分别是两个版本提交的部分shell命令,从命令可以看出其区别,这个区别主要是spark on yarn的工作方式不太一样,造成提交的方式也不太一样。
standalone方式的脚本为:
spark-submit --class com.bg.tools.WapJoinUA --driver-memory 80g --executor-memory 60g --total-executor-cores 256 ${COMMON_PATH}/jars/${APP_JAR} ${HDFS_UATAG_INPUT} ${HDFS_INSTANCE_INPUT} ${TAGS_FILTER_FILE} ${HDFS_OUTPUT} 100
yarn-cluster方式的脚本为:
spark-submit --queue dc
--class bg.tools.Instance --master yarn-cluster --executor-memory 30g --driver-memory 10g --num-executors 200
--executor-cores 16 ${COMMON_PATH}/jars/${APP_JAR} ${HDFS_INSTANCE_INPUT} ${HDFS_OUTPUT}
碰到的问题其中一个就是文件读写的方法不一致, standalone由于driver是固定的, 读取文件类似本地读取,但是yarn-cluster的driver是yarn进行分配的,需要把文件使用--files进行上传,而且在读取文件的时候,应该只能使用文件的名称而不是包含全部路径的文件名,不然会抛出文件找不到的异常,另外比较有用的是这个选项:--conf "spark.hadoop.mapreduce.input.fileinputformat.split.minsize=1073741824"
一般hadoop默认的块是64M,这个可以调整split的大小,以免切分成太多小文件。