美文网首页工作生活
本地java程序连接阿里云服务器Hadoop失败

本地java程序连接阿里云服务器Hadoop失败

作者: 大雄的学习笔记 | 来源:发表于2019-07-16 07:33 被阅读0次

    问题描述:
    在阿里云服务器搭建完Hadoop环境后,在服务器上用shell命令可以读取写入文件
    在本地java程序可以连接hadoop,并创建路径。

    Boolean result = fileSystem.mkdirs(path);
    

    但是读取hdfs上的文件就报错。

    FSDataInputStream fsDataInputStream =fileSystem.open(new Path("/README.txt"));
    IOUtils.copyBytes(fsDataInputStream,System.out,1024);
    

    问题原因:
    1.阿里云服务器Shell 可以正常操作,排除集群搭建和进程没有启动的问题。
    2.HDFS 中的文件夹和文件名都是存放在 NameNode 上,操作不需要和 DataNode 通信,因此可以正常创建文件夹和创建文件说明本地和远程 NameNode 通信没有问题。
    3.那么很可能是本地和远程 DataNode 通信有问题。
    4.猜测问题原因为:文件夹和文件名都是存放在 NameNode 上的,我本地可以通过公网访问 NameNode,所以创建文件夹和文件都可以,但是当我写数据的时候,NameNode 和DataNode 是通过内网通信的,NameNode 会返回给我 DataNode 的内网 IP,我本地就访问不了了。
    还有一种可能,云服务器没有开放 DataNode 用于数据传输服务端口 默认是 50010。

    解决问题:
    1.构造HDFS客户端的时候加如下配置,使 NameNode 返回 DataNode 的主机名而不是 IP

            configuration = new Configuration();
            configuration.set("dfs.client.use.datanode.hostname", "true");
    
    

    2.阿里云服务器的host配置如下:
    /etc/hosts

    172.xx.xx.xx hadoop000
    

    3.阿里云服务器开放50010端口

    问题解决了!!

    相关文章

      网友评论

        本文标题:本地java程序连接阿里云服务器Hadoop失败

        本文链接:https://www.haomeiwen.com/subject/hbqthctx.html