2013-11-20 2 views
1

Установлена ​​и запущена Linux VM с Hadoop. И есть приложение Java, работающее в Eclipse, которое извлекает данные из HDFS. Если я копирую файлы или файлы из HDFS внутри виртуальной машины, все работает нормально. Но когда я бег приложения на Windows, физической машину я получаю следующее исключение:Ошибка при копировании файла с HDFS на компьютер Windows

WARN hdfs.DFSClient: Failed to connect to /127.0.0.1:50010 for block, add to 
deadNodes and continue. java.net.ConnectException: Connection refused: no further 
information. Could not obtain BP-*** from any node: java.io.IOException: 
No live nodes contain current block. Will get new block locations from namenode and retry 

Я могу только получить список файлов из HDFS. Кажется, что при извлечении данных из узла данных он подключается к моему локальному хосту Windows. Потому что, когда я сделал туннель в шпаклере от моего локального хоста до ВМ, все было в порядке.

Вот мой Java-код:

Configuration config = new Configuration(); 
config.set("fs.defaultFS", "hdfs://ip:port/"); 
config.set("mapred.job.tracker", "hdfs://ip:port"); 
FileSystem dfs = FileSystem.get(new URI("hdfs://ip:port/"), config, "user"); 
dfs.copyToLocalFile(false, new Path("/tmp/sample.txt"),newPath("D://sample.txt"), true); 

Как это исправить? Спасибо.

P.S. Эта ошибка возникает, когда я использую QuickStart VM от Cloudera.

ответ

0

Вам необходимо изменить ip. Сначала перейдите в linux VM и на своем терминале найдите IP-адрес своей виртуальной машины.

Команда, чтобы увидеть IP-адрес в Linux VM ниже

Ifconfig

Затем в изменении кода IP-адрес в IP Thats показано в вашем Linux VM.

1

Ваш DataNode рекламирует свой адрес в NameNode как 127.0.0.1. Вам необходимо повторно настроить свой псевдораспределенный кластер, чтобы узлы использовали внешние доступные адреса (имена хостов или IP-адреса) при открытии служб сокетов.

Я предполагаю, что если вы запустите на своей виртуальной машине netstat -atn, вы увидите, что порты Hadoop привязаны к 127.0.0.1, а не 0.0.0.0 - это означает, что они будут принимать только внутренние соединения.

Вам нужно посмотреть конфигурационный файл вашей виртуальной машины/etc/hosts и убедиться, что имя хоста не имеет записи, разрешающей 127.0.0.1.

1

Всякий раз, когда вы запускаете виртуальную машину, она получает свой собственный I.P. Что-то вроде 192.x.x.x или 172.x.x.x.

Использование 127.0.0.1 для HDFS не поможет при выполнении из окна Windows, поскольку оно сопоставляется с локальным i.p. Итак, если вы используете 127.0.0.1 с вашего компьютера Windows, он будет думать, что ваш HDFS работает на Windows-машине. Вот почему ваше соединение терпит неудачу.

Найти i.p, связанный с вашей виртуальной машиной. Вот ссылка, чтобы получить это, если вы используете Hyper-V. http://windowsitpro.com/hyper-v/quickly-view-all-ip-addresses-hyper-v-vms

Как только вы получите виртуальные машины I.P, используйте его в приложении.

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