Spark遇到的问题

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
解决方法:
针对这个问题有两个解决思路:

  1. 释放挂载/tmp目录的磁盘的空间,比如删除一些该磁盘无用的文件等
  2. 修改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-corestotal-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
  1. 此时会遍历每个Worker,第一轮遍历后,每个Worker否符合启动一个executor,这是已经分配了8个core,每台Worker都运行了一个executor。
  2. 然后继续遍历可用资源,进行下一轮分配,只有node1可以符合启动executor,于是最后两个core分配到node1上。最后达到了标准的--total-executor-cores 8

这样在node1上有两个executor上运行,而其他节点只有一个executor。
因此standalone模式下,executor的数量主要由--executor-cores--total-executor-cores这两个参数决定。

你可能感兴趣的:(Spark遇到的问题)