2017-02-20 16 views
0

У меня проблема с получением файла с хост-компьютера (windows) из клана hadoop, работающего на виртуальном боксе Ubuntu.Доступ к файлу на Hadoop Virtualbox Cluster

Я вижу кластер из хост-машины (http://192.168.56.105:8088/cluster) и Яваскрипт структуру папок на HDFS, но когда я пытаюсь прочитать файл я получаю эту ошибку:

org.apache.hadoop.hdfs.BlockMissingException: Could not obtain block: BP-1570018429-127.0.0.1-1484660807169:blk_1073742497_1673 file=/Item/part-r-00000 

Когда я запускать этот скрипт на кластере vmbox ubuntu я получаю файл и исправляю.

Возможно, проблема заключается в namenode попытаться найти данные в другом месте (_1673?), Когда ip или пользователь отличается - но я не могу найти правильную конфигурацию этой проблемы.

Благодарим за консультацию.

Linux пользователь: wukkie

Это сценарий:

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.net.URI; 
import java.net.URISyntaxException; 

import java.security.PrivilegedExceptionAction; 

import org.apache.hadoop.conf.*; 
import org.apache.hadoop.fs.FSDataInputStream; 
import org.apache.hadoop.fs.FileSystem; 
import org.apache.hadoop.fs.Path; 
import org.apache.hadoop.security.UserGroupInformation; 

public class InsertReommendationToDB { 

    private static Configuration getConfiguration(){ 
     Configuration conf = new Configuration(); 
     conf.set("fs.defaultFS", "hdfs://192.168.56.105:54310/");  
     conf.set("hadoop.job.ugi", "wukkie"); 
     return conf; 
    } 

    public static void main(String args[]){  
     try { 

      UserGroupInformation ugi = UserGroupInformation.createProxyUser("wukkie", UserGroupInformation.getLoginUser()); 
      ugi.doAs(new PrivilegedExceptionAction<Void>() { 


       Path filepath = new Path("/Item/part-r-00000");    
       public Void run() throws Exception { 

        FileSystem fs = filepath.getFileSystem(getConfiguration()); 

        FSDataInputStream inputStream = fs.open(filepath); 
        String line; 
        line = inputStream.readLine(); 

        while(line != null){ 
         System.out.println(line); 
         line = inputStream.readLine(); 
        } 
        return null; 
       } 

      }); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

    } 

} 

ответ

0

я найти причину и обходной путь решения.

Hadoop работы таким образом:

  1. Применение спросить NameNode о файле
  2. NameNode отправить информацию о DataNode (ы), который хранится требуемый файл -И получить адрес DataNode.
  3. Приложение спросит datanode (s) о полученных url (-ах) о файле и получите filestream.

Виртуальная коробка и проблема с архитектурой хоста.

Virtualbox hadoop запуск datanode на адрес/местный адрес: 50070 /. Когда хост-приложение запрашивает namenode о файле, получите локальный адрес datanode «localhost: 50070». Этот результат в приложении попробует получить файл из невидимого адреса.

Обход решение

1) Нам нужно получить адрес VirtualBox машины (я использую хост-только addapter в настройках подключения VirtualBox). ifconfig | Grep адр

я получить адрес 192.168.56.104

2) мы можем установить теперь обратный прокси-сервер на хост-машины (окна). Начать CMD с правами администратора и положить

netsh interface portproxy add v4tov4 listenport=50070 listenaddress=localhost connectport=50070 connectaddress=192.168.56.104 
netsh interface portproxy add v4tov4 listenport=50020 listenaddress=localhost connectport=50020 connectaddress=192.168.56.104 
netsh interface portproxy add v4tov4 listenport=50090 listenaddress=localhost connectport=50090 connectaddress=192.168.56.104 
netsh interface portproxy add v4tov4 listenport=50010 listenaddress=localhost connectport=50010 connectaddress=192.168.56.104 

Теперь, когда хост-приложения получить локальный: 50010 адрес DataNode, прокси на клиентской машине.

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

  • Нет связанных вопросов^_^