美文网首页
HDFS 无法上传和下载文件

HDFS 无法上传和下载文件

作者: 朝圣的路上 | 来源:发表于2017-11-26 15:18 被阅读344次

最近公司部署了新的hadoop集群。以前部署的cloudera是阿里云的经典网络。默认是在内网环境,需要vpn才能访问。现在cloudera是部署在专有网络。绑定动态IP后开通相应的端口就能通过公有IP访问对应的服务器节点。
因此,问题来了。在本地公网跑一个程序,往hdfs集群放文件的时候报如下错误。

java.io.IOException: File /user/appuser/sunshine/file/project/seedqueue.txt could only be replicated to 0 nodes instead of minReplication (=1).  There are 3 datanode(s) running and 3 node(s) are excluded in this operation.
        at org.apache.hadoop.hdfs.server.blockmanagement.BlockManager.chooseTarget4NewBlock(BlockManager.java:1622)
        at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getAdditionalBlock(FSNamesystem.java:3351)
        at org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.addBlock(NameNodeRpcServer.java:683)
        at org.apache.hadoop.hdfs.server.namenode.AuthorizationProviderProxyClientProtocol.addBlock(AuthorizationProviderProxyClientProtocol.java:214)
        at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolServerSideTranslatorPB.addBlock(ClientNamenodeProtocolServerSideTranslatorPB.java:495)
        at org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos$ClientNamenodeProtocol$2.callBlockingMethod(ClientNamenodeProtocolProtos.java)
        at org.apache.hadoop.ipc.ProtobufRpcEngine$Server$ProtoBufRpcInvoker.call(ProtobufRpcEngine.java:617)
        at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:1073)
        at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2216)
        at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2212)
        at java.security.AccessController.doPrivileged(Native Method)
        at javax.security.auth.Subject.doAs(Subject.java:422)
        at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1796)
        at org.apache.hadoop.ipc.Server$Handler.run(Server.java:2210)

代码如下:

public static void main(String[] args) {
        
        Configuration conf = new Configuration();
        System.setProperty("HADOOP_USER_NAME", "appuser");
        conf.set("fs.defaultFS", "hdfs://106.102.93.31:8020");
        
        HdfsUtil hdfsFile = new HdfsUtil(conf);
        if(hdfsFile.checkFileExist("/user/appuser/sunshine")){
            System.out.println("file is existing!");
        }else{
            System.out.println("file is not existing!");
        }
        
        String srcFile = "C:/tmp/seedqueue.txt";
        String dstFile = "/user/appuser/sunshine/file/project/";
        hdfsFile.putFile(srcFile, dstFile);
        
        hdfsFile.readFile("/user/appuser/nginx.conf",System.out);
        System.out.println();
        hdfsFile.getFile("/user/appuser/nginx.conf", "C:/tmp/");
    }

上面的代码可以打印"file is existing"。但是当我存放这个txt文件的时候就报错了。查看hdfs对应的文件目录,文件已经被创建,但是大小为0。

查看namde的hdfs日志报同样的错误。

初步分析,Namenode能通过公网IP正常访问。也能读取结构目录。但是往datanode里面读写数据的时候出错。这种情况可能有两个原因,一是namenode和datanode通信的时候出错,或者是本地服务和datanode通信的时候出错。

网上的解决方案大多是format datanode之类的。这个是解决数据版本不一致的问题。我试着在服务器上执行文件上传命令,可以成功。

hadoop fs -put XXX.txt /user/appuser/

这个可以排除是数据版本不一致的问题,也可以排除是namenode和datanode的通信问题。那就还剩一种可能,本地服务和datanode的通信问题。

再回想hdfs的读写机制,dfsClient先从namenode那获取,数据在datanode的存储信息。然后再直接从datanode里面读写数据。关于这个我以前有整理过《Hadoop 原理总结》

验证猜想,查看namenode的监听IP.



可见,namenode的监听IP正是内网IP。这种情况肯定是和本地的公网IP无法通信的。
所以,解决方案有两个:

  1. 所有hadoop节点绑定公网IP。这样namenode返回给本地服务的datanode地址就是公网IP;
  2. 搭建内网访问的VPN。这样连上vpn后就可以采用内网IP进行通信。

第一种相对麻烦,修改的配置较多,容易出错。我采用的是第二种,用pptpd搭建一个VPN。这是我以前记录的搭建pptpd的方式,可以参考一下《阿里云ecs pptpd vpn配置》

相关文章

  • Hadoop HDFS 的 I/O 流操作

    HDFS 文件上传 HDFS 文件下载 定位文件读取 文件合并

  • HDFS 无法上传和下载文件

    最近公司部署了新的hadoop集群。以前部署的cloudera是阿里云的经典网络。默认是在内网环境,需要vpn才能...

  • 通过API访问HDFS

    通过API操作HDFS 今天的主要内容 HDFS获取文件系统 HDFS文件上传 HDFS文件下载 HDFS目录创建...

  • hadoop常见的面试题

    一、hdfs上传和下载文件流程 hdfs上传 客户端向namenode发出请求建立通信获得存储文件块的datano...

  • Hive常用函数

    1 常见本地文件: 2 上传到hdfs上: 3 下载到指定目录: 4 创建外部表: 5 加载hdfs文件: 加载本...

  • eclipse实现hdfs文件上传下载

    前一篇介绍了eclipse搭建hadoop开发环境,这一篇通过代码来实现hdfs的上传和下载文件功能 上传文件 很...

  • hadoop相关

    19.7.1hadoop从本地上传,下载文件到hdfs里面下载:hadoop fs -get /user/biz_...

  • 分布式常用命令

    Hadoop创建文件: 上传文件到hdfs 查看hdfs文件 删除hdfs文件/文件夹 解压zip文件到指定目录 ...

  • 使用IO流操作HDFS

    除了可以使用系统API进行HDFS操作,还可以通过Java的IO流进行文件的上传和下载。适用于HDFS的自定义操作...

  • 大数据学习资料,大数据面试题分享

    1、 针对每场面试来说必问的一个问题:自我介绍。 2、讲述HDFS上传文件和读文件的流程 3、HDFS在上传文件的...

网友评论

      本文标题:HDFS 无法上传和下载文件

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