无法让Spark在AWS EMR上使用超过百分之几的资源

时间:2018-04-07 14:57:43

标签: apache-spark yarn amazon-emr

我一直试图在集群模式下通过AWS EMR和YARN运行Spark作业,并且没有任何设置组合导致作业最多使用可用总资源的几个百分点。

val queries =  spark.read.format("csv")
  .option("header", "true")
  .option("inferSchema", "true")
  .load("input_file.csv")
  .rdd

val result = queries.map(q => doSomethingWith(q))

以下是所有节点的典型CPU使用情况图表(主节点是从20%开始然后下降,其他节点都是从节点):

enter image description here

上面的图表是通过以下节点获得的:

Master: 1x r4.2xlarge (8 cores,  61GB RAM)
Slaves: 4x r4.8xlarge (32 cores, 244GB RAM)

使用以下设置运行:

spark-submit --deploy-mode cluster --class Run --master yarn s3://app.jar

Classification      Property                                Value
spark               maximizeResourceAllocation              true
spark-defaults      spark.executor.cores                    10
spark-defaults      spark.dynamicAllocation.enabled         true
spark-defaults      spark.executor.instances                12
spark-defaults      spark.executor.memory                   76g
yarn-site           yarn.nodemanager.resource.memory-mb     245760
yarn-site           yarn.nodemanager.resource.cpu-vcores    30

我试图遵循所有典型的建议,包括Spark's documentationAWS EMR documentationthis article on Cloudera's blog的建议。

所有这些文章都非常一致地声明Spark不能自动使用资源,并且他们声明你必须告诉他(和YARN)必须使用多少资源。

到目前为止,我的经验是,无论参数和值如何,Spark / Yarn都不关心,CPU使用率图表总是相同(类似于上图所示)。

1 个答案:

答案 0 :(得分:1)

听起来你的工作分区有限:如果文件(.gz?)或数据无法拆分,你就不会有任何并行性。

如果你打开inferSchema,那么Spark会读取整个文件,只是为了弄清楚架构是什么,然后返回并重新读取它;这在S3上是(字面上)昂贵的。在安排任何工作之前,火花大师将完成端到端的操作。

要尝试的一件事:将初始作业设置为简单的ETL:load().write().partitionBy("date").format("parquet).save(hdfs://),然后将该组分区文件用于将来的工作。多个文件 - >多个工作者,即使文件格式本身不能被拆分。