【问题标题】:Hadoop java.io.IOException: Mkdirs failed to create /some/pathHadoop java.io.IOException:Mkdirs 未能创建 /some/path
【发布时间】:2021-07-23 09:54:20
【问题描述】:

当我尝试运行我的作业时,出现以下异常:

Exception in thread "main" java.io.IOException: Mkdirs failed to create /some/path
    at org.apache.hadoop.util.RunJar.ensureDirectory(RunJar.java:106)
    at org.apache.hadoop.util.RunJar.main(RunJar.java:150)

/some/path 是 hadoop.tmp.dir。但是,当我在 /some/path 上发出 dfs -ls cmd 时,我可以看到它存在并且数据集文件存在(在开始工作之前被复制)。此外,在 hadoop 配置中正确定义了路径。任何建议将不胜感激。我正在使用 hadoop 0.21。

【问题讨论】:

    标签: hadoop hdfs ioexception


    【解决方案1】:

    刚刚在我的 MacBook Air 中以独立模式从 CDH4 运行 mahout 时遇到了这个问题。

    问题是在解压 mahout 作业时,在不区分大小写的文件系统上创建了 /tmp/hadoop-xxx/xxx/LICENSE 文件和 /tmp/hadoop-xxx/xxx/license 目录。/hadoop-xxx/xxx/license 目录p>

    我可以通过从 jar 文件中删除 META-INF/LICENSE 来解决此问题,如下所示:

    zip -d mahout-examples-0.6-cdh4.0.0-job.jar META-INF/LICENSE
    

    然后通过验证

    jar tvf mahout-examples-0.6-cdh4.0.0-job.jar | grep -i license
    

    希望这会有所帮助!

    【讨论】:

    • 哇,非常感谢,这也是我的问题。更清楚一点:“mahout-examples-0.6-cdh4.0.0-job.jar”是要执行的 mapreduce 作业。所以一般情况是: zip -d META-INF/LICENSE
    • 我一直在网上找到这个解决方案,但它对我不起作用!!运行上面的 zip 和 jar 命令后,我仍然得到:: 线程“main”中的异常 java.io.IOException: Mkdirs failed to create /var/folders/9y/4dzrwg8n45z7fbhmlqc7bsgc0000gn/T/hadoop-unjar569036544832857188​​2/license
    • @alex9311 我遇到了和你一样的问题,我用这个来解决它:zip -d examples.jar LICENSE
    【解决方案2】:

    问题是 OSX 特有的,这是因为默认情况下文件系统设置为 在 Mac 上不区分大小写(保留大小写但不区分大小写,我认为这非常糟糕)。

    避免这种情况的一种方法是使用区分大小写的 磁盘实用程序 创建一个 .dmg 磁盘映像,并将该映像安装在您需要的位置(即 hadoop.tmp.dir 或 /tmp)以下命令(作为超级用户):

    sudo hdiutil attach -mountpoint /tmp <my_image>.dmg
    

    希望对你有帮助。

    【讨论】:

    • 如何创建dmg文件?
    【解决方案3】:

    这是正在创建的本地磁盘上的文件(用于将您的作业 jar 解压到其中),而不是在 HDFS 中。检查您是否有权 mkdir 此目录(从命令行尝试)

    【讨论】:

    • 是的,我查过了,我有 mkdir 的权限,但还是有问题。
    • @NathanielFord - 显然是much more highly upvoted answer didn't quite do the job。令人费解。
    • @WaiHaLee 投票最高的答案通常不会被选中,但 OP 甚至明确指出这个答案不起作用。奇怪!
    • @NathanielFord - 投票最高的答案是不区分大小写的文件系统,OP 可能无法使用它(当然也不是 unix 操作系统的标准)
    • 我通过显式写入 hdfs 解决了这个问题:像这样:df.write.parquet("hdfs://localhost:8020/user/akavall/my_df_name"
    【解决方案4】:

    我过去曾多次遇到此问题,我认为这是 Mac 特有的问题。因为我使用 Maven 来构建我的项目,所以我可以通过在我的 Maven pom.xml 中添加一行来绕过它,如下所示:

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>2.0</version>
        <executions>
            <execution>
                <phase>package</phase>
                <goals>
                    <goal>shade</goal>
                </goals>
                <configuration>
                    <transformers>
                        <transformer implementation="org.apache.maven.plugins.shade.resource.ApacheLicenseResourceTransformer">
                        </transformer>
                    </transformers>
                </configuration>
            </execution>
        </executions>
    </plugin>
    

    【讨论】:

    • 但是你将如何将它与 leiningen 一起使用?
    【解决方案5】:

    在我的例子中,Maven 项目中 pom.xml 中的以下代码行在 Mac 上运行。

      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>2.0</version>
        <configuration>
          <shadedArtifactAttached>true</shadedArtifactAttached>
        </configuration>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>shade</goal>
            </goals>
              <configuration>
                <filters>
                  <filter>
                    <artifact>*:*</artifact>
                    <excludes>
                      <exclude>META-INF/*.SF</exclude>
                      <exclude>META-INF/*.DSA</exclude>
                      <exclude>META-INF/*.RSA</exclude>
                      <exclude>META-INF/LICENSE*</exclude>
                      <exclude>license/*</exclude>
                    </excludes>
                  </filter>
                </filters>
            </configuration>
          </execution>
        </executions>
      </plugin>
    

    【讨论】:

    • 确保您使用的是“maven-shade-plugin”插件,程序集插件在配置中没有过滤器。可能还有另一种方法可以在程序集插件中定义过滤器。但这对我有用,也检查了其他一些。
    【解决方案6】:

    检查所需空间是否可用。 这个问题主要是因为空间问题。

    【讨论】:

    • 这是我刚遇到的!
    【解决方案7】:

    我在使用 MacOS Sierra 的 Mac 上构建 MapReduce 作业时遇到了同样的问题。相同的代码在 Ubuntu Linux(14.04 LTS 和 16.04 LTS)上运行没有问题。 MapReduce 发行版是 2.7.3,并配置为单节点独立操作。该问题似乎与将许可证文件复制到 META_INF 目录有关。我的问题是通过在 Maven Shade 插件配置中添加一个转换器来解决的,特别是:ApacheLicenseResourceTransformer。

    这是 POM.xml 的相关部分,它是 &lt;build&gt; 部分的一部分:

    <plugin>                                                                                                             <groupId>org.apache.maven.plugins</groupId>                                                                      
       <artifactId>maven-shade-plugin</artifactId>                                                                      
       <version>3.0.0</version>                                                                                         
       <executions>                                                                                                     
         <execution>                                                                                                    
           <phase>package</phase>                                                                                       
           <goals>                                                                                                      
             <goal>shade</goal>                                                                                         
           </goals>                                                                                                     
           <configuration>                                                                                              
             <transformers>                                                                                             
               <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">       
                 <mainClass>path.to.your.main.class.goes.here</mainClass>                                        
               </transformer>                                                                                           
               <transformer implementation="org.apache.maven.plugins.shade.resource.ApacheLicenseResourceTransformer">  
               </transformer>                                                                                           
             </transformers>                                                                                            
           </configuration>                                                                                             
         </execution>                                                                                                   
       </executions>                                                                                                    
     </plugin>  
    

    请注意,我还使用ManifestResourceTransformer 来指定 MapReduce 作业的主类。

    【讨论】:

      【解决方案8】:

      就我而言,我只是将文件重命名为“log_test.txt”

      因为操作系统 (UBUNTU) 试图生成同名文件夹。 "log_test.txt/__results.json"

      【讨论】:

        猜你喜欢
        • 2021-09-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-18
        • 2012-07-03
        • 2022-07-16
        • 1970-01-01
        相关资源
        最近更新 更多