我一直试图在集群模式下通过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%开始然后下降,其他节点都是从节点):
上面的图表是通过以下节点获得的:
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 documentation,AWS EMR documentation和this article on Cloudera's blog的建议。
所有这些文章都非常一致地声明Spark不能自动使用资源,并且他们声明你必须告诉他(和YARN)必须使用多少资源。
到目前为止,我的经验是,无论参数和值如何,Spark / Yarn都不关心,CPU使用率图表总是相同(类似于上图所示)。
答案 0 :(得分:1)
听起来你的工作分区有限:如果文件(.gz?)或数据无法拆分,你就不会有任何并行性。
如果你打开inferSchema,那么Spark会读取整个文件,只是为了弄清楚架构是什么,然后返回并重新读取它;这在S3上是(字面上)昂贵的。在安排任何工作之前,火花大师将完成端到端的操作。
要尝试的一件事:将初始作业设置为简单的ETL:load().write().partitionBy("date").format("parquet).save(hdfs://)
,然后将该组分区文件用于将来的工作。多个文件 - >多个工作者,即使文件格式本身不能被拆分。