pyspark saveastextfile在Dataframe编写器成功时失败

yshpjwxd  于 2021-06-02  发布在  Hadoop
关注(0)|答案(0)|浏览(268)

tldr:呼叫 saveAsTextFilerdd 失败于 FileOutputCommitter 通过从Dataframe保存时找不到 write.format(...).save(...) 工作和利用 FileOutputCommitter . 这个问题似乎与环境有关,因为我可以在一个环境(本地)中执行此操作,但可能无法在类似的环境(aws emr)中执行。据我所知,配置是一样的。
脚本:
本地安装spark 2.0(通过自制)和hadoop 2.7.2(通过自制)
带spark 2.0和hadoop 2.7.2的aws emr 5.0群集
被改进的 mapred-site.xml 包括:

<property>
    <name>mapreduce.fileoutputcommitter.algorithm.version</name>
    <value>2</value>
</property>
<property>
    <name>spark.hadoop.mapred.output.committer.class</name>
    <value>org.apache.hadoop.mapred.FileOutputCommitter.class</value>
</property>
<property>
    <name>mapred.output.committer.class</name>
     <value>org.apache.hadoop.mapred.FileOutputCommitter.class</value>
</property>

添加了正确的 jarsspark-default.confspark.driver.extraClassPath 以及 spark.executor.extraClassPath . 此设置在spark web ui的“环境”选项卡中确认。
problem repro local(os x)工作正常:

In [2]: df = [tuple(range(3))]

In [3]: df = spark.createDataFrame([tuple(range(3))], ['one', 'two', 'three'])

In [4]: df.show()
+---+---+-----+
|one|two|three|
+---+---+-----+
|  0|  1|    2|
+---+---+-----+

In [5]: df.rdd.saveAsTextFile('test_output.txt')

In [6]: df.write.format('csv').save('test_output.csv')

问题报告:

>>> df = spark.createDataFrame([tuple(range(3))], ['one', 'two', 'three'])
>>> df.show()
+---+---+-----+
|one|two|three|
+---+---+-----+
|  0|  1|    2|
+---+---+-----+

>>> df.write.format('csv').save('test_output.csv')
>>> df.rdd.saveAsTextFile('test_output.txt')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/spark/python/pyspark/rdd.py", line 1519, in saveAsTextFile
    keyed._jrdd.map(self.ctx._jvm.BytesToString()).saveAsTextFile(path)
  File "/usr/lib/spark/python/lib/py4j-0.10.1-src.zip/py4j/java_gateway.py", line 933, in __call__
  File "/usr/lib/spark/python/pyspark/sql/utils.py", line 63, in deco
    return f(*a,**kw)
  File "/usr/lib/spark/python/lib/py4j-0.10.1-src.zip/py4j/protocol.py", line 312, in get_return_value
py4j.protocol.Py4JJavaError: An error occurred while calling o72.saveAsTextFile.
: java.lang.RuntimeException: java.lang.RuntimeException: java.lang.ClassNotFoundException: Class org.apache.hadoop.mapred.FileOutputCommitter.class not found

我的直觉是,这两个场景之间的配置不同。emr上的dataframe save调用正在使用 FileOutputCommitter 如日志所示 jar 正确提供。在引擎盖下 saveAsTextFile 电话 saveAsHadoopFile 我不确定Dataframe编写器是否会这样做。
有人知道我应该在哪里寻求帮助吗 saveAsTextFile 查找提供的 jar ? 这是一个不明显的hadoop错误配置吗?

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题