rdd.savastextfile似乎不起作用,但重复会引发filealreadyexistsexception

kmpatx3s  于 2021-06-03  发布在  Hadoop
关注(0)|答案(2)|浏览(642)

我在跑步 dataFrame.rdd.saveAsTextFile("/home/hadoop/test") 试图将Dataframe写入磁盘。执行时不会出错,但不会创建文件夹。此外,当我再次运行同一命令(在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 以及 0 正在创建,如果我没有权限在其中创建目录 test 从命令行?有没有办法更改这些已创建目录的权限?
编辑2:
最后,我改为使用 rdd.coalesce(1).saveAsTextFile("s3://...") . 这只有在输出非常小的情况下才可行,因为 coalesce(n) 将导致rdd存在,并且仅在n个工作人员上进一步处理。在我的例子中,我选择了一个worker,这样文件将由一个worker生成。这给了我一个文件夹 part-00000 包含我所有数据的文件。

envsm3lx

envsm3lx1#

自https://spark-project.atlassian.net/browse/spark-1100 saveastextfile永远不能以静默方式覆盖已存在的文件夹。
如果你收到 java.io.IOException: Mkdirs failed to create file:... 这可能意味着您在尝试写入输出路径时遇到权限问题。
如果你提供更多的上下文信息,答案可能会更有帮助。比如:你是用当地的壳牌公司吗?簇壳?哪种类型的群集?
编辑:我认为您正面临这个错误,因为所有的执行程序都试图写入同一个路径,而这在所有的执行程序上都不可用。

lp0sw83n

lp0sw83n2#

saveAsTextFile 作品。它写入默认文件系统(由 fs.default.name 在你的 core-site.xml ). 在这种情况下,默认的文件系统是 hdfs://ip--xx-xx-xx.ec2.internal:8020/ .
如果要写入本地磁盘,请使用 saveAsTextFile("file:/home/hadoop/test") . 如果spark集群中有多个节点,那么结果大部分是不可用的:每个节点都会将rdd的某些部分写入本地磁盘。但对于测试来说,这可能没问题。

相关问题