2017-02-20 136 views
0

我在從虛擬機Ubuntu上運行hadoop羣集的主機(Windows)獲取文件時出現問題。在Hadoop Virtualbox羣集上訪問文件

我看到集羣從主機(http://192.168.56.105:8088/cluster)和Java腳本看到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發送關於該存儲請求的文件 - 和獲得數據節點的地址數據節點(或多個)的信息。
  3. 應用程序詢問datanode收到關於文件的URL並獲取文件流。

Virtualbox和主機結構問題。

Virtualbox hadoop在地址/ localhost上啓動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個地址數據節點的,代理客戶機。