访问Hadoop Virtualbox Cluster上的文件

时间:2017-02-20 22:49:39

标签: linux hadoop

我在使用虚拟机Ubuntu的hadoop群集从主机(windows)获取文件时遇到问题。

我从主机(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上运行相同的脚本时,我得到文件并且正确。

当ip或用户不同时,问题是namenode尝试在不同地方搜索数据(_1673?) - 但我无法找到此问题的正确配置。

感谢您的建议。

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();
        }   

    }

}

1 个答案:

答案 0 :(得分:0)

我找到了理由和解决方法。

Hadoop以这种方式工作:

  1. 应用程序询问关于文件的namenode
  2. Namenode发送有关存储所请求文件的datanode的信息,并获取datanode的地址。
  3. 应用程序在收到的关于文件的URL上询问datanode,并获取文件流。
  4. Virtualbox和主机架构问题。

    Virtualbox hadoop在地址/ localhost:50070 /上启动datanode。当主机应用程序向namenode询问文件时,获取datanode的本地地址&#34; localhost:50070&#34;。应用程序中的结果尝试从看不见的地址获取文件。

    解决方案

    1)我们需要获取virtualbox机器的地址(我在虚拟机连接设置中使用仅限主机的addapter)。 ifconfig | grep addr

    我收到地址 192.168.56.104

    2)我们现在可以在主机(windows)上设置反向代理。使用管理员权限启动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
    

    现在,当主机应用程序获取localhost:50010 datanode地址时,代理到客户机。