2017-02-20 93 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个地址数据节点的,代理客户机。