Доступ к HDFS файлам со всех компьютеров кластера

Доступ к HDFS файлам со всех компьютеров кластера

13.02.2013 07:13:19 Просмотров 26 Источник

Моя hadoop программа первоначально запускалась в локальном режиме, а теперь моей целью стало запуск в полностью распределенном режиме.

Для этого необходимо обеспечить доступ к файлам, чтение которых выполняется в функциях reducer и mapper, со всех компьютеров кластера и поэтому я задал вопрос - также поскольку неизвестно на каком компьютере будет выполняться функция mapper (mapper из логики программы будет только один и программа будет запускаться только с одним mapper), то необходимо обеспечить также доступ на всем кластере к файлу, поступающему на вход функции mapper.

В связи с этим у меня возник вопрос: Можно ли непосредственно использовать hdfs-файлы, то есть скопировать предварительно файлы из файловой системы Linux в файловую систему HDFS (тем самым как я предполагаю, эти файлы станут доступными на всех компьютерах кластера, если это не так, то поправьте пожалуйста) и затем использовать HDFS Java API для чтения этих файлов, в функциях reducer и mapper, выполняющихся на компьютерах кластера?

Если на этот вопрос ответ положительный, то приведите пожалуйста пример копирования из файловой системы Linux в файловую систему HDFS и чтения этих файлов в java программе с помощью HDFS Java API.

У вопроса есть решение - Посмотреть?

Ответы - Доступ к HDFS файлам со всех компьютеров кластера / Доступ к HDFS файлам со всех компьютеров кластера

a_gura

13.02.2013 08:34:56

HDFS - это по сути своей все еще файловая система (хоть и распределенная). Соответственно в нее можно скопировать любые файлы из локальной файловой системы.

Configuration conf = new Configuration();    
FileSystem fs = FileSystem.get(conf);

Path localPath = new Path("/home/user/file");
Path hdfsPath = new Path("/user/hadoop/file");
fs.copyFromLocalFile(localPath,  hdfsPath);
https://ru.stackoverflow.com/questions/192684/%d0%94%d0%be%d1%81%d1%82%d1%83%d0%bf-%d0%ba-hdfs-%d1%84%d0%b0%d0%b9%d0%bb%d0%b0%d0%bc-%d1%81%d0%be-%d0%b2%d1%81%d0%b5%d1%85-%d0%ba%d0%be%d0%bc%d0%bf%d1%8c%d1%8e%d1%82%d0%b5%d1%80%d0%be%d0%b2-%d0%ba%d0%bb%d0%b0%d1%81%d1%82%d0%b5%d1%80%d0%b0/192732#comment192754_192732
@a_gura я, во-первых, хочу уточнить, вы наверно хотели написать во второй строке FileSystem hdfs=FileSystem.get(conf) во-вторых, я хотел спросить будут ли hdfs-файлы доступны на всех компьютерах кластера, и, в-третьих, также очень нужно знать как осуществить чтение содержимого hdfs-файла и запсиь этого содержимого в java строку.
https://ru.stackoverflow.com/questions/192684/%d0%94%d0%be%d1%81%d1%82%d1%83%d0%bf-%d0%ba-hdfs-%d1%84%d0%b0%d0%b9%d0%bb%d0%b0%d0%bc-%d1%81%d0%be-%d0%b2%d1%81%d0%b5%d1%85-%d0%ba%d0%be%d0%bc%d0%bf%d1%8c%d1%8e%d1%82%d0%b5%d1%80%d0%be%d0%b2-%d0%ba%d0%bb%d0%b0%d1%81%d1%82%d0%b5%d1%80%d0%b0/192732#comment192765_192732
@ivan31 Нет, я написал то, что хотел. Да, файлы будут доступны. Что вы подразумеваете под hdfs-файлом?
https://ru.stackoverflow.com/questions/192684/%d0%94%d0%be%d1%81%d1%82%d1%83%d0%bf-%d0%ba-hdfs-%d1%84%d0%b0%d0%b9%d0%bb%d0%b0%d0%bc-%d1%81%d0%be-%d0%b2%d1%81%d0%b5%d1%85-%d0%ba%d0%be%d0%bc%d0%bf%d1%8c%d1%8e%d1%82%d0%b5%d1%80%d0%be%d0%b2-%d0%ba%d0%bb%d0%b0%d1%81%d1%82%d0%b5%d1%80%d0%b0/192732#comment192773_192732
@a_gura насчет уточнения - в книге Чака Лема Hadoop в действии было именно FileSystem hdfs=FileSystem.get(conf) FileSystem local=FileSystem.get(conf) поэтому я и уточнил. А по поводу hdfs-файла - я просто в этой же книге видел следующие строки кода Path hdfsFile=new Path(args[1]) FSDataOutputStream out = hdfs.create(hdfsFile) Как я понимаю для чтения всего содержимого hdfs-файла надо завести переменную FSDataInputStream in = hdfs.create(hdfsFile) но что дальше делать для чтения hdfs-файла и записи всего его содержимого в java строку я не представляю.
https://ru.stackoverflow.com/questions/192684/%d0%94%d0%be%d1%81%d1%82%d1%83%d0%bf-%d0%ba-hdfs-%d1%84%d0%b0%d0%b9%d0%bb%d0%b0%d0%bc-%d1%81%d0%be-%d0%b2%d1%81%d0%b5%d1%85-%d0%ba%d0%be%d0%bc%d0%bf%d1%8c%d1%8e%d1%82%d0%b5%d1%80%d0%be%d0%b2-%d0%ba%d0%bb%d0%b0%d1%81%d1%82%d0%b5%d1%80%d0%b0/192732#comment192786_192732
@ivan31 У вас уже есть InputStream. Просто читайте из него как из обычного файла. Читайте руководство по Java IO (docs.oracle.com/javase/tutorial/essential/io).
https://ru.stackoverflow.com/questions/192684/%d0%94%d0%be%d1%81%d1%82%d1%83%d0%bf-%d0%ba-hdfs-%d1%84%d0%b0%d0%b9%d0%bb%d0%b0%d0%bc-%d1%81%d0%be-%d0%b2%d1%81%d0%b5%d1%85-%d0%ba%d0%be%d0%bc%d0%bf%d1%8c%d1%8e%d1%82%d0%b5%d1%80%d0%be%d0%b2-%d0%ba%d0%bb%d0%b0%d1%81%d1%82%d0%b5%d1%80%d0%b0/192732#comment192837_192732
@a_gura а копирование файла из hdfs осуществляется с помощью функции fs.copyToLocalFile(hdfsPath, localPath) ?
https://ru.stackoverflow.com/questions/192684/%d0%94%d0%be%d1%81%d1%82%d1%83%d0%bf-%d0%ba-hdfs-%d1%84%d0%b0%d0%b9%d0%bb%d0%b0%d0%bc-%d1%81%d0%be-%d0%b2%d1%81%d0%b5%d1%85-%d0%ba%d0%be%d0%bc%d0%bf%d1%8c%d1%8e%d1%82%d0%b5%d1%80%d0%be%d0%b2-%d0%ba%d0%bb%d0%b0%d1%81%d1%82%d0%b5%d1%80%d0%b0/192732#comment192843_192732
раз 5 посмотрел на FileSystem fs = FileSystem.get(conf); и на FileSystem hdfs=FileSystem.get(conf); извините, а в чем разница?
Закрыть X