将DAG转换为任务的巨大延迟

时间:2017-01-09 22:30:22

标签: apache-spark amazon-emr apache-spark-2.0

这是我的步骤:

  1. 将spark应用程序提交到EMR群集
  2. 驱动程序启动,我可以看到Spark-ui(尚未创建任何阶段)
  3. 驱动程序从s3读取一个包含~3000个零件的orc文件,进行一些转换并将其保存回s3
  4. 执行保存应该会在spark-ui中创建一些阶段,但这些阶段需要很长时间才能出现在spark-ui
  5. 阶段出现并开始执行
  6. 为什么我在第4步中遇到了这么大的延迟?在此期间,群集显然正在等待某些内容,CPU使用率为0%

    由于

2 个答案:

答案 0 :(得分:2)

尽管它的优点是S3不是一个文件系统,但它使它成为处理复杂二进制格式的次优选择,这些格式通常是在考虑实际文件系统的情况下设计的。在许多情况下,辅助任务(如读取元数据)比实际数据提取更昂贵。

答案 1 :(得分:2)

这可能是3& 4之间的提交过程; Hadoop MR和spark提交者假设重命名是一个O(1)原子操作,并依赖它来进行原子提交工作。在S3上,当涉及目录中的多个文件时,重命名是O(数据)和非原子。 0-CPU负载是赠品:客户端正在等待S3的响应,它在内部以6-10 MB / S进行COPY

HADOOP-13345中正在进行的工作是在S3中进行0重命名提交。现在,您可以从Databricks中寻找有趣但有趣的方式Direct Committer。

还有一件事:确保使用“算法2”进行提交,因为算法1在最终作业主提交中进行了更多的重命名。我在Hadoop 2.7上对ORC / Parquet perf的完整推荐设置是(以及使用s3a:urls):

spark.sql.parquet.filterPushdown true
spark.sql.parquet.mergeSchema false
spark.hadoop.parquet.enable.summary-metadata false

spark.sql.orc.filterPushdown true
spark.sql.orc.splits.include.file.footer true
spark.sql.orc.cache.stripe.details.size 10000

spark.sql.hive.metastorePartitionPruning true
spark.speculation false
spark.hadoop.mapreduce.fileoutputcommitter.algorithm.version 2
spark.hadoop.mapreduce.fileoutputcommitter.cleanup.skipped true