我正在尝试设置spark.sql.parquet.output.committer.class而我所做的一切似乎都没有让设置生效。
我正在尝试将多个线程写入同一个输出文件夹,这可以与org.apache.spark.sql.
parquet.DirectParquetOutputCommitter
一起使用,因为它不会使用_temporary
文件夹。我收到以下错误,这就是我知道它不起作用的方式:
Caused by: java.io.FileNotFoundException: File hdfs://path/to/stuff/_temporary/0/task_201606281757_0048_m_000029/some_dir does not exist.
at org.apache.hadoop.hdfs.DistributedFileSystem.listStatusInternal(DistributedFileSystem.java:795)
at org.apache.hadoop.hdfs.DistributedFileSystem.access$700(DistributedFileSystem.java:106)
at org.apache.hadoop.hdfs.DistributedFileSystem$18.doCall(DistributedFileSystem.java:853)
at org.apache.hadoop.hdfs.DistributedFileSystem$18.doCall(DistributedFileSystem.java:849)
at org.apache.hadoop.fs.FileSystemLinkResolver.resolve(FileSystemLinkResolver.java:81)
at org.apache.hadoop.hdfs.DistributedFileSystem.listStatus(DistributedFileSystem.java:849)
at org.apache.hadoop.mapreduce.lib.output.FileOutputCommitter.mergePaths(FileOutputCommitter.java:382)
at org.apache.hadoop.mapreduce.lib.output.FileOutputCommitter.mergePaths(FileOutputCommitter.java:384)
at org.apache.hadoop.mapreduce.lib.output.FileOutputCommitter.commitJob(FileOutputCommitter.java:326)
at org.apache.parquet.hadoop.ParquetOutputCommitter.commitJob(ParquetOutputCommitter.java:46)
at org.apache.spark.sql.execution.datasources.BaseWriterContainer.commitJob(WriterContainer.scala:230)
at org.apache.spark.sql.execution.datasources.InsertIntoHadoopFsRelation$$anonfun$run$1.apply$mcV$sp(InsertIntoHadoopFsRelation.scala:151)
请注意对org.apache.parquet.hadoop.ParquetOutputCommitter.commitJob
的调用,默认类。
我根据其他SO答案和搜索尝试了以下内容:
sc._jsc.hadoopConfiguration().set(key, val)
(这适用于parquet.enable.summary-metadata
)dataframe.write.option(key, val).parquet
--conf "spark.hadoop.spark.sql.parquet.output.committer.class=org.apache.spark.sql.parquet.DirectParquetOutputCommitter"
添加到spark-submit
来电--conf "spark.sql.parquet.output.committer.class"=" org.apache.spark.sql.parquet.DirectParquetOutputCommitter"
添加到spark-submit
来电。这就是我所能找到的,而且没有任何作用。看起来set in Scala并不难,但在Python中似乎不可能。
答案 0 :(得分:2)
this comment中的方法最终对我有用:
16/06/28 18:49:59 INFO ParquetRelation: Using user defined output committer for Parquet: org.apache.spark.sql.execution.datasources.parquet.DirectParquetOutputCommitter
这是Spark给出的洪水中丢失的日志消息,我看到的错误是无关的。无论如何,这一切都没有用,因为DirectParquetOutputCommitter已经removed from Spark。