Centos 7 zookeeper 3.1.4 + hadoop 3.1.2+Hbase 2.1.3完全分布式+高可用(HA)

一、 环境说明

主机名

Zookeeper

(QuorumPeerMain)

 

NameNode

Resource

Manager

 

DFSZK

Failover

Controller

JournalNode DataNode HMaster NodeManager HRegionServer
h1      
h2      
h3        
h4            

版本说明:

JDK:1.8+

Zookeeper:3.1.4

Hadoop:3.1.2

Hbase:2.1.3

二、 基本环境设置

1、 安装JDK(所有节点)

# tar -zxvf jdk软件包 指定目录
示例:
# tar -zxvf jdk1.8.0_171.tar.gz /usr/local/software/

2、 配置环境变量

# vim /etc/profile
最后面添加:

JAVA_HOME=/usr/local/software/jdk1.8.0_171
PATH=$JAVA_HOME/bin:$PATH
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_HOME PATH

3、 是环境变量生效

# source /etc/profile

4、 检查java配置是否成功

# java -version
java version "1.8.0_171"
Java(TM) SE Runtime Environment (build 1.8.0_171-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.171-b11, mixed mode)

5、 关闭防火墙

# 关闭防火墙
# systemctl stop firewalld
# 开机禁用
# systemctl disable firewalld

6、 禁用SELinux

# 临时关闭
# setenforce 0
# 开机禁用
# vim /etc/selinux/config
# 将SELINUX=enforcing改为SELINUX=disabled 
SELINUX=disabled
# 查看状态
# getenforce
Disabled
# /usr/sbin/sestatus -v
SELinux status:                 disabled

7、 配置hosts

# 修改hosts
# vim /etc/hosts
# 添加如下内容
# 注意:已经修改了主机名称分别为h1 h2 h3 h4
# 最后面的 0.0.0.0 对应相应的主机,如没配置,会在namenode格式化的时候出错
192.168.247.11 h1
192.168.247.12 h2
192.168.247.13 h3
192.168.247.14 h4
0.0.0.0 h1

8、 配置免密登录

# 生成公钥和私钥
# ssh-******
# 拷贝公钥到其它节点
# ssh-copy-id [email protected]
# 修改主机名,并执行多次
# 测试是否成功,不用输入密码,则表示成功
# ssh [email protected]

至此,基本环境配置完毕

三、 安装zookeeper集群(h1 h2 h3)节点

1、 解压软件包到software目录下

# tar -zxvf zookeeper-3.4.13.tar.gz /usr/local/software/

2、 配置环境变量

参考JDK环境变量的配置

3、 进入到zookeeper安装目录,并拷贝conf目录下zoo_sample.cfg为zoo.cfg

# cp zoo_sample.cfg zoo.cfg

4、 编辑zoo.cfg

# 修改dataDir目录
dataDir=/usr/local/software/zookeeper-3.4.13/data
# 添加如下内容
server.1=h1:2888:3888
server.2=h2:2888:3888
server.3=h3:2888:3888

5、 在zookeeper目录下,创建data目录

# mkdir data

6、 在data目录下创建myid文件,并分别添加1、2、3三个数字。示例如下

# 在h1下面创建myid
# vim myid
# 添加数字1
1
# 保存退出
:wq

h2、h3一样,分别为2和3

至此zookeeper集群配置完毕

四、 配置hadoop集群(h1 h2 h3 h4)节点

1、 同样,解压软件包、并配置环境变量

过程:略......

2、 进入到hadoop目录下的etc/hadoop

# cd etc/hadoop

3、 编辑hadoop-env.sh

# 主要是配置JAVA_HOME目录,注意不要使用${JAVA_HOME},如下
# vim hadoop-env.sh
export JAVA_HOME=/usr/local/software/jdk1.8.0_171

4、 编辑core-site.xml

# vim core-site.xml
<configuration>
  <property>
    <name>fs.defaultFS</name>
    <value>hdfs://hadoop-cluster</value>
    <description>集群名称</description>
  </property>
  <property>
    <name>hadoop.tmp.dir</name>
    <value>/usr/local/software/hadoop-3.1.2/tmp</value>
    <description>节点上本地的hadoop临时文件夹</description>
  </property>
  <property>
    <name>ha.zookeeper.quorum</name>
    <value>h1:2181,h2:2181,h3:2181</value>
    <description>zookeeper集群</description>
  </property>
</configuration>

5、 修改hdfs-site.xml

# vim hdfs-site.xml
<configuration>
    <property>
        <name>dfs.nameservices</name>
        <value>hadoop-cluster</value>
        <description>集群名称</description>
    </property>
    <property>
        <name>dfs.ha.namenodes.hadoop-cluster</name>
        <value>nn01,nn02</value>
        <description>namenode名称,随便,可以是nn1,nn2,注意和下面保持一致</description>
    </property>
    <property>
        <name>dfs.namenode.rpc-address.hadoop-cluster.nn01</name>
        <value>h1:9000</value>
        <description>nn01的RPC通信地址,注意务必是9000,不要用8020之类的,否则ui会有点问题</description>
    </property>
    <property>
        <name>dfs.namenode.rpc-address.hadoop-cluster.nn02</name>
        <value>h2:9000</value>
        <description>同上</description>
    </property>
    <property>
        <name>dfs.namenode.http-address.hadoop-cluster.nn01</name>
        <value>h1:9870</value>
        <description>ui地址及端口(原先是50070),随便</description>
    </property>
    <property>
        <name>dfs.namenode.http-address.hadoop-cluster.nn02</name>
        <value>h2:9870</value>
        <description>同上</description>
    </property>
    <property>
        <name>dfs.namenode.shared.edits.dir</name>
        <value>qjournal://h1:8485;h2:8485;h3:8485/hadoop-cluster</value>
        <description>指定NameNode的edits元数据的共享存储位置。也就是JournalNode列表该url的配置格式:qjournal://host1:port1;host2:port2;host3:port3/journalId;journalId推荐使用nameservice,默认端口号是:8485</description>
    </property>
    <property>
        <name>dfs.client.failover.proxy.provider.hadoop-cluster</name>
   <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
        <description>高可用失败自动切换代理服务</description>
    </property>
  <property>
     <name>dfs.permissions.enabled</name>
     <value>false</value>
     <description>禁用权限</description>
  </property>
    <property>
        <name>dfs.support.append</name>
        <value>true</value>
        <description>允许数据追加</description>
    </property>
    <property>
        <name>dfs.replication</name>
        <value>1</value>
        <description>副本数量</description>
    </property>
    <property>
        <name>dfs.namenode.name.dir</name>
        <value>/usr/local/software/hadoop-3.1.2/hdfs/namenode</value>
        <description>namenode数据存放目录</description>
    </property>
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>/usr/local/software/hadoop-3.1.2/hdfs/datanode</value>
        <description>datanode数据存放目录</description>
    </property>
    <property>
        <name>dfs.journalnode.edits.dir</name>
        <value>/usr/local/software/hadoop-3.1.2/hdfs/journalnode</value>
        <description>journalnode数据存放目录</description>
    </property>
    <property>
        <name>dfs.ha.automatic-failover.enabled</name>
        <value>true</value>
        <description>开启NameNode失败自动切换</description>
    </property>
    <property>
        <name>dfs.webhdfs.enabled</name>
        <value>true</value>
        <description>启用webhdfs</description>
    </property>
    <property>
        <name>dfs.ha.fencing.ssh.connect-timeout</name>
        <value>30000</value>
        <description>配置sshfence隔离机制超时时间</description>
    </property>
    <property>
        <name>dfs.ha.fencing.ssh.private-key-files</name>
        <value>/root/.ssh/id_rsa</value>
        <description>使用sshfence隔离机制时需要ssh免登陆</description>
    </property>
    <property>
        <name>dfs.ha.fencing.methods</name>
        <value>
        sshfence
	    shell(/bin/true)
        </value>
        <description>配置隔离机制方法,多个机制用换行分割,即每个机制暂用一行</description>
    </property>
</configuration>

5、 配置mapred-site.xml

# vim mapred-site.xml
<configuration>
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
        <description>指定mr框架为yarn方式</description>
    </property>
</configuration>

6、 配置yarn-site.xml

# vim yarn-site.xml
<configuration>
    <property>
        <name>yarn.resourcemanager.ha.enabled</name>
        <value>true</value>
		<description>开启RM高可用</description>
    </property>
    <property>
        <name>yarn.resourcemanager.cluster-id</name>
        <value>yrc</value>
		<description>指定RM的cluster id</description>
    </property>
    <property>
        <name>yarn.resourcemanager.ha.rm-ids</name>
        <value>rm1,rm2</value>
		<description>指定RM的名字</description>
    </property>
    <property>
        <name>yarn.resourcemanager.hostname.rm1</name>
        <value>h1</value>
		<description>指定RM的地址</description>
    </property>

    <property>
        <name>yarn.resourcemanager.hostname.rm2</name>
        <value>h2</value>
		<description>指定RM的地址</description>
    </property>
    <property>
        <name>yarn.resourcemanager.zk-address</name>
        <value>h1:2181,h2:2181,h3:2181</value>
		<description>zookeeper集群</description>
    </property>
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
		<description></description>
    </property>
    <property>
        <name>yarn.log-aggregation-enable</name>
        <value>true</value>
		<description></description>
    </property>
    <property>
        <name>yarn.log-aggregation.retain-seconds</name>
        <value>86400</value>
		<description></description>
    </property>
    <property>
        <name>yarn.resourcemanager.recovery.enabled</name>
        <value>true</value>
		<description>启用自动恢复</description>
    </property>
    <property>
        <name>yarn.resourcemanager.store.class</name>
        <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
		<description>制定resourcemanager的状态信息存储在zookeeper集群上</description>
    </property>
</configuration>

7、 编辑workers文件,以前是slaves文件

# vim workers
#去掉localhost,并添加
h3
h4

8、 编辑sbin目录下的start-dfs.sh 和stop-dfs.sh并添加如下内容

# vim start-dfs.sh
HDFS_DATANODE_USER=root
HDFS_DATANODE_SECURE_USER=hdfs
HDFS_ZKFC_USER=root
HDFS_JOURNALNODE_USER=root
HDFS_NAMENODE_USER=root
HDFS_SECONDARYNAMENODE_USER=root

9、 编辑sbin目录下的start-yarn.sh和stop-yarn.sh并添加如下内容

# vim start-yarn.sh
YARN_RESOURCEMANAGER_USER=root
HADOOP_SECURE_DN_USER=yarn
YARN_NODEMANAGER_USER=root

至此,hadoop集群配置完毕

五、 配置hbase(h1 h2 h3 h4)节点

1、 解压hbase软件包,并配置环境变量

过程:略......

2、 进入到hbase目录的conf目录中

# cd conf

3、 编辑hbase-env.sh

# vim hbase-env.sh
# 主要是配置JAVA_HOME,同hadoop-env.sh
export JAVA_HOME=/usr/local/software/jdk1.8.0_171
# 可选
export HBASE_CLASSPATH=$HBASE_CLASSPATH:/usr/local/software/hadoop-3.1.2/etc/hadoop
# 关闭自身zookeeper,采用外部的zookeeper
export HBASE_MANAGES_ZK=false

4、 配置hbase-site.xml

# vim hbase-site.xml
<configuration>
  <property>
    <name>hbase.rootdir</name>
    <value>hdfs://hadoop-cluster/hbase</value>
    <description>hadoop集群名称</description>
  </property>
  <property>
    <name>hbase.zookeeper.quorum</name>
    <value>h1,h2,h3</value>
    <description>zookeeper集群</description>
  </property>
  <property>
    <name>hbase.cluster.distributed</name>
    <value>true</value>
    <description>是否是完全分布式</description>
  </property>
  <property>
    <name>hbase.zookeeper.property.clientPort</name>
    <value>2181</value>
  </property>
  <property>
    <name>hbase.unsafe.stream.capability.enforce</name>
    <value>false</value>
    <description>完全分布式式必须为false</description>
  </property>
</configuration>

5、 编辑regionservers

# vim regionservers
h3
h4

6、 将hdfs-site.xml映射到conf下hdfs-site.xml

# ln -s /usr/local/software/hadoop-3.1.2/etc/hadoop/hdfs-site.xml ./hdfs-site.xml

7、 配置Hmaster高可用

# vim backup-masters
h2

至此Hbase配置完毕

六、 启动

由于已经配置了环境变量,所以任意位置执行以下命令都可以

1、 启动zookeeper(h1 h2 h3)节点

# 启动
# zkServer.sh start
# 查看状态
# zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/software/zookeeper-3.4.13/bin/../conf/zoo.cfg
Mode: follower

2、启动journalnode(h1 h2 h3)节点

# hdfs --daemon start journalnode
# 或者(不推荐)
# hadoop-daemon.sh start journalnode

3、 格式化zkfc和namenode(h1)节点

# 格式化zkfc
# hdfs zkfc -formatZK
# 格式化namenode(如果在hosts没有配置 0.0.0.0 主机名在这一步的时候可能会报错)
# hdfs name -format

4、 启动hadoop

# 下面这个命令会同时启动所有服务(当然您也可以单独启动服务)
# start-all.sh

5、 启动另一个namenode

# 同步fsimage
# hdfs namenode -bootstrapStandby
# 启动namenode
# hdfs --daemon.sh start namenode

6、 启动hbase

# 注意,要在hadoop已经完全启动后再启动
# start-hbase.sh

七、 最终效果

1、 jps查看所有进程效果

Centos 7 zookeeper 3.1.4 + hadoop 3.1.2+Hbase 2.1.3完全分布式+高可用(HA)

2、 UI效果

hadoop地址:IP:9870

Centos 7 zookeeper 3.1.4 + hadoop 3.1.2+Hbase 2.1.3完全分布式+高可用(HA)

Centos 7 zookeeper 3.1.4 + hadoop 3.1.2+Hbase 2.1.3完全分布式+高可用(HA)

Yarn地址:IP:8088

Centos 7 zookeeper 3.1.4 + hadoop 3.1.2+Hbase 2.1.3完全分布式+高可用(HA)

HBase地址:IP:16010

Centos 7 zookeeper 3.1.4 + hadoop 3.1.2+Hbase 2.1.3完全分布式+高可用(HA)

ZK元数据

Centos 7 zookeeper 3.1.4 + hadoop 3.1.2+Hbase 2.1.3完全分布式+高可用(HA)