【问题标题】:Slow or incomplete saveAsParquetFile from EMR Spark to S3从 EMR Spark 到 S3 的 saveAsParquetFile 缓慢或不完整
【发布时间】:2015-12-05 00:57:24
【问题描述】:

我有一段代码创建一个DataFrame 并将其持久化到 S3。下面创建一个包含 1000 行和 100 列的 DataFrame,由 math.Random 填充。我在具有 4 x r3.8xlarge 工作节点的集群上运行它,并配置了大量内存。我尝试了最大数量的执行器,每个节点一个执行器。

// create some random data for performance and scalability testing
val df = sqlContext.range(0,1000).map(x => 
             Row.fromSeq((1 to 100).map(y => math.Random)))

df.saveAsParquetFile("s3://kirk/my_file.parquet")

我的问题是我可以在内存中创建一个比保存到 S3 更大的DataFrame

例如,可以构造和查询10亿行1000列,但是当我以这种方式写入S3时,1亿行和100列失败。我没有从 Spark 上下文中收到很好的消息,但是作业会失败,因为太多任务失败了。

是否有一些配置可以更有效地保存文件?为了saveAsParquetFile,我应该对 Spark 进行不同的配置吗?

这是来自执行程序的堆栈跟踪:

15/09/09 18:10:26 ERROR sources.InsertIntoHadoopFsRelation: Aborting task.
java.lang.OutOfMemoryError: Java heap space
    at parquet.column.values.dictionary.IntList.initSlab(IntList.java:87)
    at parquet.column.values.dictionary.IntList.<init>(IntList.java:83)
    at parquet.column.values.dictionary.DictionaryValuesWriter.<init>(DictionaryValuesWriter.java:85)
    at parquet.column.values.dictionary.DictionaryValuesWriter$PlainIntegerDictionaryValuesWriter.<init>(DictionaryValuesWriter.java:549)
    at parquet.column.ParquetProperties.getValuesWriter(ParquetProperties.java:88)
    at parquet.column.impl.ColumnWriterImpl.<init>(ColumnWriterImpl.java:74)
    at parquet.column.impl.ColumnWriteStoreImpl.newMemColumn(ColumnWriteStoreImpl.java:68)
    at parquet.column.impl.ColumnWriteStoreImpl.getColumnWriter(ColumnWriteStoreImpl.java:56)
    at parquet.io.MessageColumnIO$MessageColumnIORecordConsumer.<init>(MessageColumnIO.java:178)
    at parquet.io.MessageColumnIO.getRecordWriter(MessageColumnIO.java:369)
    at parquet.hadoop.InternalParquetRecordWriter.initStore(InternalParquetRecordWriter.java:108)
    at parquet.hadoop.InternalParquetRecordWriter.<init>(InternalParquetRecordWriter.java:94)
    at parquet.hadoop.ParquetRecordWriter.<init>(ParquetRecordWriter.java:64)
    at parquet.hadoop.ParquetOutputFormat.getRecordWriter(ParquetOutputFormat.java:282)
    at parquet.hadoop.ParquetOutputFormat.getRecordWriter(ParquetOutputFormat.java:252)
    at org.apache.spark.sql.parquet.ParquetOutputWriter.<init>(newParquet.scala:83)
    at org.apache.spark.sql.parquet.ParquetRelation2$$anon$4.newInstance(newParquet.scala:229)
    at org.apache.spark.sql.sources.DefaultWriterContainer.initWriters(commands.scala:470)
    at org.apache.spark.sql.sources.BaseWriterContainer.executorSideSetup(commands.scala:360)
    at org.apache.spark.sql.sources.InsertIntoHadoopFsRelation.org$apache$spark$sql$sources$InsertIntoHadoopFsRelation$$writeRows$1(commands.scala:172)
    at org.apache.spark.sql.sources.InsertIntoHadoopFsRelation$$anonfun$insert$1.apply(commands.scala:160)
    at org.apache.spark.sql.sources.InsertIntoHadoopFsRelation$$anonfun$insert$1.apply(commands.scala:160)
    at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:63)
    at org.apache.spark.scheduler.Task.run(Task.scala:70)
    at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:213)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:745)

【问题讨论】:

  • 执行程序/容器日志中的错误说明是什么?如果日志中没有错误,节点管理器是否由于执行器超出内存而为执行器杀死了容器?
  • @ChristopherB 使用执行程序日志更新了问题。 Java 堆内存不足。但是我该如何配置呢?

标签: amazon-s3 apache-spark amazon-emr parquet apache-spark-1.4


【解决方案1】:

我认为您需要重新分区您的数据帧(您应该至少有 numberOfWorkerInstances * numberOfCoresOnEachInstance 分区数)以允许并行写入 S3。

【讨论】:

  • 我已经尝试过了,但没有产生影响。数据框已经分区,所以这不应该是一个因素。
  • 失败的执行者的日志显示了哪些异常?
  • 我正在考虑每个执行者的 /home/hadoop/spark/work 下的日志
  • 我已使用执行程序日志更新了问题。如何配置 Java 堆大小?
  • 您需要使用spark.executor.memory=183g 配置 spark(r3.8xlarge 实例有 244GB 内存,经验法则说您应该分配最多 75% 的可用内存,因此为 183G)。如果您使用 spark-submit 开始您的工作,您只需将 --executor-memory 183G 添加到您的命令中。
猜你喜欢
  • 2016-05-16
  • 2015-11-27
  • 2020-06-19
  • 2017-08-06
  • 1970-01-01
  • 2018-02-16
  • 2018-03-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多