Не удается получить доступ к HDFS через Java API (Cloudera-CDH4.4.0)

Я пытаюсь получить доступ к своей HDFS с помощью кода Java, но не могу заставить его работать... после 2 дней борьбы я думаю, что пришло время обратиться за помощью.

Это мой код:

Configuration conf = new Configuration();           
conf.addResource(new Path("/HADOOP_HOME/conf/core-site.xml"));
conf.addResource(new Path("/HADOOP_HOME/conf/hdfs-site.xml"));
FileSystem hdfs = FileSystem.get(conf);

boolean success = hdfs.mkdirs(new Path("/user/cloudera/testdirectory"));
System.out.println(success);
        

Я получил этот код из здесь и здесь. К сожалению, объект hdfs — это всего лишь объект LocalFileSystem, так что что-то должно быть не так. Похоже, это именно то, что написал Реджив. на его сайте:

[...] Если вы не назначите конфигурации объекту conf (используя файл hadoop xml), ваша операция HDFS будет выполняться в локальной файловой системе, а не в HDFS. [...]

С абсолютными путями я получаю тот же результат.

conf.addResource(new Path("/etc/hadoop/conf/core-site.xml"))

Это библиотека, которую я сейчас использую:

hadoop-core-2.0.0-mr1-cdh4.4.0.jar

Я слышал, что ядро ​​Hadoop было разделено на несколько библиотек, поэтому я также попробовал следующие библиотеки:

hadoop-common-2.0.0-alpha.jar

hadoop-mapreduce-client-core-2.0.2-alpha.jar

Я использую Cloudera-CDH4.4.0, поэтому Hadoop уже установлен. Через консоль все работает нормально. Например:

hadoop fs -mkdir testdirectory

Так что все должно быть настроено правильно по умолчанию.

Я надеюсь, что вы, ребята, можете мне помочь... эта штука сводит меня с ума! Крайне обидно не справиться с такой простой задачей.

Заранее большое спасибо за любую помощь.


person Tim    schedule 06.01.2015    source источник


Ответы (3)


1) Вам не нужно conf.addResource, если вы не переопределяете какие-либо переменные конфигурации.

2) Надеюсь, вы создаете файл JAR и запускаете файл JAR в командном окне, а не в eclipse. Если вы выполняете в eclipse, он будет выполняться в локальной файловой системе.

3) Я запустил код ниже, и это сработало.

public class Hmkdirs {
public static void main(String[] args) 
        throws IOException 
        { 
Configuration conf = new Configuration();  
FileSystem fs = FileSystem.get(conf); 
boolean success = fs.mkdirs(new Path("/user/cloudera/testdirectory1"));
System.out.println(success);
        }

}

4) Для выполнения вам нужно создать файл jar, вы можете сделать это либо из eclipse, либо из командной строки и выполнить файл jar.

Пример файла jar командной строки:

javac -classpath /usr/local/hadoop/hadoop-core-1.2.1.jar:/usr/local/hadoop/lib/commons-cli-1.2.jar -d классы WordCount.java && jar -cvf WordCount.jar - С классы/ .

выполнение файла jar через hadoop в командной строке.

hadoop jar hadoopfile.jar hadoop.sample.fileaccess.hmkdirs

hadoop.sample.fileaccess — это пакет, в котором существуют Hmkdirs моего класса. Если ваш класс существует в пакете по умолчанию, вам не нужно указывать его, просто класс в порядке.


Обновление: вы можете выполнить из eclipse и по-прежнему получать доступ к hdfs, проверьте код ниже.

public class HmkdirsFromEclipse {

public static void main(String[] args) 

        throws IOException 
        { 
Configuration conf = new Configuration();  
conf.addResource("/etc/hadoop/conf/core-site.xml");
conf.addResource("/etc/hadoop/conf/hdfs-site.xml");
conf.set("fs.defaultFS", "hdfs://quickstart.cloudera:8020/");
conf.set("hadoop.job.ugi", "cloudera");
conf.set("fs.hdfs.impl", org.apache.hadoop.hdfs.DistributedFileSystem.class.getName());
FileSystem fs = FileSystem.get(conf); 
boolean success = fs.mkdirs(new Path("/user/cloudera/testdirectory9"));
System.out.println(success);
        }

}

person user1652210    schedule 06.01.2015
comment
Большое спасибо за ваши ответы! :) Я выполнил ваши шаги 1-4 и выполнил приложение через консоль с помощью jar-файла hadoop. Я предполагаю, что проблема заключалась в том, что я не использовал банку hadoop. Однако при запуске кода в eclipse я получаю следующую ошибку: java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory. Как вы заставили это работать? Какие библиотеки вы используете? Еще раз большое спасибо :) - person Tim; 08.01.2015
comment
Добавьте ниже импорт: import java.io.IOException; импортировать org.apache.hadoop.conf.Configuration; импортировать org.apache.hadoop.fs.FileSystem; импортировать org.apache.hadoop.fs.Path; Проверьте путь сборки, чтобы иметь следующие jar-файлы: hadoop-hdfs и hadoop-common. - person user1652210; 19.02.2015

Попробуй это:

conf.set("fs.defaultFS", "file:///"); conf.set("mapreduce.framework.name", "local");

person Hajmola    schedule 06.01.2015
comment
Это не дает ответа на вопрос. Чтобы подвергнуть критике или запросить разъяснения у автора, оставьте комментарий под его сообщением — вы всегда можете прокомментировать свои собственные сообщения, и как только у вас будет достаточно репутация, вы сможете комментировать любой пост. - person Ben; 07.01.2015
comment
Бен Почему это не ответ? - person Hajmola; 07.01.2015
comment
В вопросе четко указано, что он хочет получить доступ к файловой системе HDFS, но вы предлагаете установить реализацию по умолчанию как локальную. Ты видишь проблему? - person Matt Fortier; 23.03.2015

Это действительно непростая часть конфигурации, но это, по сути, то, что вам нужно сделать:

    Configuration conf = new Configuration();
    conf.addResource("/etc/hadoop/conf/core-site.xml");
    conf.addResource("/etc/hadoop/conf/hdfs-site.xml");
    conf.set("fs.defaultFS", hdfs://[your namenode]);
    conf.set("hadoop.job.ugi", [your user]
    conf.set("fs.hdfs.impl", org.apache.hadoop.hdfs.DistributedFileSystem.class.getName());

убедитесь, что у вас есть hadoop-hdfs в пути к классам.

person Erik Schmiegelow    schedule 07.01.2015
comment
Эрик, спасибо за ответ. Код работает для меня, когда я запускаю его из консоли через банку Hadoop, как описано ниже пользователем 1652210. Можете ли вы запустить код из eclipse? Используете ли вы только библиотеку hadoop-hdfs? Я получаю несколько ошибок NoClassDefFoundError при запуске кода из eclipse. - person Tim; 09.01.2015
comment
вам понадобятся как минимум hadoop-hdfs и hadoop-common. Имейте в виду, что имена библиотек изменились между CDH4 и CDH5. Вы также должны использовать maven или gradle для сборки вашего пути к классам, чтобы также получить транзитивные зависимости. - person Erik Schmiegelow; 09.01.2015