Apache spark 从Spark保存时发生拼花错误

Apache spark 从Spark保存时发生拼花错误,apache-spark,parquet,Apache Spark,Parquet,在Spark 1.3.0中重新划分了一个数据帧之后,我在保存到Amazon的S3时遇到了一个.parquet异常 我想知道问题出在哪里以及如何解决。我在将一个任务文件保存到HDFS时遇到了这个错误。这是因为数据节点套接字写入超时,因此我在Hadoop设置中将其更改为更长的超时: <property> <name>dfs.datanode.socket.write.timeout</name> <value>3000000</value

在Spark 1.3.0中重新划分了一个数据帧之后,我在保存到Amazon的S3时遇到了一个.parquet异常


我想知道问题出在哪里以及如何解决。

我在将一个任务文件保存到HDFS时遇到了这个错误。这是因为数据节点套接字写入超时,因此我在Hadoop设置中将其更改为更长的超时:

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

dfs.datanode.socket.write.timeout
3000000
dfs.socket.timeout
3000000

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

在保存到S3时,我可以通过EMR上的Spark 1.3.1重现这个问题


但是,保存到HDFS效果很好。您可以先保存到HDFS,然后使用例如s3distcp将文件移动到S3。

您确定这不是由于将拼花地板保存到S3时出现“错误的FS”造成的吗?如果是,那么它与重新分区无关,它已在spark-1.3.1中修复。但是,如果你像我一样,因为使用CDH-5.4.0而被spark-1.3.0困住了,我昨晚刚刚想出了一种直接从代码中绕过它的方法(无需更改配置文件):

在那之后,我可以毫无问题地将拼花地板文件保存到S3


但是,请注意,这有几个缺点。我认为(没有尝试)它将无法写入S3以外的其他FS,也可能无法写入另一个bucket。它还可能迫使Spark将临时文件写入S3,而不是本地,但我也没有检查过这一点。

似乎没有任何等效的设置s3n@Interfector,请检查工作日志,并查找是否有有用的消息。稍后我会删除答案提供的stacktrace是我能找到的唯一一条信息。@Intervector,请检查s3n数据节点日志。在主设备和从设备上运行
grep-lir“正在写入的文件处于无效状态”/mnt
,但没有成功。您是每次还是偶尔都会收到错误?对于较小的文件也有吗?您是否也只在S3或其他文件系统上获得它?你试过ApacheSpark 1.3.1吗?提到一些与拼花地板相关的修复。当在某个文件大小以上工作时,我总是会遇到错误。我只试过S3。我已经尝试了1.3.0.d。我能够在EMR上用Spark 1.3.1重现这个错误,并写入S3。使用旧的拼花api(sqlContext.setConf(“spark.sql.Parquet.useDataSourceApi”,“false”)没有帮助。写HDFS很好。你试过在美国西部1区使用水桶吗?或使用emfrs@Interfector我们相信你能解决这个问题。我也有同样的问题,但我更喜欢直接保存到S3的解决方案。您可以在CDH5.4上运行Spark 1.3.1或1.4.0。只需像其他听起来很棒的应用程序一样运行它。你是怎么做到的?我试图在build.sbt中更改spark版本,但它失败了。我们使用CDH的原因之一是为了避免依赖项的不兼容版本带来的麻烦。我不确定这不是因为这个原因,但我已经尝试使用Spark 1.3.1,但它不起作用。
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)
<property>
  <name>dfs.datanode.socket.write.timeout</name>
  <value>3000000</value>
</property>
<property>
  <name>dfs.socket.timeout</name>
  <value>3000000</value>
</property> 
spark.hadoopConfiguration.set("fs.defaultFS", "s3n://mybucket")