2016-06-28 9 views
5

Ich versuche spark.sql.parquet.output.committer.class einzustellen und nichts, was ich tue, scheint die Einstellung zu erhalten, um zu wirken.Wie setze ich spark.sql.parquet.output.committer.class in pyspark

Ich versuche, viele Threads in den gleichen Ausgabeordner zu schreiben, der mit org.apache.spark.sql. parquet.DirectParquetOutputCommitter arbeiten würde, da es den Ordner _temporary nicht verwenden würde. Ich erhalte die folgende Fehlermeldung, das ist, wie ich weiß, dass es nicht funktioniert:

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) 

Hinweis den Aufruf von org.apache.parquet.hadoop.ParquetOutputCommitter.commitJob, die Standardklasse.

ich folgendes versucht haben, basierend auf anderen SO Antworten und sucht:

  1. sc._jsc.hadoopConfiguration().set(key, val) (dies für Einstellungen funktioniert wie 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" zum spark-submit Anruf Hinzufügen
  4. --conf "spark.sql.parquet.output.committer.class"=" org.apache.spark.sql.parquet.DirectParquetOutputCommitter" zum spark-submit Anruf hinzufügen.

Das ist alles, was ich gefunden habe, und nichts funktioniert. Es sieht so aus, als ob es nicht schwer ist, set in Scala erscheint aber unmöglich in Python.

Antwort

2

Der Ansatz in this comment für mich endgültig gearbeitet:

16/06/28 18:49:59 INFO ParquetRelation: Using user defined output committer for Parquet: org.apache.spark.sql.execution.datasources.parquet.DirectParquetOutputCommitter 

Es war in der Flut eine verlorene Protokollmeldung, dass Funken gibt, und den Fehler war ich in keinem Zusammenhang sah. Es ist sowieso egal, da der DirectParquetOutputCommitter removed from Spark war.

+0

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