Hadoop (HA) 集群搭建

x33g5p2x  于2021-03-09 转载在   
字(8.0k)|赞(0)|评价(0)|浏览(374)

前言,上一篇文章介绍了[快速搭建Hadoop生产集群(非22端口)]但是在生产环境下,往往要求集群不止一个主节点,还应当具备一个或者俩个standby状态的从节点,以免服务器发生故障时,影响实际生产。

** 高可用的了解**

上图为官网截图

实际上,在Hadoop2.x版本之前,Hadoop集群都是存在单点故障的问题,一旦namenode不可用,那么整个集群都将陷入非正常状态(因为很多外部连接都要跟namenode通信)。

** 高可用搭建**

首先把前文的集群通过scp命令拷贝至新的文件夹ha目录下,删除Hadoop目录下的data和logs文件,以确保集群处于初始化状态。(如果你新集群出现了不可处理的问题,需要初始化,请一定要将这两个文件删除后,再初始化namenode)

当然你也可以在原来的集群基础上,进行配置上的修改。

配置修改

dfs.nameservices - the logical name for this new nameservice

dfs.ha.namenodes.[nameservice ID] - unique identifiers for each NameNode in the nameservice

dfs.namenode.rpc-address.[nameservice ID].[name node ID]

dfs.namenode.http-address.[nameservice ID].[name node ID] 

dfs.namenode.shared.edits.dir - the location of the shared storage directory

dfs.client.failover.proxy.provider.[nameservice ID] - the Java class that HDFS clients use to contact the Active NameNode

dfs.ha.fencing.methods - a list of scripts or Java classes which will be used to fence the Active NameNode during a failover

Automatic Failover

高可用的实现是基于zk的功能实现的(不配置zk的话,只能手动进行容灾)

官网对自动容灾的说明。

配置完这俩个参数,实际上就宣告hdfs的HA配置完成,小伙伴可以查看三个namenode的节点情况.

有了hdfs HA 自然也有RM的HA

工作原理

自此,Hadoop集群高可用搭建完毕(小伙伴可任意kill掉主节点查看效果)。

重要提醒:

如果在搭建过程出现什么问题,则可以去Hadoop目录下的logs文件夹内,查询各个节点的相关log。最后祝大家学习顺利。

完整hdfs-site.xml配置如下

<configuration>

<!-- NameNode数据存储目录 -->

<property>

<name>dfs.namenode.name.dir</name>

<value>file://${hadoop.tmp.dir}/name</value>

</property>

<!-- DataNode数据存储目录 -->

<property>

<name>dfs.datanode.data.dir</name>

<value>file://${hadoop.tmp.dir}/data</value>

</property>

<!-- JournalNode数据存储目录 -->

<property>

<name>dfs.journalnode.edits.dir</name>

<value>${hadoop.tmp.dir}/jn</value>

</property>

<!-- 完全分布式集群名称 -->

<property>

<name>dfs.nameservices</name>

<value>mycluster</value>

</property>

<!-- 集群中NameNode节点都有哪些 -->

<property>

<name>dfs.ha.namenodes.mycluster</name>

<value>nn1,nn2,nn3</value>

</property>

<!-- NameNode的RPC通信地址 -->

<property>

<name>dfs.namenode.rpc-address.mycluster.nn1</name>

<value>xx01:8020</value>

</property>

<property>

<name>dfs.namenode.rpc-address.mycluster.nn2</name>

<value>xx02:8020</value>

</property>

<property>

<name>dfs.namenode.rpc-address.mycluster.nn3</name>

<value>xx03:8020</value>

</property>

<!-- NameNode的http通信地址 -->

<property>

<name>dfs.namenode.http-address.mycluster.nn1</name>

<value>xx01:9870</value>

</property>

<property>

<name>dfs.namenode.http-address.mycluster.nn2</name>

<value>xx02:9870</value>

</property>

<property>

<name>dfs.namenode.http-address.mycluster.nn3</name>

<value>xx03:9870</value>

</property>

<!-- 指定NameNode元数据在JournalNode上的存放位置 -->

<property>

<name>dfs.namenode.shared.edits.dir</name>

<value>qjournal://xx01:8485;xx02:8485;xx03:8485/mycluster</value>

</property>

<!-- 访问代理类:client用于确定哪个NameNode为Active -->

<property>

<name>dfs.client.failover.proxy.provider.mycluster</name>

<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>

</property>

<!-- 配置隔离机制,即同一时刻只能有一台服务器对外响应 -->

<property>

<name>dfs.ha.fencing.methods</name>

<value>sshfence(test:xxxx)</value>

</property>

<!-- 使用隔离机制时需要ssh秘钥登录-->

<property>

<name>dfs.ha.fencing.ssh.private-key-files</name>

<value>/home/test/.ssh/id_rsa</value>

</property>

<property>

<name>dfs.ha.fencing.ssh.connect-timeout</name>

<value>30000</value>

</property>

<!-- 启用nn故障自动转移 -->

<property>

<name>dfs.ha.automatic-failover.enabled</name>

<value>true</value>

</property>

<property>

<name>dfs.permissions.enabled</name>

<value>false</value>

</property>

</configuration>

core-site.xml配置

<configuration>

<!-- 把多个NameNode的地址组装成一个集群mycluster -->

<property>

<name>fs.defaultFS</name>

<value>hdfs://mycluster</value>

</property>

<!-- 指定hadoop运行时产生文件的存储目录 -->

<property>

<name>hadoop.tmp.dir</name>

<value>/opt/ha/hadoop-3.1.3/data</value>

</property>

<!-- 配置HDFS网页登录使用的静态用户为test -->

<property>

<name>hadoop.http.staticuser.user</name>

<value>test</value>

</property>

<!-- NN连接JN重试次数,默认是10次 -->

<property>

<name>ipc.client.connect.max.retries</name>

<value>20</value>

</property>

<!-- 重试时间间隔,默认1s -->

<property>

<name>ipc.client.connect.retry.interval</name>

<value>5000</value>

</property>

<!-- 指定zkfc要连接的zkServer地址 -->

<property>

<name>ha.zookeeper.quorum</name>

<value>xx01:2181,xx02:2181,xx03:2181</value>

</property>

</configuration>

yarn-site.xml 配置

<configuration>

<property>

<name>yarn.nodemanager.aux-services</name>

<value>mapreduce_shuffle</value>

</property>

<!-- 启用resourcemanager ha -->

<property>

<name>yarn.resourcemanager.ha.enabled</name>

<value>true</value>

</property>

<!-- 声明两台resourcemanager的地址 -->

<property>

<name>yarn.resourcemanager.cluster-id</name>

<value>cluster-yarn1</value>

</property>

<!--指定resourcemanager的逻辑列表-->

<property>

<name>yarn.resourcemanager.ha.rm-ids</name>

<value>rm1,rm2</value>

</property>

<!-- ========== rm1的配置 ========== -->

<!-- 指定rm1的主机名 -->

<property>

<name>yarn.resourcemanager.hostname.rm1</name>

<value>xx02</value>

</property>

<!-- 指定rm1的web端地址 -->

<property>

<name>yarn.resourcemanager.webapp.address.rm1</name>

     <value>xx02:8088</value>

</property>

<!-- 指定rm1的内部通信地址 -->

<property>

<name>yarn.resourcemanager.address.rm1</name>

<value>xx02:8032</value>

</property>

<!-- 指定AM向rm1申请资源的地址 -->

<property>

<name>yarn.resourcemanager.scheduler.address.rm1</name>

<value>xx02:8030</value>

</property>

<!-- 指定供NM连接的地址 -->

<property>

<name>yarn.resourcemanager.resource-tracker.address.rm1</name>

<value>xx02:8031</value>

</property>

<!-- ========== rm2的配置 ========== -->

<!-- 指定rm2的主机名 -->

<property>

<name>yarn.resourcemanager.hostname.rm2</name>

<value>xx03</value>

</property>

<property>

<name>yarn.resourcemanager.webapp.address.rm2</name>

<value>xx03:8088</value>

</property>

<property>

<name>yarn.resourcemanager.address.rm2</name>

<value>xx03:8032</value>

</property>

<property>

<name>yarn.resourcemanager.scheduler.address.rm2</name>

<value>xx03:8030</value>

</property>

<property>

<name>yarn.resourcemanager.resource-tracker.address.rm2</name>

<value>xx03:8031</value>

</property>

<!-- 指定zookeeper集群的地址 -->

<property>

<name>yarn.resourcemanager.zk-address</name>

        <value>xx01:2181,xx02:2181,xx03:2181</value>

</property>

<!-- 启用自动恢复 -->

<property>

<name>yarn.resourcemanager.recovery.enabled</name>

<value>true</value>

</property>

<!-- 指定resourcemanager的状态信息存储在zookeeper集群 -->

<property>

<name>yarn.resourcemanager.store.class</name> <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>

</property>

<!-- 环境变量的继承 -->

<property>

<name>yarn.nodemanager.env-whitelist</name>

<value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>

</property>

</configuration>

相关文章

最新文章

更多