Hadoop java.io.IOException: Mkdirs не удалось создать /some/path
Когда я пытаюсь запустить свою работу, я получаю следующее исключение:
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. Однако, когда я запускаю команду dfs -ls cmd в / some / path, я вижу, что она существует и файл набора данных присутствует (был скопирован перед запуском задания). Также путь правильно определен в конфигах hadoop. Любые предложения будут оценены. Я использую hadoop 0.21.
8 ответов
Это файл на локальном диске, который создается (для распаковки вашей фляги работы), а не в HDFS. Проверьте, есть ли у вас права доступа к этому каталогу (попробуйте из командной строки)
Просто столкнулся с этой проблемой при запуске mahout с CDH4 в автономном режиме на моем MacBook Air.
Проблема заключается в том, что файл /tmp/hadoop-xxx/xxx/LICENSE и каталог /tmp/hadoop-xxx/xxx/license создаются в файловой системе без учета регистра при отмене задания Mahout.
Я смог обойти это, удалив META-INF/LICENSE из файла jar следующим образом:
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
Надеюсь это поможет!
Проблема специфична для OSX, это связано с тем, что по умолчанию файловая система настроена на регистр без учета регистра (сохранение с учетом регистра, но без учета регистра, что, на мой взгляд, очень плохо).
Чтобы обойти это, нужно создать образ диска.dmg с помощью дисковой утилиты, чувствительной к регистру, и смонтировать этот образ там, где он вам нужен (например, hadoop.tmp.dir или / tmp), с помощью следующей команды (в качестве суперпользователя):
sudo hdiutil attach -mountpoint /tmp <my_image>.dmg
Я надеюсь, что это помогает.
Я сталкивался с этой проблемой несколько раз в прошлом, я считаю, что это проблема, специфичная для 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>
В моем случае ниже строки кода в pom.xml в проекте Maven работали на 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>
Убедитесь, что необходимое место доступно или нет. Это проблема в основном из-за космических проблем.
Я столкнулся с этой же проблемой при создании рабочих мест MapReduce на Mac с MacOS Sierra. Тот же код работает без проблем в Ubuntu Linux (14.04 LTS и 16.04 LTS). Распределение MapReduce было 2.7.3 и было настроено для отдельного узла, автономной работы. Проблема связана с копированием файлов лицензий в каталог META_INF. Моя проблема была решена путем добавления трансформатора в конфигурацию плагина Maven Shade, а именно: ApacheLicenseResourceTransformer
,
Вот соответствующий раздел файла POM.xml, который является частью <build>
раздел:
<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.
В моем случае я просто переименовал файл "log_test.txt"
Потому что ОС (UBUNTU) пыталась сгенерировать папку с таким же именем. "Log_test.txt/__results.json"