从Spark保存时的镶木地板错误

时间:2015-04-30 06:38:39

标签: apache-spark parquet

Spark 1.3.0 中重新分区 DataFrame 后,在保存到 Amazon的S3 .parquet 异常>

logsForDate
    .repartition(10)
    .saveAsParquetFile(destination) // <-- Exception here

我收到的例外是:

java.io.IOException: The file being written is in an invalid state. Probably caused by an error thrown previously. Current state: COLUMN
at parquet.hadoop.ParquetFileWriter$STATE.error(ParquetFileWriter.java:137)
at parquet.hadoop.ParquetFileWriter$STATE.startBlock(ParquetFileWriter.java:129)
at parquet.hadoop.ParquetFileWriter.startBlock(ParquetFileWriter.java:173)
at parquet.hadoop.InternalParquetRecordWriter.flushRowGroupToStore(InternalParquetRecordWriter.java:152)
at parquet.hadoop.InternalParquetRecordWriter.close(InternalParquetRecordWriter.java:112)
at parquet.hadoop.ParquetRecordWriter.close(ParquetRecordWriter.java:73)
at org.apache.spark.sql.parquet.ParquetRelation2.org$apache$spark$sql$parquet$ParquetRelation2$$writeShard$1(newParquet.scala:635)
at org.apache.spark.sql.parquet.ParquetRelation2$$anonfun$insert$2.apply(newParquet.scala:649)
at org.apache.spark.sql.parquet.ParquetRelation2$$anonfun$insert$2.apply(newParquet.scala:649)
at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:61)
at org.apache.spark.scheduler.Task.run(Task.scala:64)
at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:203)
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)

我想知道问题是什么以及如何解决。

3 个答案:

答案 0 :(得分:4)

在保存到S3时,我可以在EMR上使用Spark 1.3.1重现此问题。

但是,保存到HDFS可以正常工作。您可以先保存到HDFS,然后使用例如s3distcp将文件移动到S3。

答案 1 :(得分:1)

当saveAsParquetFile进入HDFS时,我遇到了这个错误。这是因为datanode socket write timeout,因此我在Hadoop设置中将其更改为更长的一个:

<property>
  <name>dfs.datanode.socket.write.timeout</name>
  <value>3000000</value>
</property>
<property>
  <name>dfs.socket.timeout</name>
  <value>3000000</value>
</property> 

希望如果您能像这样设置S3,这会有所帮助。

答案 2 :(得分:1)

您确定这不是SPARK-6351(&#34;错误的FS&#34;将拼花地板保存到S3时)?如果是,则它与重新分区无关,并且已在spark-1.3.1中修复。然而,如果像我一样,你因为使用CDH-5.4.0而被卡住了Spark-1.3.0,我昨晚想出了一种直接从代码中解决它的方法(没有配置文件更改):

spark.hadoopConfiguration.set("fs.defaultFS", "s3n://mybucket")

之后,我可以毫无问题地将镶木地板文件保存到S3。

但请注意,这有几个缺点。我认为(没有尝试过)它将无法写入另一个FS而不是S3,也可能写入另一个存储桶。它也可能强制Spark将临时文件写入S3而不是本地,但我也没有检查过。