2015-01-06 1 views
2

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

Это мой код:

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); 

Я получил этот код из here и here. К сожалению, объект hdfs - это объект «LocalFileSystem», поэтому что-то должно быть неправильно. Похоже, это именно то, что Rejeev написал на своем сайте:

[...] If you do not assign the configurations to conf object (using hadoop xml file) your HDFS operation will be performed on the local file system and not on the HDFS. [...]

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

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

Это libary настоящее время я использую:

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

Я слышал, что Hadoop-ядро было разделено на несколько LIBS, поэтому я также попытался следующие ЛИЭС:

hadoop-common-2.0.0-alpha.jar

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

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

hadoop fs -mkdir testdirectory 

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

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

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

ответ

0

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.

пример командной строке баночка файл:

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 -C classes /.

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

Hadoop баночка hadoopfile.jar hadoop.sample.fileaccess.Hmkdirs

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


Обновление: вы можете выполнить затмение и получить доступ к 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); 
     } 

}

+0

Большое вам спасибо за ваши ответы! :) Я выполнил шаги 1-4 и выполнил приложение через консоль с помощью «hadoop jar hadoopfile.jar hasoop.sample.fileaccess.Hmkdirs», затем консоль «True» и новая папка в HDFS была создана. Я предполагаю, что проблема заключалась в том, что я не использовал «банку хаоп». Однако при запуске кода в eclipse я получаю следующую ошибку: java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory. Как вы это сделали? Какие библиотеки вы используете? Еще раз спасибо :) – Tim

+0

Добавить под импорт: import java.io.IOException; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; Проверьте свой путь сборки, чтобы иметь под файлами jar: hadoop-hdfs и hadoop-common – user1652210

1

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

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

+0

Это не дает ответа на вопрос. Чтобы критиковать или запросить разъяснения у автора, оставьте комментарий ниже своего сообщения - вы всегда можете прокомментировать свои собственные сообщения, и как только у вас будет достаточно [репутации] (http://stackoverflow.com/help/whats-reputation), вы будете быть в состоянии [прокомментировать любое сообщение] (http://stackoverflow.com/help/privileges/comment). – Ben

+0

Бен Почему это не ответ? – Hajmola

+0

Это не сработало. – Tim

0

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

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 в вашем пути к классам, тоже ,

+0

Эрик, спасибо вам ответ. Код работает для меня, когда я запускаю его с консоли через «банда хаоса», как описано ниже пользователем1652210. Можете ли вы запустить код из eclipse? Является ли библиотека hadoop-hdfs единственной, которую вы используете? При запуске кода из eclipse я получаю несколько NoClassDefFoundErrors. – Tim

+0

вам понадобятся hadoop-hdfs и хаоп-общий. Помните, что имена библиотек изменились между CDH4 и CDH5. Вы также должны использовать maven или gradle, чтобы собрать свой путь к классам, чтобы захватить транзитивные зависимости. –

Смежные вопросы