1. No Space Left on the device(临时文件过多)
今天提交Spark任务时,遇到了
java.io.IOException: No space left on device
的错误,导致任务无法启动。
原因:
Spark计算时,默认会将中间结果、所用到的jar包临时存放到/tmp目录中,当挂载在/tmp目录的磁盘空间不足时,就会报错No Space Left on the device
解决方法:
针对这个问题有两个解决思路:
- 释放挂载/tmp目录的磁盘的空间,比如删除一些该磁盘无用的文件等
- 修改Spark的配置,重新执行临时目录的位置
此时可以选择修改所有节点的Spark配置,或者只对错误信息中出现节点的Spark配置进行修改。
vim $SPAKR_HOME/conf/spark-env.sh
# 修改SPARK_LOCAL_DIRS该属性
# 指定新的目录
export SPARK_LOCAL_DIRS=/opt/app/tmp
2. Executor数量问题
提交Spark任务时,设置了
--num-executors
属性,但是通过8080
端口页面查看执行信息时,发现实际运行executor数量并不是--num-executors
所设定的值。
经过多次修改--num-executors
尝试发现,实际运行executor确实不受--num-executors
控制。
原因:
经过产看官方文档发现--num-executors
该属性只有在YARN模式下有效。
The --num-executors option to the Spark YARN client controls how many executors it will allocate on the cluster
我提交任务的命令为(standalone模式):
bin/spark-submit \
--num-executors 10 \
--master spark://master:7077 --driver-memory 4G --executor-memory 2G \
--deploy-mode client \
--executor-cores 4 \
/opt/app/Application.jar HelloWorld
standalone模式会根据每台worker上分配的cores来确定本节点上需要启动的executor的个数。也就是说某个节点可能会启动2个或多个executor。
解决方法:
这需要两个参数来进行控制:--executor-cores
和total-executor-cores
。
--executor-cores
代表每个executor所占用core数量。
--total-executor-cores
代表所提交应用所占用总core数量。
假设有4台Worker,node1剩余8个core,其他三台剩余3个core,向这个集群提交如下命令:
bin/spark-submit \
--num-executors 10 \
--master spark://master:7077 --driver-memory 4G --executor-memory 2G \
--deploy-mode client \
--executor-cores 2 \
--total-executor-cores 10 \
/opt/app/Application.jar HelloWorld
- 此时会遍历每个Worker,第一轮遍历后,每个Worker否符合启动一个executor,这是已经分配了8个core,每台Worker都运行了一个executor。
- 然后继续遍历可用资源,进行下一轮分配,只有node1可以符合启动executor,于是最后两个core分配到node1上。最后达到了标准的
--total-executor-cores 8
。
这样在node1上有两个executor上运行,而其他节点只有一个executor。
因此standalone模式下,executor的数量主要由--executor-cores
和--total-executor-cores
这两个参数决定。
网友评论