java hdfs ha_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.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值