2016-06-28 31 views
5

Próbuję ustawić spark.sql.parquet.output.committer.class i nic, co robię, nie wydaje się, aby ustawienie zadziałało.Jak ustawić spark.sql.parquet.output.committer.class w pyspark

Próbuję mieć wiele wątków zapisu do tego samego folderu wyjściowego, który będzie działać z org.apache.spark.sql. parquet.DirectParquetOutputCommitter, ponieważ nie będzie używać folderu _temporary. Dostaję następujący błąd, który jak wiem, że to nie działa:

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) 

Uwaga wywołanie org.apache.parquet.hadoop.ParquetOutputCommitter.commitJob klasa domyślna.

Próbowałem następujące, w oparciu o inne tak odpowiedzi i zapytania:

  1. sc._jsc.hadoopConfiguration().set(key, val) (to działa na ustawieniach takich jak parquet.enable.summary-metadata)
  2. dataframe.write.option(key, val).parquet
  3. Dodajesz --conf "spark.hadoop.spark.sql.parquet.output.committer.class=org.apache.spark.sql.parquet.DirectParquetOutputCommitter" na wezwanie spark-submit
  4. Dodawanie --conf "spark.sql.parquet.output.committer.class"=" org.apache.spark.sql.parquet.DirectParquetOutputCommitter" do połączenia spark-submit.

To wszystko, co udało mi się znaleźć, i nic nie działa. Wygląda na to, że nie jest to trudne dla set in Scala, ale wydaje się niemożliwe w Pythonie.

Odpowiedz

2

Podejście w this comment ostatecznie pracował dla mnie:

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

To był zagubiony wiadomość dziennika w powodzi, że Spark daje, a błąd widziałem było niezależne. W każdym razie to wszystko, ponieważ DirectParquetOutputCommitter został removed from Spark.

+0

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