大数据实操篇 No.3-Hadoop HA高可用集群搭建

第1章 hadoop 高可用介绍

Hadoop高可用,除了数据存储的多副本机制之外,就是 Namenode和Resourcemanager的高可用。

在Hadoop2.0之前,Namenode只有一个,存在单点问题(虽然Hadoop1.0有SecondaryNamenode,CheckPointNode,BackupNode这些,但是单点问题依然存在),在Hadoop2.0引入了HA机制。Hadoop2.0的HA机制官方介绍了有2种方式,一种是NFS(Network File System)方式,另外一种是QJM(Quorum Journal Manager)方式。

启动了Hadoop2.0的HA机制之后,SecondaryNameNode,CheckpointNode,BackupNode这些都不需要了。

Namenode的高可用依赖于:

JournalNode负责数据交换

ZKFailoverController(又简称为ZKFC),内部会启动HealthMonitorActiveStandbyElector组件;HealthMonito做Namenode的健康状态检测;ActiveStandbyElector负责和zookeeper连接做主备选举。

Resourcemanager高可用依赖于:

Resourcemanager内部的主备选择器,连接Zookeeper做主备选举。

第2章 集群规划

Zookeeper集群(笔者zookeeper是单独的集群,不和hadoop放在一起)

 

Zookeeper110

Zookeeper111

Zookeeper112

QuorumPeerMain

 

Hadoop集群

 

Hadoop100

Hadoop101

Hadoop102

NameNode

 

DataNode

DFSZKFailoverController

 

JournalNode

ResourceManager

 

NodeManager

 

第3章 集群部署

3.1 修改配置文件

3.1.1 修改core-site.xml

<configuration>
<!--指定HDFS中NameNode的地址 hadoop100:9000-->
<property>
  <name>fs.defaultFS</name>
  <value>hdfs://jed/</value>
</property>
<!--指定Hadoop运行时产生文件的存储目录-->
<property>
  <name>hadoop.tmp.dir</name>
  <value>/opt/module/hadoop-3.1.2/data/tmp</value>
</property>
<!-- 指定 zookeeper 集群访问地址 -->
<property>
  <name>ha.zookeeper.quorum</name>
  <value>zookeeper110:2181,zookeeper111:2181,zookeeper112:2181</value>
</property>

<property>
  <name>ipc.client.connect.max.retries</name>
  <value>100</value>
  <description>
  Indicates the number of retries a client will make to establisha server connection.
  </description>
</property>
</configuration>

3.1.2 修改hdfs-site.xml

<configuration>
    <!--指定HDFS地址 -->
    <!-- <property>
        <name>dfs.http.address</name>
        <value>hadoop100:50070</value>
    </property> -->
    <!--指定HDFS副本数量 -->
    <property>
        <name>dfs.replication</name>
        <value>3</value>
    </property>
    <!--指定HDFS中辅助名称节点secondary节点主机配置 -->
    <!-- <property>
        <name>dfs.namenode.secondary.http-address</name>
        <value>hadoop102:50090</value>
    </property> -->

    <!--指定 hdfs 的 nameservice 为 jed,需要和 core-site.xml 中保持一致-->
    <property>
        <name>dfs.nameservices</name>
        <value>jed</value>
    </property>
    <!-- jed 下面有两个 NameNode,分别是 nn1,nn2 -->
    <property>
        <name>dfs.ha.namenodes.jed</name>
        <value>nn1,nn2</value>
    </property>

     <!-- nn1 的 RPC 通信地址 -->
    <property>
        <name>dfs.namenode.rpc-address.jed.nn1</name>
        <value>hadoop100:9000</value>
    </property>
    <!-- nn1 的 http 通信地址 -->
    <property>
        <name>dfs.namenode.http-address.jed.nn1</name>
        <value>hadoop100:50070</value>
    </property>
     <!-- nn2 的 RPC 通信地址 -->
    <property>
        <name>dfs.namenode.rpc-address.jed.nn2</name>
        <value>hadoop101:9000</value>
    </property>
    <!-- nn2 的 http 通信地址 -->
    <property>
        <name>dfs.namenode.http-address.jed.nn2</name>
        <value>hadoop101:50070</value>
    </property>

    <!-- 指定 NameNode 的 edits 元数据在 JournalNode 上的存放位置 -->
    <property>
        <name>dfs.namenode.shared.edits.dir</name>
        <value>qjournal://hadoop100:8485;hadoop101:8485;hadoop102:8485/jed</value>
    </property>
    <!-- 指定 JournalNode 在本地磁盘存放数据的位置 -->
    <property>
        <name>dfs.journalnode.edits.dir</name>
        <value>/opt/module/hadoop-3.1.2/journaldata</value>
    </property>

    <!-- 开启 NameNode 失败自动切换 -->
    <property>
        <name>dfs.ha.automatic-failover.enabled</name>
        <value>true</value>
    </property>
    <!-- 配置失败自动切换实现方式 -->
    <!-- 此处配置较长,在安装的时候切记检查不要换行-->
    <property>
        <name>dfs.client.failover.proxy.provider.jed</name>
        <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
    </property>

    <!-- 配置隔离机制方法,多个机制用换行分割,即每个机制占用一行-->
    <property>
        <name>dfs.ha.fencing.methods</name>
        <value>
            sshfence
            shell(/bin/true)
        </value>
    </property>
    <!-- 使用 sshfence 隔离机制时需要 ssh 免登陆 -->
    <property>
        <name>dfs.ha.fencing.ssh.private-key-files</name>
        <value>/home/zihao/.ssh/id_rsa</value>
    </property>
    <!-- 配置 sshfence 隔离机制超时时间(30s) -->
    <property>
        <name>dfs.ha.fencing.ssh.connect-timeout</name>
        <value>30000</value>
    </property>
    
</configuration>

3.1.3 修改mapred-site.xml

<configuration>
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
    <property>
        <name>mapreduce.application.classpath</name>
        <value>$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/*:$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/lib/*</value>
    </property>
    <!--历史服务器地址-->
    <property>
        <name>mapreduce.jobhistory.address</name>
        <value>hadoop102:10020</value>
    </property>
    <!--历史服务器web端地址-->
    <property>
        <name>mapreduce.jobhistory.webapp.address</name>
        <value>hadoop102:19888</value>
    </property>

    <property>
      <name>mapreduce.map.memory.mb</name>
      <value>512</value>
    </property>
    <property>
      <name>mapreduce.map.java.opts</name>
      <value>-Xmx512M</value>
    </property>
    <property>
      <name>mapreduce.reduce.memory.mb</name>
      <value>512</value>
    </property>
    <property>
      <name>mapreduce.reduce.java.opts</name>
      <value>-Xmx512M</value>
    </property>
</configuration>

3.1.4 修改yarn-site.xml

<configuration>

<!-- Site specific YARN configuration properties -->

    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
    <!-- <property>
        <name>yarn.resourcemanager.hostname</name>
        <value>hadoop101</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>

    <property>
        <name>yarn.log.server.url</name>
        <value>http://hadoop102:19888/jobhistory/logs</value>
    </property>
    <!-- 日志聚集功能使能 -->
    <property>
        <name>yarn.log-aggregation-enable</name>
        <value>true</value>
    </property>
    <!-- 日志保留时间设置 7 天 -->
    <property>
        <name>yarn.log-aggregation.retain-seconds</name>
        <value>604800</value>
    </property>

    <!-- 开启 RM 高可用 -->
    <property>
        <name>yarn.resourcemanager.ha.enabled</name>
        <value>true</value>
    </property>
    <!-- 指定 RM 的 cluster id,可以自定义-->
    <property>
        <name>yarn.resourcemanager.cluster-id</name>
        <value>haoyarn</value>
    </property>

    <!-- 指定 RM 的名字,可以自定义 -->
    <property>
        <name>yarn.resourcemanager.ha.rm-ids</name>
        <value>rm1,rm2</value>
    </property>
    <!-- 分别指定各 RM 的地址 -->
    <property>
        <name>yarn.resourcemanager.hostname.rm1</name>
        <value>hadoop101</value>
    </property>
    <property>
        <name>yarn.resourcemanager.hostname.rm2</name>
        <value>hadoop102</value>
    </property>
    <property> 
        <name>yarn.resourcemanager.webapp.address.rm1</name>  
        <value>hadoop101:8088</value> 
    </property>
    <property> 
        <name>yarn.resourcemanager.webapp.address.rm2</name>  
        <value>hadoop102:8088</value> 
    </property>

    <!-- 指定 zk 集群地址 -->
    <property>
        <name>yarn.resourcemanager.zk-address</name>
        <value>zookeeper110:2181,zookeeper111:2181,zookeeper112:2181</value>
    </property>
    <!-- 制定 resourcemanager 的状态信息存储在 zookeeper 集群上-->
    <property>
        <name>yarn.resourcemanager.store.class</name>
        <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
    </property>
</configuration>

3.2 初始化

3.2.1 格式化namenode

格式化hadoop100上的namenode,在namenode节点上操作(生产环境不要随便执行,很危险,格式化后,数据不客恢复)

$ hadoop namenode -format

3.2.2 同步namenode元数据

同步namenode元数据到另一个nanenode节点(hadoop102)

$ scp -r /opt/module/hadoop-3.1.2/data/tmp hadoop101: /opt/module/hadoop-3.1.2/data/tmp

 或者直接用分发脚本分发

$ xsync /opt/module/adoop-3.1.2/data/tmp

也可以在standby节点上主动同步

$ hadoop namenode -bootstrapStandby

3.2.3 格式化DFSZKFailoverController (ZKFC)

任选一个namenode执行

$ hdfs zkfc -formatZK

3.3 启动集群

3.3.1 先启动zookeeper集群

Namenode和Resourcemanager的高可用都依赖于zookeeper做主备切换,所以必须先启动zookeeper集群

3.3.2 启动JournalNode

可在每台hadoop机器上单独启动journalnode,也可绕过此步,直接启动hdfs(默认启动所有节点的Journalnode)

$ sbin/hadoop-daemon.sh start journalnode

启动后进程

7311 JournalNode

3.3.3 启动hdfs

[zihao@hadoop100 hadoop-3.1.2]$ sbin/start-dfs.sh 
Starting namenodes on [hadoop100 hadoop101]
Starting datanodes
Starting journal nodes [hadoop100 hadoop101 hadoop102]
Starting ZK Failover Controllers on NN hosts [hadoop100 hadoop101]

3.3.4启动yarn

[zihao@hadoop101 hadoop-3.1.2]$ sbin/start-yarn.sh 
Starting resourcemanagers on [ hadoop101 hadoop102]
Starting nodemanagers

在hadoop102上启动历史服务

$ sbin/mr-jobhistory-daemon.sh start historyserver

*可以自己写一个统一脚本做群起

第4章 检查高可用各进程运行情况

4.1运行进程

[zihao@zookeeper110 apache-zookeeper-3.5.7-bin]$ xsh jps
-----------zookeeper110-----------
7415 QuorumPeerMain
7643 Jps
-----------zookeeper111-----------
7231 QuorumPeerMain
7391 Jps
-----------zookeeper112-----------
7160 QuorumPeerMain
7279 Jps
-----------hadoop100-----------
14690 NodeManager
18309 NameNode
18440 DataNode
18888 DFSZKFailoverController
18666 JournalNode
18942 Jps
-----------hadoop101-----------
13712 DataNode
13618 NameNode
11621 NodeManager
11494 ResourceManager
13977 DFSZKFailoverController
14011 Jps
13820 JournalNode
-----------hadoop102-----------
10544 DataNode
10711 Jps
9256 ResourceManager
9356 NodeManager
10652 JournalNode

4.2 打开web界面

hdfs的namenode,一个为active,另一个为standby

 

yarn的resourcemanager,一个为active,另一个为standby

当active节点发生故障时,standby节点会立即被切换为active,可自己kill进程检查,到web界面上观察,或到zookeeper下节点查看节点状态。

猜你喜欢

转载自blog.csdn.net/dzh284616172/article/details/107372558