Как прочитать файл из Hadoop с помощью Java без командной строки

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

String uri = theFilename;
Configuration conf = new Configuration();
FileSystem fs = FileSystem.get(URI.create(uri), conf);
InputStream in = null;
try {
  in = fs.open(new Path(uri));
  IOUtils.copyBytes(in, System.out, 4096, false);
} finally {
  IOUtils.closeStream(in);
}

Чтобы запустить этот файл, мне нужно запустить hadoop jar myjar.jar com.mycompany.cloud.CatFile /filepathin_hadoop. Это работает. Но как я могу сделать то же самое из другой программы, я имею в виду, без использования команды hadoop jar.


person user1249655    schedule 05.03.2012    source источник


Ответы (2)


Вы можете добавить свой core-site.xml в этот объект конфигурации, чтобы он знал URI для вашего экземпляра HDFS. Для этого метода необходимо установить HADOOP_HOME.

Configuration conf = new Configuration();
Path coreSitePath = new Path(System.getenv("HADOOP_HOME"), "conf/core-site.xml");
conf.addResource(coreSitePath);
FileSystem hdfs = FileSystem.get(conf);
// rest of code the same

Теперь без использования hadoop jar вы можете открыть соединение с вашим экземпляром HDFS.

Изменить: необходимо использовать conf.addResource(Path). Если вы используете аргумент String, он просматривает путь к классам для этого имени файла.

person Matt D    schedule 05.03.2012
comment
Добавили тот же фрагмент кода и установили параметр HADOOP_HOME в качестве переменной env из eclipse, но все равно System.out.println(hdfs.getHomeDirectory()); печатает каталог локальной файловой системы. - person user1249655; 07.03.2012
comment
Я отредактировал свой ответ; забыл использовать путь к файлу core-site.xml вместо строки. - person Matt D; 07.03.2012

Существует другой набор методов конфигурации (имя параметра, значение).
Если вы используете этот метод, вам не нужно указывать расположение core-site.xml. Это было бы полезно для доступа к HDFS из удаленного места, такого как веб-сервер.

Использование следующим образом:

    String uri = theFilename;
    Configuration conf = new Configuration();

    conf.set("fs.default.name","hdfs://10.132.100.211:8020/"); 
    FileSystem fs = FileSystem.get(conf);
// Rest of the code
person SachinJ    schedule 26.03.2013