rdd.saveAsTextFile似乎不起作用,但重复抛出FileAlreadyExistsException

时间:2015-08-24 15:03:18

标签: hadoop apache-spark

我试图将数据帧写入磁盘时运行dataFrame.rdd.saveAsTextFile("/home/hadoop/test")。执行时没有错误,但未创建文件夹。此外,当我再次运行相同的命令(在shell中)时抛出异常:

org.apache.hadoop.mapred.FileAlreadyExistsException: Output directory hdfs://ip-xxx-xx-xx-xx.ec2.internal:8020/home/hadoop/feet already exists

知道为什么会这样吗?提交移动(客户端,群集)是否存在影响此问题的细微差别?

编辑:

我有权在/home/hadoop中创建目录,但我无法在rdd.saveAsTextFile("file:/home/hadoop/test")创建的任何目录/子目录中创建目录。结构如下所示:

/home/hadoop/test/_temporary/0

如果我没有从命令行在_temporary内创建目录的权限,那么如何创建0test?有没有办法更改这些创建目录的权限?

EDIT2:

最后我使用rdd.coalesce(1).saveAsTextFile("s3://...")写信给s3。这只有在输出非常小时才可行 - 因为coalesce(n)将导致RDD存在并且仅在n个工作者上进一步处理。在我的例子中,我选择了1个worker,这样文件就会由一个worker生成。这给了我一个包含一个part-00000文件的文件夹,其中包含我的所有数据。

2 个答案:

答案 0 :(得分:4)

由于https://spark-project.atlassian.net/browse/SPARK-1100 saveAsTextFile永远不能以静默方式覆盖现有文件夹。

如果您收到java.io.IOException: Mkdirs failed to create file:...,则可能意味着您在尝试写入输出路径时遇到权限问题。

如果您提供更多上下文信息,答案可能会更有帮助。 喜欢:你在本地shell上运行吗?集群壳?哪种类型的集群?

编辑:我认为你正面临着这个错误,因为所有执行者都试图写入同一条路径,并且所有执行者都无法使用。

答案 1 :(得分:1)

saveAsTextFile有效。它写入默认文件系统(由fs.default.name中的core-site.xml配置)。在这种情况下,默认文件系统为hdfs://ip-xxx-xx-xx-xx.ec2.internal:8020/

如果要写入本地磁盘,请使用saveAsTextFile("file:/home/hadoop/test")。如果Spark群集中有多个节点,则结果将几乎不可用:每个节点都会将RDD的某些部分写入本地磁盘。但是对于测试,这可能没问题。