[原文地址]

跨集群访问

发表于 2015-06-01   |  

简单总结下跨集群访问的多种方式。

跨集群访问HDFS

直接给出HDFS URI

我们平常执行hadoop fs -ls /之类的操作时,其实是读取的core-site.xml中fs.defaultFS的配置,去连接这个配置指定的NameNode。
其实可以直接给出完整的URI,即可访问不同的hdfs:

1
2
3
4
5
6
7
8
9
10
11
12
13
hadoop@inspur116:~/jxy/test/multiple_nn/hadoop-2.2.0/bin$ ./hadoop fs -ls hdfs://hadoop40.photo.163.org:8020/user
Found 17 items
drwx------ - ad hdfs 0 2015-02-09 14:48 hdfs://hadoop40.photo.163.org:8020/user/ad
drwxr-x--- - click_tracker hdfs 0 2015-01-22 16:09 hdfs://hadoop40.photo.163.org:8020/user/click_tracker
drwxr-xr-x - comic hdfs 0 2015-02-10 14:48 hdfs://hadoop40.photo.163.org:8020/user/comic
drwxr-x--- - easegame hdfs 0 2015-01-13 14:49 hdfs://hadoop40.photo.163.org:8020/user/easegame
 
hadoop@inspur116:~/jxy/test/multiple_nn/hadoop-2.2.0/bin$ ./hadoop fs -ls hdfs://backend3.photo.163.org:8020/user
Found 40 items
drwx------ - ad hdfs 0 2015-01-19 13:35 hdfs://backend3.photo.163.org:8020/user/ad
drwx------ - azkaban hdfs 0 2015-02-02 10:38 hdfs://backend3.photo.163.org:8020/user/azkaban
drwxr-x--- - blog hdfs 0 2015-02-02 10:38 hdfs://backend3.photo.163.org:8020/user/blog
drwx------ - censor hdfs 0 2015-02-10 03:00 hdfs://backend3.photo.163.org:8020/user/censor

这种方式缺点在于要知道NN的地址。如果不开启HA的话没什么问题,但开启HA后,NN的状态可能会在active和standby之间变化。如果去连接standby NN就会抛出异常。
而且这种写法也让HA失去意义了。我见过一些奇葩的用户,程序里直接写死了NN的IP地址。。。那还要HA干什么。

在客户端配置多个HA HDFS

其实就是HDFS Federation的配置。
关于HA的配置,其实完全是客户端的,跟服务端没关系,见HA集群中如何判断ActiveNN
所以可以修改客户端的hdfs-site.xml,修改以下配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<!-- hz-cluster1是本来就有的,加一个hz-cluster2 -->
<property>
<name>dfs.nameservices</name>
<value>hz-cluster1,hz-cluster2</value>
</property>
<!-- 以下是新增的hz-cluster2的HA配置 -->
<property>
<name>dfs.ha.namenodes.hz-cluster2</name>
<value>nn1,nn2</value>
</property>
<property>
<name>dfs.namenode.rpc-address.hz-cluster2.nn1</name>
<value>hadoop40.photo.163.org:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.hz-cluster2.nn2</name>
<value>hadoop41.photo.163.org:8020</value>
</property>
<property>
<name>dfs.namenode.http-address.hz-cluster2.nn1</name>
<value>hadoop40.photo.163.org:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.hz-cluster2.nn2</name>
<value>hadoop41.photo.163.org:50070</value>
</property>
<property>
<name>dfs.client.failover.proxy.provider.hz-cluster2</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>

然后即可访问多个集群:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# fs.defaultFS是hz-cluster1,所以不指定完整URI时,访问hz-cluster1
hadoop@inspur116:~/jxy/test/multiple_nn/hadoop-2.2.0/bin$ ./hadoop fs -ls /user
Found 40 items
drwx------ - ad hdfs 0 2015-01-19 13:35 /user/ad
drwx------ - azkaban hdfs 0 2015-02-02 10:38 /user/azkaban
drwxr-x--- - blog hdfs 0 2015-02-02 10:38 /user/blog
drwx------ - censor hdfs 0 2015-02-10 03:00 /user/censor
 
hadoop@inspur116:~/jxy/test/multiple_nn/hadoop-2.2.0/bin$ ./hadoop fs -ls hdfs://hz-cluster1/user
Found 40 items
drwx------ - ad hdfs 0 2015-01-19 13:35 hdfs://hz-cluster1/user/ad
drwx------ - azkaban hdfs 0 2015-02-02 10:38 hdfs://hz-cluster1/user/azkaban
drwxr-x--- - blog hdfs 0 2015-02-02 10:38 hdfs://hz-cluster1/user/blog
drwx------ - censor hdfs 0 2015-02-10 03:00 hdfs://hz-cluster1/user/censor
 
hadoop@inspur116:~/jxy/test/multiple_nn/hadoop-2.2.0/bin$ ./hadoop fs -ls hdfs://hz-cluster2/user
Found 17 items
drwx------ - ad hdfs 0 2015-02-09 14:48 hdfs://hz-cluster2/user/ad
drwxr-x--- - click_tracker hdfs 0 2015-01-22 16:09 hdfs://hz-cluster2/user/click_tracker
drwxr-xr-x - comic hdfs 0 2015-02-10 14:48 hdfs://hz-cluster2/user/comic
drwxr-x--- - easegame hdfs 0 2015-01-13 14:49 hdfs://hz-cluster2/user/easegame

好处就是利用了HA,一台NN挂掉时不用改配置。

利用ViewFs

官方文档

这个功能本来是用于HDFS Federation的,但也可以用于多集群。
类似linux的mount命令,将多个hdfs挂载到不同的目录。在hdfs-site.xml中加上相关配置:

1
2
3
4
5
6
7
8
9
<property>
<name>fs.viewfs.mounttable.dummyCluster.link./binjiang</name>
<value>hdfs://hz-cluster1/</value>
<!-- 这里用了HA的配置,也可以写死NN地址 -->
</property>
<property>
<name>fs.viewfs.mounttable.dummyCluster.link./xiaoshan</name>
<value>hdfs://hz-cluster2/</value>
</property>

修改core-site.xml的配置:

1
2
3
4
<property>
<name>fs.defaultFS</name>
<value>viewfs://dummyCluster</value>
</property>

然后即可访问多个集群:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
hadoop@inspur116:~/jxy/test/multiple_nn/hadoop-2.2.0/bin$ ./hadoop fs -ls /
Found 2 items
-r--r--r-- - da@HADOOP.HZ.NETEASE.COM lofter_apache 0 2015-02-10 18:57 /binjiang
-r--r--r-- - da@HADOOP.HZ.NETEASE.COM lofter_apache 0 2015-02-10 18:57 /xiaoshan
 
hadoop@inspur116:~/jxy/test/multiple_nn/hadoop-2.2.0/bin$ ./hadoop fs -ls /binjiang/user
Found 40 items
drwx------ - ad hdfs 0 2015-01-19 13:35 /binjiang/user/ad
drwx------ - azkaban hdfs 0 2015-02-02 10:38 /binjiang/user/azkaban
drwxr-x--- - blog hdfs 0 2015-02-02 10:38 /binjiang/user/blog
drwx------ - censor hdfs 0 2015-02-10 03:00 /binjiang/user/censor
 
# 也可以写完整的URI,否则就用fs.defaultFS的配置
hadoop@inspur116:~/jxy/test/multiple_nn/hadoop-2.2.0/bin$ ./hadoop fs -ls viewfs://dummyCluster/xiaoshan/user
Found 17 items
drwx------ - ad hdfs 0 2015-02-09 14:48 viewfs://dummyCluster/xiaoshan/user/ad
drwxr-x--- - click_tracker hdfs 0 2015-01-22 16:09 viewfs://dummyCluster/xiaoshan/user/click_tracker
drwxr-xr-x - comic hdfs 0 2015-02-10 14:48 viewfs://dummyCluster/xiaoshan/user/comic
drwxr-x--- - easegame hdfs 0 2015-01-13 14:49 viewfs://dummyCluster/xiaoshan/user/easegame
 
# 这里其实是跨集群的copy,但背后细节被隐藏了
hadoop@inspur116:~/jxy/test/multiple_nn/hadoop-2.2.0/bin$ ./hadoop fs -cp /binjiang/tmp/hadoop /xiaoshan/tmp

上面的例子中只有一个虚拟集群dummyCluster。其实也可以虚拟多个集群,每个虚拟集群可以挂载任意多hdfs,只要路径不冲突即可。还可以挂载子目录。具体不展开了,参考官方文档。

一些问题

上面所有例子中的配置,都是客户端的。只在当前客户端生效。好处是不需要服务端改配置(一般要重启),用户可以自己选择。
如果两边集群的认证方式不同(比如一个kerberos一个simple),是否能访问没测试过。
在我们的配置中,两边的集群用的是同样的KDC,所以用户信息是相通的,hdfs权限也是相通的。如果用了两个KDC,是否能访问没测试过。
上述配置中的hz-cluster1/hz-cluster2等字符串,其实用户也可以换成任意值,都是客户端配置。

跨集群YARN

跨集群跑YARN任务是可行的,但有些限制。NM在跑任务时也是hdfs客户端,如果想让NM能访问不同hdfs的数据,就要加上面说过的那些配置(多个HA配置或ViewFs)。简言之,要改服务端配置。
如果不改服务端配置,就只能写死NN地址。
注意,任务提交到哪个YARN集群只跟当前客户端的yarn-site.xml有关。跟访问哪个hdfs无关。
理论上YARN集群和hdfs集群可以是完全不同的物理机。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 以下都是以滨江集群的客户端为例
 
# 可以运行。输入数据在滨江集群,输出写到萧山集群
hadoop@inspur116:~/jxy/test/multiple_nn/hadoop-2.2.0/bin$ ./hadoop jar ../share/hadoop/mapreduce/hadoop-mapreduce-examples-2.2.0.jar wordcount /tmp/hadoop hdfs://hadoop40.photo.163.org:8020/tmp/multiple_nn
 
# 可以运行。输入是萧山集群的,任务在滨江集群运行,输出写到滨江。
hadoop@inspur116:~/jxy/test/multiple_nn/hadoop-2.2.0/bin$ ./hadoop jar ../share/hadoop/mapreduce/hadoop-mapreduce-examples-2.2.0.jar wordcount hdfs://hadoop40.photo.163.org/user/comic/mobile/hadoop /tmp/multiple_nn
 
# 和上一条命令是一样效果。服务端有hz-cluster1的配置。
hadoop@inspur116:~/jxy/test/multiple_nn/hadoop-2.2.0/bin$ ./hadoop jar ../share/hadoop/mapreduce/hadoop-mapreduce-examples-2.2.0.jar wordcount hdfs://hadoop40.photo.163.org/user/comic/mobile/hadoop hdfs://hz-cluster1/tmp/multiple_nn
 
# 运行失败。只有当前客户端知道hz-cluster2指的是哪台机器,服务端没这个配置
hadoop@inspur116:~/jxy/test/multiple_nn/hadoop-2.2.0/bin$ ./hadoop jar ../share/hadoop/mapreduce/hadoop-mapreduce-examples-2.2.0.jar wordcount hdfs://hz-cluster2/user/comic/mobile/hadoop /tmp/multiple_nn
 
# 运行失败。理由同上。
hadoop@inspur116:~/jxy/test/multiple_nn/hadoop-2.2.0/bin$ ./hadoop jar ../share/hadoop/mapreduce/hadoop-mapreduce-examples-2.2.0.jar wordcount /tmp/hadoop hdfs://hz-cluster2/tmp/multiple_nn

distcp命令的本质也是提交一个MR,所以也受上述规则的限制。
如果修改服务端的配置,应该就可以用hz-cluster2了,没试过。要修改所有节点的配置文件,代价比较大。

Hadoop 跨集群访问的更多相关文章

  1. Hadoop跨集群迁移数据(整理版)

    1. 什么是DistCp DistCp(分布式拷贝)是用于大规模集群内部和集群之间拷贝的工具.它使用Map/Reduce实现文件分发,错误处理和恢复,以及报告生成.它把文件和目录的列表作为map任务的 ...

  2. 大数据实操2 - hadoop集群访问——Hadoop客户端访问、Java API访问

    上一篇中介绍了hadoop集群搭建方式,本文介绍集群的访问.集群的访问方式有两种:hadoop客户端访问,Java API访问. 一.集群客户端访问 Hadoop采用C/S架构,可以通过客户端对集群进 ...

  3. 中国联通改造 Apache DolphinScheduler 资源中心,实现计费环境跨集群调用与数据脚本一站式访问

    截止2022年,中国联通用户规模达到4.6亿,占据了全中国人口的30%,随着5G的推广普及,运营商IT系统普遍面临着海量用户.海量话单.多样化业务.组网模式等一系列变革的冲击. 当前,联通每天处理话单 ...

  4. Hive跨集群迁移

    Hive跨集群迁移数据工作是会出现的事情, 其中涉及到数据迁移, metastore迁移, hive版本升级等. 1. 迁移hdfs数据至新集群hadoop distcp -skipcrccheck ...

  5. 实现Kubernetes跨集群服务应用的高可用

    在Kubernetes 1.3版本,我们希望降低跨集群跨地区服务部署相关的管理和运营难度.本文介绍如何实现此目标. 注意:虽然本文示例使用谷歌容器引擎(GKE)来提供Kubernetes集群,您可以在 ...

  6. 暑假第二弹:基于docker的hadoop分布式集群系统的搭建和测试

    早在四月份的时候,就已经开了这篇文章.当时是参加数据挖掘的比赛,在计科院大佬的建议下用TensorFlow搞深度学习,而且要在自己的hadoop分布式集群系统下搞. 当时可把我们牛逼坏了,在没有基础的 ...

  7. 使用Docker在本地搭建Hadoop分布式集群

    学习Hadoop集群环境搭建是Hadoop入门必经之路.搭建分布式集群通常有两个办法: 要么找多台机器来部署(常常找不到机器) 或者在本地开多个虚拟机(开销很大,对宿主机器性能要求高,光是安装多个虚拟 ...

  8. 一脸懵逼学习Hadoop分布式集群HA模式部署(七台机器跑集群)

    1)集群规划:主机名        IP      安装的软件                     运行的进程master    192.168.199.130   jdk.hadoop      ...

  9. 基于zookeeper的高可用Hadoop HA集群安装

    (1)hadoop2.7.1源码编译 http://aperise.iteye.com/blog/2246856 (2)hadoop2.7.1安装准备 http://aperise.iteye.com ...

随机推荐

  1. golang 无法将Slice类型[]a 转换为 Slice[]b

    因为我想做一个通用的Slice方法,AnySlice,但是将AnySlice定义为[]interface{ } 转换到别的类型,或者相互转换的时候都是会报错. 这是golang比较恶心人的一个地方了, ...

  2. 如何做好Puppet Modules管理

    如何做好Puppet Modules管理 不同于其他的Openstack项目,puppet modules是一个数量庞大的存在.以我们当前在使用中的puppet modules为例,就已经多达96个( ...

  3. CAS的单点登录和oauth2的最大区别

    CAS的单点登录时保障客户端的用户资源的安全 oauth2则是保障服务端的用户资源的安全 CAS客户端要获取的最终信息是,这个用户到底有没有权限访问我(CAS客户端)的资源. oauth2获取的最终信 ...

  4. phpexcel 导入超过26列、处理时间格式

    见地址:http://www.thinkphp.cn/topic/33376.html excel处理时间: https://blog.csdn.net/xqd890608/article/detai ...

  5. 【ThinkPHP】ThinkPHP环境的安装与配置

    ThinkPHP是一个免费开源的,快速.简单的面向对象的轻量级PHP开发框架. 严格来说,ThinkPHP无需安装过程,这里所说的安装其实就是把ThinkPHP框架放入WEB运行环境(前提是你的WEB ...

  6. linux内核剖析(十一)进程间通信之-共享内存Shared Memory

    共享内存 共享内存是进程间通信中最简单的方式之一. 共享内存是系统出于多个进程之间通讯的考虑,而预留的的一块内存区. 共享内存允许两个或更多进程访问同一块内存,就如同 malloc() 函数向不同进程 ...

  7. WebViewJavascriptBridge 进行js 与native通信。

    1,  iOS端加载web页面.开启日志并给webView建立JS与OC的桥梁 - (void)viewWillAppear:(BOOL)animated { if (_bridge) { retur ...

  8. [elk]bin/elasticsearch-sql-cli使用

    在探sql groupby语句 这个长久不用竟然忘记 part name age dep1 ara 22 dep1 arb 22 dep1 arc 22 dep2 ema 10 dep2 emc 11 ...

  9. Could not resolve all dependencies for configuration ':classpath'

    我这里是copy过来的项目包名没有修改,导致依赖找不到

  10. JavaWeb开发环境配置

    JavaWeb开发环境配置(win7_64bit) 目录 1.概述 2.JavaWeb学习路线 3.JavaWeb常用开发环境搭建 4.注意事项 >>看不清的图片可在新标签打开查看大图 1 ...