zoukankan      html  css  js  c++  java
  • JAVA API连接HDFS HA集群

    使用JAVA API连接HDFS时我们需要使用NameNode的地址,开启HA后,两个NameNode可能会主备切换,如果连接的那台主机NameNode挂掉了,连接就会失败. HDFS提供了nameservices的方式进行访问,这样只要有一个NameNode活着,都可以正常访问.

    HDFS NameNode HA

    在没有HA的环境中,通常使用NameNode hostname访问HDFS的URL.

    hdfs://hostname1.hadoop.local:8020

    为了保证HDFS服务的高可用,生产环境是必须要开启NameNode HA的,此时应该用nameservices作为统一的logical name连接HDFS.

    使用Ambari Enable NameNode HA之后,我的集群在hostname2.hadoop.local上增加了一个NameNode, HA相关的配置会自动产生.

    首先在Ambari UI上查看custom hdfs-site配置. 注意端口号要配成rpc的端口号,而不能是http/https的.

    dfs.nameservices=mycluster

    dfs.namenode.rpc-address.mycluster.nn1=hostname1.hadoop.local:8020

    dfs.namenode.rpc-address.mycluster.nn2=hostname2.hadoop.local:8020

    dfs.ha.namenodes.mycluster=nn1,nn2

    使用nameservices访问HDFS的URL:

    hdfs://mycluster:8020

    JAVA API连接HDFS HA代码如下:

    Configuration conf=new Configuration(false);

    String nameservices = "mycluster";

    String[] namenodesAddr = {"ochadoop111.jcloud.local:8020","ochadoop112.jcloud.local:8020"};

    String[] namenodes = {"nn1","nn2"};

    conf.set("fs.defaultFS", "hdfs://" + nameservices);

    conf.set("dfs.nameservices",nameservices);

    conf.set("dfs.ha.namenodes." + nameservices, namenodes[0]+","+namenodes[1]);

    conf.set("dfs.namenode.rpc-address." + nameservices + "." + namenodes[0], namenodesAddr[0]);

    conf.set("dfs.namenode.rpc-address." + nameservices + "." + namenodes[1], namenodesAddr[1]);

    conf.set("dfs.client.failover.proxy.provider." + nameservices,"org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider");

    String hdfsRPCUrl = "hdfs://" + nameservices + ":" + 8020;

    DistributedFileSystem dfs = new DistributedFileSystem();

    try {

        dfs.initialize(URI.create(hdfsRPCUrl),conf);

        Path tmpPath2 = new Path("/tmp2");

        dfs.mkdir(tmpPath2,new FsPermission("777"));

        FileStatus[] list = dfs.listStatus(new Path("/"));

        for (FileStatus file : list) {

            System.out.println(file.getPath());

        }

        dfs.setQuota(tmpPath2,100,1000);

    } catch (IOException e) {

        e.printStackTrace();

    } finally{

        try {

            dfs.close();

        } catch (IOException e) {

            e.printStackTrace();

        }

    }

    WebHDFS访问

    通过WebHDFS访问HA集群时,就没有rpc方式那么方便了,有四种解决方法,我觉得第4个方法最简单, YARN的ResourceManager HA我就是按这个思路处理的.

    使用httpfs,这个是CDH的产品,需要额外安装

    使用knox安全网关,这样访问的接口就都被knox统一了

    每次访问之前都从zookeeper中拿当前Active NameNode的地址

    每次访问轮询两个namenode

    YARN ResourceManager HA

    ResourceManager HA存在与NameNode HA类似的问题,能否通过统一的logical name访问RM的REST API呢? 答案是暂时不支持.

    目前YARN只能支持standy RM把请求重定向到Active RM上. 也就是说假如主备RM都活着,当客户端向standby RM发HTTP请求时,standby RM会重定向到active RM上,但是如果standby RM不幸挂掉了,而Active RM还正常工作,此时请求就会失败.

    解决方法其实也很简单,就是在调用RM REST API时轮询两个RM.

  • 相关阅读:
    We7从这里开始we7的功能和特点(1) 开源CMS
    We7 从这里开始系统基本概念 开源CMS
    开源cms系统We7 CMS 2.5Beta版源码发布 开源CMS
    庆五一,We7同步发行2.5正式版、2.6 Beta版! 开源CMS
    We7 从这里开始安装we7 开源CMS
    We7 从这里开始we7的功能和特点(3) 开源CMS
    We7 从这里开始we7的功能和特点(2) 开源CMS
    We7从这里开始认识we7 开源CMS
    Ocr技术 识别高级验证码
    SQl分区技术
  • 原文地址:https://www.cnblogs.com/dingjiaoyang/p/11685284.html
Copyright © 2011-2022 走看看