【问题标题】:Deleting file/folder from Hadoop从 Hadoop 中删除文件/文件夹
【发布时间】:2013-05-23 17:42:14
【问题描述】:

我正在分析日志文件的数据管道内运行 EMR 活动,当我的管道失败时出现以下错误:

Exception in thread "main" org.apache.hadoop.mapred.FileAlreadyExistsException: Output directory hdfs://10.208.42.127:9000/home/hadoop/temp-output-s3copy already exists
    at org.apache.hadoop.mapred.FileOutputFormat.checkOutputSpecs(FileOutputFormat.java:121)
    at org.apache.hadoop.mapred.JobClient$2.run(JobClient.java:944)
    at org.apache.hadoop.mapred.JobClient$2.run(JobClient.java:905)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAs(Subject.java:396)
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1132)
    at org.apache.hadoop.mapred.JobClient.submitJobInternal(JobClient.java:905)
    at org.apache.hadoop.mapred.JobClient.submitJob(JobClient.java:879)
    at org.apache.hadoop.mapred.JobClient.runJob(JobClient.java:1316)
    at com.valtira.datapipeline.stream.CloudFrontStreamLogProcessors.main(CloudFrontStreamLogProcessors.java:216)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.apache.hadoop.util.RunJar.main(RunJar.java:187)

如何从 Hadoop 中删除该文件夹?

【问题讨论】:

    标签: hadoop amazon-web-services amazon-s3 elastic-map-reduce


    【解决方案1】:

    当您说从 Hadoop 中删除时,您实际上是指从 HDFS 中删除。

    要从 HDFS 中删除某些内容,请执行以下两项操作之一

    从命令行:

    • 不推荐使用的方式:

    hadoop dfs -rmr hdfs://path/to/file

    • 新方法(使用 hadoop 2.4.1):

    hdfs dfs -rm -r hdfs://path/to/file

    或者来自java:

    FileSystem fs = FileSystem.get(getConf());
    fs.delete(new Path("path/to/file"), true); // delete file, true for recursive 
    

    【讨论】:

    • 路径/到/文件是“10.208.42.127:9000/home/hadoop/temp-output-s3copy”?谢谢!
    • 我还没有测试过。我的问题是我应该使用“10.208.42.127:9000/home/hadoop/temp-output-s3copy”作为路径/到/文件吗?
    • 通常您只需指定 hdfs://home/hadoop/temp-output-s3copy,因为 hdfs 上的文件通常会复制到多个节点。您是在单个节点上执行此操作吗?
    • 好吧,如果这个文件夹在 HDFS 上,那么它应该可以工作。尽管您提供的路径让我认为它根本不在 HDFS 上,而只是一个本地文件夹。你是通过命令行还是 java 来做这个?
    • 我正在通过命令行创建管道,但我的 loganalyzer 是用 Java 完成的
    【解决方案2】:

    要从 hdfs 中删除文件,您可以使用以下给定命令:

    hadoop fs -rm -r -skipTrash /path_to_file/file_name
    

    要从 hdfs 中删除文件夹,您可以使用以下给定命令:

    hadoop fs -rm -r -skipTrash /folder_name
    

    您需要使用 -skipTrash 选项,否则会提示错误。

    【讨论】:

      【解决方案3】:

      使用 Scala:

      val fs:FileSystem = FileSystem.get(new URI(filePath), sc.hadoopConfiguration);
      fs.delete(new Path(filePath), true) // true for recursive
      

      sc 是 SparkContext

      【讨论】:

      • 正是我想要的:包括递归标志和来自 sparkContext。
      【解决方案4】:

      要从 hdfs 中删除文件,请使用以下命令: hadoop fs -rm -r /FolderName

      【讨论】:

        【解决方案5】:

        我联系了 AWS 支持,问题似乎在于我正在分析的日志文件非常大,这造成了内存问题。我在 EMRCluster 部分中添加了我的管道定义“masterInstanceType”:“m1.xlarge”,它起作用了。

        【讨论】:

        • 这是您问题的答案,但不是问题标题的答案。
        【解决方案6】:

        从命令行:

         hadoop fs -rm -r /folder
        

        【讨论】:

          【解决方案7】:

          我使用 hadoop 2.6.0,命令行 'hadoop fs -rm -r fileName.hib' 可以很好地删除我的 hdfs 文件 sys 上的任何 hib 文件

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-08-02
            • 2013-06-28
            • 1970-01-01
            • 1970-01-01
            • 2013-12-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多