linux - 访问 Hadoop Virtualbox 集群上的文件

标签 linux hadoop

我在从 Virtualbox 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 上运行相同的脚本时,我得到了文件并得到了纠正。

可能的问题是 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();
        }   

    }

}

最佳答案

我找到了原因和解决方法。

Hadoop 以这种方式工作:

  1. 应用程序向名称节点询问文件
  2. Namenode 发送有关存储请求文件的数据节点的信息 - 并获取数据节点的地址。
  3. 应用程序在收到的关于文件的 url 上询问数据节点并获取文件流。

Virtualbox 和主机架构问题。

Virtualbox hadoop 在地址/localhost:50070/上启动数据节点。当主机应用程序向名称节点询问文件时,获取数据节点“localhost:50070”的本地地址。这导致应用程序尝试从看不见的地址获取文件。

解决方案

1) 我们需要获取 virtualbox 机器的地址(我在 virtualbox 连接设置中使用了 host-only addapter)。 配置 |查询地址

我得到地址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 地址时,代理到客户端机器。

关于linux - 访问 Hadoop Virtualbox 集群上的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42355610/

相关文章:

linux - 运行远程命令后 ssh session 不会关闭

linux - 如何获取文件夹的大小,包括稀疏文件的表观大小? (du太慢了)

regex - Linux筛选器大日志文件用于报告

hadoop - Apache Pig中的DEFINE语句

java - Hadoop SequenceFile-记录的自动增量键

hadoop - 如何解决此Kerberos错误? “KrbException: KDC has no support for encryption type (14) - BAD_ENCRYPTION_TYPE”

java - 一个tomcat实例、jboss实例和weblogic实例最多可以处理多少个并发用户?

javascript - 如何在 NodeJS 子进程中创建终端实例?

hadoop - 文件损坏时的 HDFS 行为

hadoop - 德鲁伊能替代hadoop吗?