我正在运行一个Spark作业,每个文件有3个100MB大小的文件,由于某种原因,我的Spark UI会将所有数据集集中到2个执行器中,这使该作业运行了19个小时并且仍在运行。
下面是我的 Spark 配置。 spark 2.3是使用的版本。
spark2-submit --class org.mySparkDriver \
--master yarn-cluster \
--deploy-mode cluster \
--driver-memory 8g \
--num-executors 100 \
--conf spark.default.parallelism=40 \
--conf spark.yarn.executor.memoryOverhead=6000mb \
--conf spark.dynamicAllocation.executorIdleTimeout=6000s \
--conf spark.executor.cores=3 \
--conf spark.executor.memory=8G \
我尝试在有效的代码内重新分区,因为这使文件进入20个分区(我使用rdd.repartition(20))。但是我为什么要重新分区,我相信在脚本中指定spark.default.parallelism = 40应该可以让spark将输入文件划分为40个执行器,并在40个执行器中处理该文件。
谁能帮忙。
谢谢,
内图
最佳答案
如果是的话,我假设您正在YARN中运行作业,则可以检查以下属性。
yarn.scheduler.maximum-allocation-mb
yarn.nodemanager.resource.memory-mb
yarn.scheduler.maximum-allocation-vcores
yarn.nodemanager.resource.cpu-vcores
在YARN中,这些属性会影响可基于
spark.executor.cores, spark.executor.memory
属性值在NodeManager中实例化的容器数(以及执行程序的内存开销)。例如,如果一个群集具有10个节点(RAM:16 GB,核心:6),并设置了以下 yarn 属性
yarn.scheduler.maximum-allocation-mb=10GB
yarn.nodemanager.resource.memory-mb=10GB
yarn.scheduler.maximum-allocation-vcores=4
yarn.nodemanager.resource.cpu-vcores=4
然后使用spark属性
spark.executor.cores=2, spark.executor.memory=4GB
,您可以期望得到2
Executors / Node,因此总计您将获得19个执行程序+ 1个驱动程序容器如果spark属性为
spark.executor.cores=3, spark.executor.memory=8GB
,则您将获得9个执行程序(仅1个执行程序/节点)+1个驱动程序容器您可以引用link了解更多详细信息
希望这可以帮助
关于apache-spark - Spark:整个数据集中在一个执行器中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58512262/