2016-06-28 106 views
5

我試圖設置spark.sql.parquet.output.committer.class,我似乎沒有做任何事情讓設置生效。如何在pyspark中設置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答案和搜索:

  1. sc._jsc.hadoopConfiguration().set(key, val)(這不工作像parquet.enable.summary-metadata設置)
  2. dataframe.write.option(key, val).parquet
  3. 添加--conf "spark.hadoop.spark.sql.parquet.output.committer.class=org.apache.spark.sql.parquet.DirectParquetOutputCommitter"到​​呼叫
  4. --conf "spark.sql.parquet.output.committer.class"=" org.apache.spark.sql.parquet.DirectParquetOutputCommitter"添加到​​調用。

這就是我所能找到的,沒有任何工作。它看起來不難set in Scala,但在Python中似乎不可能。

回答

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 

這是在洪水中失去的日誌信息的火花是付出,我看到的錯誤無關。由於DirectParquetOutputCommitter已經是removed from Spark,所以無論如何都是無關緊要的。

+0

Github問題:https://github.com/apache/spark/pull/12229 – ksindi