tldr:呼叫 saveAsTextFile
在 rdd
失败于 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>
添加了正确的 jars
至 spark-default.conf
与 spark.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错误配置吗?
暂无答案!
目前还没有任何答案,快来回答吧!