• Hadoop 跨集群访问


    [原文地址]

    跨集群访问

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

    跨集群访问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了,没试过。要修改所有节点的配置文件,代价比较大。

  • 相关阅读:
    服务的有状态和无状态
    微服务-服务治理
    微服务-服务注册与发现
    微服务-技术的选型
    微服务的数据一致性
    微服务的服务拆分
    初识微服务
    REST API风格
    算法
    JS 判断PC、android、ios、微信浏览器
  • 原文地址:https://www.cnblogs.com/suanec/p/7828139.html
Copyright © 2020-2023  润新知