Hadoop HA 集群搭建

Hadoop HA 集群搭建 

1、Hadoop HA 原理概述 

为什么会有 hadoop HA 机制呢? 
 
HA:High Available,高可用 在Hadoop 2.0之前,在HDFS 集群中NameNode 存在单点故障 (SPOF: A Single Point of Failure)。 对于只有一个 NameNode 的集群,如果 NameNode 机器出现故障(比如宕机或是软件、硬件 升级),那么整个集群将无法使用,直到 NameNode 重新启动 
 
那如何解决呢? 
 
HDFS 的 HA 功能通过配置 Active/Standby 两个 NameNodes 实现在集群中对 NameNode 的 热备来解决上述问题。如果出现故障,如机器崩溃或机器需要升级维护,这时可通过此种方 式将 NameNode 很快的切换到另外一台机器。 
 
在一个典型的 HDFS(HA) 集群中,使用两台单独的机器配置为 NameNodes 。在任何时间点, 确保 NameNodes 中只有一个处于 Active 状态,其他的处在 Standby 状态。其中 ActiveNameNode 负责集群中的所有客户端操作,StandbyNameNode 仅仅充当备机,保证一 旦 ActiveNameNode 出现问题能够快速切换。 
 
为了能够实时同步 Active 和 Standby 两个 NameNode 的元数据信息(实际上 editlog),需提 供一个共享存储系统,可以是 NFS、QJM(Quorum Journal Manager)或者 Zookeeper,Active Namenode 将数据写入共享存储系统,而 Standby 监听该系统,一旦发现有新数据写入,则 读取这些数据,并加载到自己内存中,以保证自己内存状态与 Active NameNode 保持基本一 致,如此这般,在紧急情况下 standby 便可快速切为 active namenode。为了实现快速切换, Standby 节点获取集群的最新文件块信息也是很有必要的。为了实现这一目标,DataNode 需 要配置 NameNodes 的位置,并同时给他们发送文件块信息以及心跳检测。 

Hadoop HA 集群搭建

2、集群规划 

描述:hadoop HA 集群的搭建依赖于 zookeeper,所以选取三台当做 zookeeper 集群 

Hadoop HA 集群搭建

Hadoop HA 集群搭建 

Hadoop HA 集群搭建 

Hadoop HA 集群搭建 

3、集群服务器准备  

1、 修改主机名

2、 修改 IP 地址

3、 添加主机名和 IP 映射

4、 添加普通用户 hadoop 用户并配置 sudoer 权限

5、 设置系统启动级别

6、 关闭防火墙/关闭 Selinux

7、 安装 JDK 两种准备方式: 1、 每个节点都单独设置,这样比较麻烦。线上环境可以编写脚本实现 2、 虚拟机环境可是在做完以上 7 步之后,就进行克隆 3、 然后接着再给你的集群配置 SSH 免密登陆和搭建时间同步服务

8、 配置 SSH 免密登录

9、 同步服务器时间 

4、集群安装 

4.1、 安装 Zookeeper 集群 在此略过,见 zookeeper 安装文档 

4.2、 安装 hadoop 集群 

Hadoop HA 集群搭建

4.2.1配置文件的修改:

1、 修改 hadoop-env.sh 

修改一行 export JAVA_HOME= /usr/local/jdk1.8.0_73 

2、 修改 core-site.xml 

    <configuration> <!-- 指定 hdfs 的 nameservice 为 myha01 -->
        <property>
            <name>fs.defaultFS</name>
            <value>hdfs://myha01/</value>
        </property>

        <!-- 指定 hadoop 工作目录 -->
        <property>
            <name>hadoop.tmp.dir</name>
            <value>/home/hadoop/data/hadoopdata/</value>
        </property>

        <!-- 指定 zookeeper 集群访问地址 -->
        <property>
            <name>ha.zookeeper.quorum</name>
            <value>hadoop02:2181,hadoop03:2181,hadoop04:2181</value>
        </property>
    </configuration>

 3、 修改 hdfs-site.xml 

<configuration> 
    <!-- 指定副本数 -->
    <property>
        <name>dfs.replication</name>
        <value>3</value>
    </property>

    <!--指定 hdfs 的 nameservice 为 myha01,需要和 core-site.xml 中保持一致-->
    <property>
        <name>dfs.nameservices</name>
        <value>myha01</value>
    </property>

    <!-- myha01 下面有两个 NameNode,分别是 nn1,nn2 -->
    <property>
        <name>dfs.ha.namenodes.myha01</name>
        <value>nn1,nn2</value>
    </property>
    <!-- nn1 的 RPC 通信地址 -->
    <property>
        <name>dfs.namenode.rpc-address.myha01.nn1</name>
        <value>hadoop02:9000</value>
    </property>

    <!-- nn1 的 http 通信地址 -->
    <property>
        <name>dfs.namenode.http-address.myha01.nn1</name>
        <value>hadoop02:50070</value>
    </property>

    <!-- nn2 的 RPC 通信地址 -->
    <property>
        <name>dfs.namenode.rpc-address.myha01.nn2</name>
        <value>hadoop03:9000</value>
    </property>

    <!-- nn2 的 http 通信地址 -->
    <property>
        <name>dfs.namenode.http-address.myha01.nn2</name>
        <value>hadoop03:50070</value>
    </property>

    <!-- 指定 NameNode 的 edits 元数据在 JournalNode 上的存放位置 -->
    <property>
        <name>dfs.namenode.shared.edits.dir</name>
        <value>qjournal://hadoop02:8485;hadoop03:8485;hadoop04:8485/myha01</value>
    </property>

    <!-- 指定 JournalNode 在本地磁盘存放数据的位置 -->
    <property>
        <name>dfs.journalnode.edits.dir</name>
        <value>/home/hadoop/data/journaldata</value>
    </property>

    <!-- 开启 NameNode 失败自动切换 -->
    <property>
        <name>dfs.ha.automatic-failover.enabled</name>
        <value>true</value>
    </property>

    <!-- 配置失败自动切换实现方式 --> <!-- 此处配置在安装的时候切记检查不要换行-->
    <property>
        <name>dfs.client.failover.proxy.provider.myha01</name>
        <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverPr oxyProvider</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/hadoop/.ssh/id_rsa</value>
    </property>

    <!-- 配置 sshfence 隔离机制超时时间 -->
    <property>
        <name>dfs.ha.fencing.ssh.connect-timeout</name>
        <value>30000</value>
    </property>
</configuration>
 

 4、 修改 mapred-site.xml 

<configuration> 
    <!-- 指定 mr 框架为 yarn 方式 -->
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>

    <!-- 设置 mapreduce 的历史服务器地址和端口号 -->
    <property>
        <name>mapreduce.jobhistory.address</name>
        <value>hadoop02:10020</value>
    </property>

    <!-- mapreduce 历史服务器的 web 访问地址 -->
    <property>
        <name>mapreduce.jobhistory.webapp.address</name>
        <value>hadoop02:19888</value>
    </property>
</configuration>  
 

5、 修改 yarn-site.xml 

<configuration> 
    <!-- 开启 RM 高可用 -->
    <property>
        <name>yarn.resourcemanager.ha.enabled</name>
        <value>true</value>
    </property>

    <!-- 指定 RM 的 cluster id -->
    <property>
        <name>yarn.resourcemanager.cluster-id</name>
        <value>yrc</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>hadoop04</value>
    </property>

    <property>
        <name>yarn.resourcemanager.hostname.rm2</name>
        <value>hadoop05</value>
    </property>

    <!-- 指定 zk 集群地址 -->
    <property>
        <name>yarn.resourcemanager.zk-address</name>
        <value>hadoop02:2181,hadoop03:2181,hadoop04:2181</value>
    </property>

    <!-- 要运行 MapReduce 程序必须配置的附属服务 -->
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>

    <!-- 开启 YARN 集群的日志聚合功能 -->
    <property>
        <name>yarn.log-aggregation-enable</name>
        <value>true</value>
    </property>

    <!--  YARN 集群的聚合日志最长保留时长 -->
    <property>
        <name>yarn.log-aggregation.retain-seconds</name>
        <value>86400</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.ZKRMStateSt ore</value>
    </property>
</configuration> 
 

6、 修改 slaves 

vi slaves 
添加 datanode 的节点地址: 
hadoop02 
hadoop03 
hadoop04 
hadoop05

7、 分发安装包到其他机器 

scp -r hadoop-2.6.5 [email protected]:$PWD

scp -r hadoop-2.6.5 [email protected]:$PWD

scp -r hadoop-2.6.5 [email protected]:$PWD 

...

8、 并分别配置环境变量 

vi ~/.bashrc 添加两行:

export HADOOP_HOME=/home/hadoop/apps/hadoop-2.6.5

export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

保存退出

4.2.2 集群初始化操作(记住:严格按照以下步骤执行) 

1、 先启动 zookeeper 集群

启动:zkServer.sh start

检查启动是否正常:zkServer.sh status 

Hadoop HA 集群搭建

2、 分别在每个 zookeeper(也就是规划的三个 journalnode 节点,不一定跟 zookeeper 节点一样)节点上启动 journalnode 进程 

Hadoop HA 集群搭建 

3、 在第一个 namenode 上执行格式化操作

[[email protected] ~]$ hadoop namenode -format  

Hadoop HA 集群搭建

4、 格式化 ZKFC 

Hadoop HA 集群搭建 

5、 启动 HDFS [[email protected] ~]$ start-dfs.sh 

Hadoop HA 集群搭建 

Hadoop HA 集群搭建 

Hadoop HA 集群搭建 

Hadoop HA 集群搭建 

Hadoop HA 集群搭建 

Hadoop HA 集群搭建 

Hadoop HA 集群搭建 

Hadoop HA 集群搭建