我使用带有Pyspark(1.6.0)和Yarn(包括MR2)的quickstart cloudera VM(CDH 5.10.1)来聚合每小时的数字数据。我有一个4核的CPU和32 Go的RAM。
我有一个名为aggregate.py的文件,但直到今天我从未使用spark-submit
提交过作业,我使用了pyspark
交互式shell并复制/粘贴代码来测试它。当启动pyspark交互式shell时,我使用了:
pyspark --master yarn-client
我在quickstart.cloudera:808/cluster上查看了web UI中的处理,可以看到Yarn创建了3个执行器和1个驱动程序,每个驱动程序都有一个核心(这不是一个好的配置,但主要目的是进行概念验证,直到我们移到一个真正的集群)
当提交与spark提交相同的代码时:
spark-submit --verbose
--master yarn
--deploy-mode client
--num-executors 2
--driver-memory 3G
--executor-memory 6G
--executor-cores 2
aggregate.py
我只有驱动程序,它也执行任务。请注意,spark.dynamicAllocation.enabled
在环境选项卡中设置为true,spark.dynamicAllocation.minExecutors
设置为2。
我试着只使用spark-submit aggregate.py
,但仍然只得到了作为执行器的驱动程序。我不能用spark提交超过1个执行器,但它在spark交互式shell中工作!
我的纱线配置如下:
yarn.nodemanager.resource.memory-mb
=17 GiB
yarn.nodemanager.resource.cpu-vcores
=4
yarn.scheduler.minimum-allocation-mb
=3 GiB
yarn.scheduler.maximum-allocation-mb
=16 GiB
yarn.scheduler.minimum-allocation-vcores
=1
yarn.scheduler.maximum-allocation-vcores
=2
如果有人能解释我做错了什么,那将是一个很大的帮助!
您必须将驱动程序内存和执行程序内存设置为spark-defaults.conf。它位于
$SPARK_HOME/conf/SPARK-defaults.conf
并且如果存在类似的文件
spark-defaults.conf.template
然后您必须将文件重命名为
spark-defaults.conf
,然后设置执行器的数量、执行器内存、执行器内核的数量。你可以从模板文件中得到这个例子,或者检查这个链接
https://spark.apache.org/docs/latest/configuration.html.
或
当我们使用pyspark时,它使用了默认的执行器内存,但在spark-submit中,您将执行器内存设置为6G。我认为你必须减少内存或删除这个字段,这样它才能使用默认内存。
只是一个猜测,正如您之前所说的"Yarn创建了3个执行器和1个驱动程序,每个驱动程序都有一个内核",所以您总共有4个内核。
现在根据您的spark提交声明,
cores = num-executors 2 * executor-cores 2 + for_driver 1 = 5
#but in total you have 4 cores. So it is unable to give you executors(as after driver only 3 cores left)
#Check if this is the issue.