Hadoop完全分布式高可用集群搭建

Hadoop完全分布式高可用集群搭建


1、    环境准备
certOS7, JDK1.8, 三台机器分别如下
Hostname    IP    Nn1    Nn2    Dn    Zk    Zkfc    jnn
prd-ecs-3    172.18.48.129    *        *    *    *    *
prd-ecs-4    172.18.48.130        *    *    *    *    *
test-ecs-2    172.18.96.146            *    *        *

关闭SELINUX,关闭防火墙,关闭iptables,或者设置对应端口或内网IP可互相通信。
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -s 172.18.0.0/16 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 88 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 89 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 99 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 9443 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 9876 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 18080 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 9870 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 8088 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 19888 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 16010 -j ACCEPT

设置各台机器的hostname
vi /etc/hostname
#设置成对应的名称

设置各台机器的 hosts, 将ip和hostname对应关系设置好
vi /etc/hosts
172.18.48.129 prd-ecs-3
172.18.48.130 prd-ecs-4
172.18.96.146 test-ecs-2

2、    linux ssh免密登陆配置
hadoop节点之间的通讯是通过ssh进行的,SSH默认都是需要密码的,开启免**登录会减少很多麻烦。操作很简单,两步(三步)就可以完成。
2.1 首先在本地生成公钥和私钥。分别在所有节点上执行:
ssh-****** -t rsa
#后面都按回车跳过即可(三次)
# 运行结束后在 ~/.ssh/下生成两个新文件: id_rsa.pub和id_rsa
#设置本机ssh免密
cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
    2.2 将公钥拷贝到本机和远程主机
ssh-copy-id [email protected] prd-ecs-4 
or
ssh-copy-id prd-ecs-4
ssh-copy-id test-ecs-2
……
# username是用户名 host是主机的地址
#远程主机将用户的公钥保存在 ~/.ssh/authorized_keys文件中
#或者直接手动复制也可以
    2.3 测试能否免密登陆:
        ssh prd-ecs-4

3、    安装JDK
下载jdk1.8, 解压安装
tar -xzvf jdk-8u211-linux-x64.tar.gz -C /home/data/
配置环境变量
vi /etc/profile
在最后面添加如下配置
# java setting
export JAVA_HOME=/home/data/jdk1.8.0_131
export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$CLASSPATH
export PATH=$PATH:$JAVA_HOME/bin

将JDK分发到其它节点安装好

4、    安装hadoop
下载hadoop, 解压安装
tar -xzvf  hadoop-3.1.2.tar.gz -C /home/data/big/
配置环境变量
vi /etc/profile
在最后面添加如下配置
# Hadoop setting
export HADOOP_HOME=/home/data/big/hadoop
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

5、    安装zookeeper
下载 zookeeper 并解压安装
tar -xzvf zookeeper-3.4.13.tar.gz -C /home/data/big/

配置环境变量
vi /etc/profile
在最后面添加如下配置
export ZK_HOME=/home/data/big/zookeeper
export PATH=$PATH:$ZK_HOME/bin

将 /etc/profile 复制到其它节点
rsync -av /etc/profile [email protected]:/etc/
# 生效环境变量
source /etc/profile

修改zookeeper配置文件
cp /home/data/big/zookeeper/conf/zoo_sample.cfg /home/data/big/zookeeper/conf/zoo.cfg
vi /home/data/big/zookeeper/conf/zoo.cfg
#修改 dataDir配置
dataDir=/home/data/big/data/zookeeper
#在最后添加配置
server.1=prd-ecs-3:2888:3888
server.2=prd-ecs-4:2888:3888
server.3=test-ecs-2:2888:3888
#按上述配置序号将数字添加到对应dataDir的myid文件中,如server.1添加如下
echo 1 > /home/data/big/data/zookeeper/myid

复制zookeeper到其它各节点
cd /home/data/big
rsync -av zookeeper [email protected]:`pwd`
在其它各节点配置 /home/data/big/data/zookeeper/myid 文件,内容为对应的数字

启动3台zookeeper服务测试
cd /home/data/big
zookeeper/bin/zkServer.sh start
zookeeper/bin/zkServer.sh status

6、    修改hadoop配置
修改 hadoop-env.sh
cd /home/data/big
vi hadoop/etc/hadoop/hadoop-env.sh
#加入如下内容
export JAVA_HOME=/home/data/jdk1.8.0_131
# hdfs 用户
export HDFS_NAMENODE_USER=root
export HDFS_DATANODE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root
export HDFS_JOURNALNODE_USER=root
export HDFS_ZKFC_USER=root
# yarn 用户
export YARN_RESOURCEMANAGER_USER=root
export YARN_NODEMANAGER_USER=root

修改workers
vi hadoop/etc/hadoop/workers
#内容如下,三个数据节点
prd-ecs-3
prd-ecs-4
test-ecs-2

修改 core-site.xml 
vi hadoop/etc/hadoop/core-site.xml
# 内容如下
<configuration>
    <!-- 指定HDFS中NameNode的地址 --> 
    <property> 
        <name>fs.defaultFS</name>         
        <!-- 指定hdfs的nameservice -->
        <value>hdfs://hadoop-test</value>
    </property>
    <property> 
        <!--这个配置是将hadoop的临时目录改成自定义的目录下--> 
        <name>hadoop.tmp.dir</name>
        <value>/home/data/big/data/hadoop/full</value>
    </property>
    <!-- 指定zookeeper地址 --> 
    <property>
        <name>ha.zookeeper.quorum</name>
        <value>prd-ecs-3:2181,prd-ecs-4:2181,test-ecs-2:2181</value>
    </property>
</configuration>

修改 hdfs-site.xml
vi hadoop/etc/hadoop/hdfs-site.xml
# 内容如下
<configuration>
    <!-- 指定HDFS副本的数量 -->
    <property>
        <name>dfs.replication</name>
        <value>2</value>
    </property>
    <!--指定hdfs的nameservice为hadoop-test,需要和core-site.xml中的保持一致 -->
    <property>
        <name>dfs.nameservices</name>
        <value>hadoop-test</value>
    </property>
    <!-- hadoop-test下面有两个NameNode,分别是nn1,nn2 -->
    <property>
        <name>dfs.ha.namenodes.hadoop-test</name>
        <value>nn1,nn2</value>
    </property>
    <!-- RPC通信地址 -->
    <property>
        <name>dfs.namenode.rpc-address.hadoop-test.nn1</name>
        <value>prd-ecs-3:9820</value>
    </property>
    <property>
        <name>dfs.namenode.rpc-address.hadoop-test.nn2</name>
        <value>prd-ecs-4:9820</value>
    </property>
    <!-- http通信地址 -->
    <property>
        <name>dfs.namenode.http-address.hadoop-test.nn1</name>
        <value>prd-ecs-3:9870</value>
    </property>
    <property>
        <name>dfs.namenode.http-address.hadoop-test.nn2</name>
        <value>prd-ecs-4:9870</value>
    </property>
    <!-- 指定NameNode的edits元数据在JournalNode上的存放位置 --> 
    <property>
        <name>dfs.namenode.shared.edits.dir</name>
        <value>qjournal://prd-ecs-3:8485;prd-ecs-4:8485;test-ecs-2:8485/hadoop-test</value>
    </property>
    <!-- 指定JournalNode在本地磁盘存放数据的位置 -->
    <property>
        <name>dfs.journalnode.edits.dir</name>
        <value>/home/data/big/data/hadoop/journaldata</value>
    </property>
    <!-- 开启NameNode失败自动切换 --> 
    <property>
        <name>dfs.ha.automatic-failover.enabled</name>
        <value>true</value>
    </property>
    <!-- 配置失败自动切换实现方式 --> 
    <property>
        <name>dfs.client.failover.proxy.provider.hadoop-test</name>
        <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
    </property>
    <!-- 配置隔离机制方法,多个机制用换行分割,即每个机制暂用一行--> 
    <property>
        <name>dfs.ha.fencing.methods</name>
        <value>sshfence</value>
    </property>
    <!-- 使用sshfence隔离机制时需要ssh免登陆 --> 
    <property>
        <name>dfs.ha.fencing.ssh.private-key-files</name>
        <value>/root/.ssh/id_rsa</value> </property>
    <!-- 配置sshfence隔离机制超时时间 --> 
    <property>
        <name>dfs.ha.fencing.ssh.connect-timeout</name>
        <value>30000</value>
    </property>
</configuration>

将hadoop分发到其他节点
cd /home/data/big
rsync -av hadoop [email protected]:`pwd`

7、    Hadoop HDFS HA集群的启动步骤
7.1 按照前面的启动方式启动zookeeper集群

7.2 启动journalnode(分别在各个节点上执行)
hdfs --daemon start journalnode
[[email protected] /]# jps
2444 JournalNode
2493 Jps
出现JournalNode则表示journalnode启动成功。

    7.3 格式化 HDFS
        在nn1主节点上执行命令:
hdfs namenode -format
倒数第几行左右的地方,出现这一句就表示成功
common.Storage: Storage directory /…/dfs/name has been successfully formatted.

    7.4 复制 hadoop.tmp.dir 配置下的文件到nn2中
        cd /home/data/big
        rsync -av data/hadoop/full [email protected]: /home/data/big/data/hadoop/
    
    7.5格式化ZKFC(在nn1主节点上执行一次即可)
        hdfs zkfc -formatZK
在倒数第3行提示如下内容表示成功
ha.ActiveStandbyElector: Successfully created /hadoop-ha/bi in ZK.

此时在zookeeper集群中可以查看
zkCli.sh
get /hadoop-ha/hadoop-test

    7.6启动HDFS
        start-dfs.sh
        访问 http://172.18.48.129:9870   http:// 172.18.48.130:9870  
     Hadoop完全分布式高可用集群搭建

Hadoop完全分布式高可用集群搭建

8、    Hadoop MapReduce、YARN 高可用集群搭建
前面搭建好HDFS后,继续在此基础上完成MapReduce、YARN的配置。
Hostname    IP    Nn1    Nn2    Dn    Zk    Zkfc    jnn    RM    NM
prd-ecs-3    172.18.48.129    *        *    *    *    *        *
prd-ecs-4    172.18.48.130        *    *    *    *    *    *    *
test-ecs-2    172.18.96.146            *    *        *    *    *

修改 mapred-site.xml
vi hadoop/etc/hadoop/mapred-site.xml
# 内容如下 :
<configuration>
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
    <property>
        <name>yarn.app.mapreduce.am.env</name>
        <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
    </property>
    <property>
      <name>mapreduce.map.env</name>
      <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
    </property>
    <property>
      <name>mapreduce.reduce.env</name>
      <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
    </property>
</configuration>

修改yarn-site.xml
vi hadoop/etc/hadoop/yarn-site.xml
# 内容如下 :
<configuration>
    <!-- RM单点服务配置
    <property>
        <name>yarn.resourcemanager.hostname</name>
        <value>prd-ecs-4</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>yarn-test</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>test-ecs-2</value>
    </property>
    <property>
        <name>yarn.resourcemanager.hostname.rm2</name>
        <value>prd-ecs-4</value>
    </property>
    <property>
        <name>yarn.resourcemanager.webapp.address.rm1</name>
        <value>test-ecs-2:8088</value>
    </property>
    <property>
        <name>yarn.resourcemanager.webapp.address.rm2</name>
        <value>prd-ecs-4:8088</value>
    </property>
    <!-- 指定zk集群地址 -->
    <property>
        <name>yarn.resourcemanager.zk-address</name>
        <value>prd-ecs-3:2181,prd-ecs-4:2181,test-ecs-2:2181</value>
    </property>
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>    
</configuration>

将以上修改文件分发到其他节点相同目录。

启动yarn
先启动zookepper:zkServer.sh start
再启动hdfs:start-dfs.sh
启动yarn:start-yarn.sh

   查看yarn群集 http://172.18.48.130:8088     http://172.18.96.146:8088

Hadoop完全分布式高可用集群搭建

全部搭建成功!