基于32位版CentOS6配置符合HA模式的CDH5.7.0的Hadoop+Yarn+HBase集群

本文参考资料来源:

1,Hadoop完全分布式 -- HA配置 - WarmthYan - ****博客  https://blog.****.net/qq_33187206/article/details/80776839

2, 各软件安装目录内的帮助文档:

3,《基于Hadoop与Spark的大数据开发实战》肖睿 丁科 吴刚山主编,人民邮电出版社

【使用此集群】

如果只是使用此集群,则可以直接看:”               ”.

Hadoop完全分布式 -- HA配置

本实验以3台CentOS6.10的32位版客户机配置 Hadoop2.6的HA,Hadoop生态包括若干个组件,比如hdfs,yarn,hbase等,各自都可做HA配置。

hadoop CDH版本:hadoop-2.6.0-cdh5.7.0.tar.gz

zookeeper CDH版本:zookeeper-3.4.5-cdh5.7.0.tar.gz

基于32位版CentOS6配置符合HA模式的CDH5.7.0的Hadoop+Yarn+HBase集群

 

【前提工作】

A、每个节点关闭防火墙和selinux.

B、配置所有节点的ssh免密码登录设置

    每个节点做如下两条命令:

# ssh-****** -t rsa -P '' -f /root/.ssh/id_rsa

    # ssh-copy-id hadoop001

这样,每个root在每个节点的rsa公钥都复制到了hadoop001节点的/root/.ssh/authorized_keys内了; (ps: 此时,任何一个节点的/root/.ssh/known_hosts中也只有:“hadoop001,192.168.207.31 ssh-rsa 公钥”,而无其它任何节点的信息).

然后,将authorized_keys复制到其它节点:

# scp .ssh/authorized_keys [email protected]hadoop002:/root/.ssh/

# scp .ssh/authorized_keys [email protected]hadoop003:/root/.ssh/

输入yes和root的密码.

这样,任何一个节点登录其它任何节点都无需输入密码了.

C、解压安装hadoop系统的各个软件

每个客户机解压hadoop,zookeeper,hbase的tar.gz文件到指定目录(/root/app),并将该目录的拥有者和组设置为root(用chown -R 和chgrp -R).

D、配置好每台客户机的/etc/hosts和/etc/profile

# vi /etc/hosts

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4

::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

192.168.207.31  hadoop001

192.168.207.32  hadoop002

192.168.207.33  hadoop003

# vim /etc/profile

见unset -f pathmunge之后改为:

export  PATH=$PATH:/root

export  JAVA_HOME=/root/app/jdk1.8.0_211

export  hdh=/root/app/hadoop-2.6.0-cdh5.7.0

export  zkh=/root/app/zookeeper-3.4.5-cdh5.7.0

export  hbh=/root/app/hbase-1.2.0-cdh5.7.0

export  hih=/root/app/hive-1.1.0-cdh5.7.0

export  sph=/root/app/spark-1.6.0-cdh5.7.0

export    PATH=$PATH:/root:$JAVA_HOME/bin:$hdh/sbin:$hdh/bin:$zkh/bin:$hbh/bin:$hih/bin:$sph/bin

 

在hadoop001上做如上述配置后,scp到其它各个节点.   

【HDFS完全分布式 -- HA配置

一、各节点的服务部署

    表1-1各节点部署的hadoop服务(hadoop001还可以启动JobHistoryServer).注意,此处没有显示HBase HA部署完毕后的服务.

基于32位版CentOS6配置符合HA模式的CDH5.7.0的Hadoop+Yarn+HBase集群

HA 有两种状态:

1、故障发生时需要手动切换

2、故障发生时自动故障转移

ps:在下面的配置中,是先配置为手动切换,然后再启用或更改及格属性将集群升级为自动故障转移.

 

二、ZooKeeper 配置--分布式模式

1、把 zookeeper-3.4.5-cdh5.7.0.tar.gz 解压到一个目录中

       # tar -zxvf zookeeper-3.4.5-cdh5.7.0.tar.gz -C /root/app

创建存储目录:

       # mkdir –p  /root/app/zookeeper-3.4.5-cdh5.7.0/zkdata

2、修改conf/zoo_sample.cfg 重命名 zoo.cfg文件

tickTime=2000

initLimit=10

syncLimit=5

dataDir=/root/app/zookeeper-3.4.5-cdh5.7.0/zkdata

clientPort=2181

server.1=hadoop001:2888:3888

server.2=hadoop002:2888:3888

server.3=hadoop003:2888:3888

 

       ps:

       2181表示客户端端口号,hadoop系统要用它

       2888表示ZK节点内部通信端口号

       3888表示ZK内部选举端口号             

                

3、# echo "1">/root/app/zookeeper-3.4.5-cdh5.7.0/zkdata/myid

4、将zk目录分发到其他节点上         

       scp -r /root/app/zookeeper-3.4.5-cdh5.7.0/ hadoop002: /root/app/

       scp -r /root/app/zookeeper-3.4.5-cdh5.7.0/ hadoop003: /root/app/

5、更改其它2个节点的/root/app/zookeeper-3.4.5-cdh5.7.0/zkdata/myid 的内容分别为2,3. 

8、在每个节点启动ZK:     

在hadoop001到hadoop003:

#  zkServer.sh start   

然后:

在hadoop001到hadoop005:

#   zkServer.sh status

应该有一个节点是leader,其余是follower .

三、配置 Hadoop 集群

1、设置hadoop的JAVA_HOME

# cd  /root/app/hadoop-2.6.0-cdh5.7.0/etc/hadoop

hadoop-env.shmapred-env.sh还有yarn-env.sh中找到” JAVA_HOME=”,去掉前面的#(如果有),写上你的jdk路径:

       JAVA_HOME=/root/app/jdk1.8.0_211

2、配置5个配置文件

配置 /root/app/hadoop-2.6.0-cdh5.7.0/etc/hadoop 下的5个文件

       core-site.xml

       hdfs-site.xml

       mapred-site.xml

       yarn-site.xml

       slaves

每个节点都新建一些目录:

# cd  /root/app/hadoop-2.6.0-cdh5.7.0/etc/hadoop

# mkdir  -p  data/tmp  data/journal

以下xml文件原有的前两行需保留:

<?xml version="1.0"?>

<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

 

1) core-site.xml

 

<configuration>  

<property>  

 <!-- HA方式的namespace ,客户端用它访问HDFS-->

<name>fs.defaultFS</name> 

    <value>hdfs://ns1</value>  

</property> 

 <property>

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

       <value>/root/app/hadoop-2.6.0-cdh5.7.0/etc/hadoop/data/tmp</value>

</property>

<!-- 网页界面访问数据的用户名,默认是dr.who -->

<property>  

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

    <value>root</value>  

</property>

<property>  

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

    <value>hadoop001:2181,hadoop002:2181,hadoop003:2181</value>  

</property> 

</configuration>

 

2) hdfs-site.xml

 

<configuration>  

<property>  

    <name>dfs.replication</name>  

    <value>2</value>  

</property>  

<property>  

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

    <value>false</value>  

</property>  

<property>  

    <name>dfs.nameservices</name>  

    <value>ns1</value>  

</property>  

<property>  

<name>dfs.blocksize</name>  

<!--数据块大小-->

    <value>134217728</value>  

</property>  

<property>  

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

    <value>nn1,nn2</value>  

</property>  

<!-- nn1的RPC通信地址,nn1所在地址  -->  

<property>  

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

    <value>hadoop001:8020</value>  

</property>  

<!-- nn1的http通信地址,web访问地址 -->  

<property>  

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

    <value>hadoop001:50070</value>  

</property>  

<!-- nn2的RPC通信地址,nn2所在地址 -->  

<property>  

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

    <value>hadoop002:8020</value>  

</property>  

<!-- nn2的http通信地址,web访问地址 -->  

<property>  

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

    <value>hadoop002:50070</value>  

</property>  

<!-- 指定NameNode的元数据在JournalNode日志上的存放位置(一般和zookeeper部署在一起) -->  

<property>  

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

    <value>qjournal://hadoop001:8485;hadoop002:8485;hadoop003:8485/ns1</value>  

</property>  

<!-- 指定JournalNode在本地磁盘存放数据的位置 -->  

<property>  

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

    <value>/root/app/hadoop-2.6.0-cdh5.7.0/etc/hadoop/data/journal</value>  

</property>  

<!--客户端通过代理访问namenode,访问文件系统,HDFS 客户端与Active 节点通信的Java 类,使用其确定Active 节点是否活跃  -->  

<property>  

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

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

</property>  

<!--这是配置自动切换的方法,有多种使用方法,具体可以看官网,在文末会给地址,这里是远程登录杀死的方法,这个参数的值可以有多种,你也可以换成shell(/bin/true)试试,也是可以的,这个脚本do nothing 返回0 -->  

<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>  

<!-- 这个是开启自动故障转移,如果未做自动故障转移,这个可以先不配,可以先注释掉 

<property>  

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

    <value>true</value>  

</property>  

--> 

</configuration>  

 

3)mapred-site.xml

Hadoop之历史服务器与日志聚合和文件权限 - weixin_40652340的博客 - ****博客

 https://blog.****.net/weixin_40652340/article/details/78541968

 

# cp mapred-site.xml.template  mapred-site.xml

# vim mapred-site.xml

 

<configuration>  

<property>  

        <name>mapreduce.framework.name</name>  

        <value>yarn</value>  

</property> 

<!-- MapReduce JobHistory Server地址 -->

<property>  

    <name>mapreduce.jobhistory.address</name>  

    <value>hadoop001:10020</value>  

</property>  

<property>  

    <name>mapreduce.jobhistory.webapp.address</name>  

    <value>hadoop001:19888</value>  

</property>  

</configuration>  

 

4) yarn-site.xml

 

<configuration>  

    <property>  

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

        <value>mapreduce_shuffle</value>  

    </property>  

    <property>  

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

        <value>hadoop001</value>  

    </property>  

    <property>  

        <name>yarn.log-aggregation-enable</name>  

        <value>true</value>  

    </property>  

        <property>  

        <name>yarn.log-aggregation.retain-seconds</name>  

        <value>106800</value>  

    </property>  

</configuration> 

 

5) slaves

hadoop001

hadoop002

hadoop003

 

3、分发文件

# scp  $hdh/etc/hadoop/*  [email protected]:$hdh/etc/hadoop/

# scp  $hdh/etc/hadoop/*  [email protected]:$hdh/etc/hadoop/

# scp  $hdh/etc/hadoop/*  [email protected]:$hdh/etc/hadoop/

# scp  $hdh/etc/hadoop/*  [email protected]:$hdh/etc/hadoop/

# scp  $hdh/etc/hadoop/*  [email protected]:$hdh/etc/hadoop/

 

 

四、格式化和启动 Hadoop 集群

【启动过程】

1、每个节点启动zookeeper

   #  zkServer.sh  start

2、每个节点启动journalnode

#  hadoop-daemon.sh start journalnode

1、操作namenode

(注意! 只格式化一台namenode节点,另一台会自动同步被格式化!)

1)在hadoop001hadoop002节点做namenode格式化:

(PS:如果是需要被第二次格式化,则最好在每一个节点先删除在配置文件中设置的目录:

#  rm  -rf  /root/app/hadoop-2.6.0-cdh5.7.0/etc/hadoop/data/

然后:

#  cd  /root/app/hadoop-2.6.0-cdh5.7.0/etc/hadoop

# mkdir  -p  data/tmp  data/journal

)

假设是在hadoop002节点做以下步骤:

       #  $hdh/bin/hdfs  namenode -format

一般情况下,只要输出信息内无error或异常,则是格式化成功.

2)启动刚格式化好的namenode:

       #   $hdh/sbin/hadoop-daemon.sh start namenode

   此时,该节点多了一个java进程:  NameNode ,而此时其它节点无namenode进程.

3) 在hadoop001节点同步namenode的数据

#  ssh  hadoop001

       #  $hdh/bin/hdfs namenode -bootstrapStandby

4) 在hadoop001节点启动第二台的namenode:

       #  hadoop-daemon.sh start namenode

此时,hadoop001节点多了一个java进程:  NameNode

 

4、查看namenode节点

会看到现在两个节点都是处于stanby状态.

http://192.168.207.31:50070

http://192.168.207.32:50070

5、active一个namenode

在hadoop001或hadoop002节点上做:

将nn1切换为active状态:

(注意: 此时hdfs.xml内的属性dfs.ha.automatic-failover.enabled不能为true)

# hdfs haadmin -transitionToActive nn1  

(

ps1: 将nn1切换为standby状态:

# $hdh/bin/hdfs haadmin -transitionToStandby nn1

ps2: 强制切换状态:

# $hdh/bin/hdfs haadmin -transitionToActive nn1 --forceactive

ps3:用命令查看namenode状态:

#  $hdh/bin/hdfs haadmin -getServiceState nn1

#  $hdh/bin/hdfs haadmin -getServiceState nn2

)

(PS:

查看ZooKeeper日志:

ZooKeeper日志是二进制文件。

#  chmod 764 $zkh/zookeeper-3.4.5-cdh5.7.0.jar

#  cd  $zkh/zkdatalog/version-2

#  java -cp $zkh/zookeeper-3.4.5-cdh5.7.0.jar:$zkh/lib/slf4j-api-1.7.5.jar org.apache.zookeeper.server.LogFormatter log.xxxxx

)

五、启用HDFS自动故障转移

1、配置

1)、在hadoop001上停止hdfs,但不停止zk:

#  stop-dfs.sh

    注意,此时zk集群处于启动状态.

2)、启用属性dfs.ha.automatic-failover.enabled(value为true).

在hadoop001上做:

# vim  $hdh/etc/hadoop/hdfs-site.xml

启用属性dfs.ha.automatic-failover.enabled(value为true).

# scp  $hdh/etc/hadoop/hdfs-site.xml  [email protected]:$hdh/etc/hadoop/

# scp  $hdh/etc/hadoop/hdfs-site.xml  [email protected]:$hdh/etc/hadoop/

3)、在hadoop001上格式化zk

#  $hdh/bin/hdfs zkfc -formatZK

(ps:这个格式化工作要在namenode进程所在的节点上做才行.)

# zkCli.sh

[zk: localhost:2181(CONNECTED) 0] ls /

[hadoop-ha, zookeeper]

可以看到多了个节点(hadoop-ha),这表示集群应该是没问题了!

[zk: localhost:2181(CONNECTED) 0] quit

2、启动Hadoop HA集群:

如果你复制了此集群,则你先设置你的VMWare Workstation的”虚拟网络编辑器”的NAT网卡的”子网IP”为192.168.207.0;节点启动时,选”我移动它”.

1)启动

1-1)首先是确认已经在每个节点都已经启动zk服务:

#  zkServer.sh  start

(每个节点通过 # zkServer.sh  status 查看自己在zk集群中的角色)

1-2)在hadoop001启动hdfs集群及其相关进程:

#  start-dfs.sh

此时,各个节点的java进程完全符合《基于Hadoop与Spark的大数据开发实战》Page.124.d的表4-1.

1-3)还可以在hadoop001启动历史服务器:

#  mr-jobhistory-daemon.sh start historyserver

这会在hadoop001上新增一个历史服务器进程(JobHistoryServer),7hadoop进程.

2)浏览文件:

作者已经上传necklace.txt文件到hdfs的根目录:

hadoop001

# hadoop fs -cat /necklace.txt

能正常显示necklace.txt的全部内容.

 

3、故障转移实验

  1)只是终止处于active状态的namenode进程

  假设此时hadoop001namenode处于active状态;

hadoop001namenode进程用kill命令终止:

   # kill  namenode进程的pid

此时可以发现hadoop002namenode立刻转换为active状态!而且能正常浏览necklace.txt的内容.说明自动故障转移成功!

因此,如果hadoop001hadoop002上只运行NameNode进程,而不运行其它Hadoop进程,则任何一个NameNode所在的节点即使断电,也不会影响整个Hadoop系统的运行。

    在终止了namenode进程的节点上启动故障节点的namenode:

   #  hadoop-daemon.sh  start  namenode

 

 

2)节点断电:

namenode处于active状态的节点hadoop001通过虚拟机直接关闭电源

另一个namenode节点(hadoop002)始终无法自动转为active状态。此时,手动**hadoop002NameNode

     $hdh/bin/hdfs haadmin -transitionToActive nn2 --forceactive

     可以通过下述命令查看其是否为active状态:

$hdh/bin/hdfs haadmin -getServiceState nn2

可以发现,hadoop002namenode无法转为active状态。

原因:这是由于我们这个集群的namenode所在的节点还运行了其它关键服务而造成的。

    现在做恢复:

    启动hadoop001,然后,启动zk,hdfsnamenode:

     #   zkServer.sh start

       #  start-dfs.sh

        启动了hadoop001的5hadoop进程.

  注意!此时hadoop002namenode自动转换为了active状态, 并且能正常浏览hdfs上的necklace.txt.说明自动故障转移成功!

      此时,可以在hadoop002hadoop001上浏览hdfs

      # hadoop fs -cat /necklace.txt 

4、关机:

a)一定先在启动了zookeeper服务的那5个节点上关闭zookeeper,它们每个上都做:

#  zkServer.sh  stop

(PS:如果不关闭每个节点的zookeeper,则可能下一次启动zk时,报错说zk已启动,此时会给出zk的pid,那么你就必须先kill该pid,然后再次启动zookeeper)

b)在hadoop001节点:

    # stop-dfs.sh

    关闭历史服务器:

#  mr-jobhistory-daemon.sh  stop  historyserver

最后,关闭每个节点电源。

查错提示:

如果任何服务发生错误,则查看相应的日志,分析出错的原因。

比如,如果是服务器的进程无法启动,则可以先讲以往的相应日志文件都删除,以免影响观测;然后再次启动失败的服务器,以便通过日志看到底何处出错:

比如本实验的Hadoop日志:

$hdh/logs

其中的.log文件,通过文件名即可知道其对应的服务是什么。

又比如本实验的ZooKeeper日志(是二进制文件,需特殊处理):

#  chmod 764 $zkh/zookeeper-3.4.5-cdh5.7.0.jar

#  cd  $zkh/zkdatalog/version-2

#  java -cp $zkh/zookeeper-3.4.5-cdh5.7.0.jar:$zkh/lib/slf4j-api-1.7.5.jar org.apache.zookeeper.server.LogFormatter log.xxxxx

 

六、配置Resource Manager自动故障转移

1、hadoop001上配置yarn-site.xml和mapred-site.xml

1) yarn-site.xml:

<?xml version="1.0"?>

<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>rmcluster</value>

        </property>

        <property>

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

                <value>rm1,rm2</value>

        </property>

        <property>

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

                <value>hadoop001</value>

        </property>

        <property>

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

                <value>hadoop002</value>

        </property>

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

        <property>

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

                <value>hadoop001:2181,hadoop002:2181,hadoop003:2181</value>

        </property>

        <!--启用自动恢复,当任务进行一半,rm坏掉,就要启动自动恢复,默认是false-->

        <property>

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

                <value>true</value>

        </property>

        <!--指定resourcemanager的状态信息存储在zookeeper集群,默认是存放在FileSystem里面。-->

        <property>

                <name>yarn.resourcemanager.store.class</name>

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

        </property>

</configuration>

 

2) mapred-site.xml

<?xml version="1.0"?>

<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>

<property>

        <name>mapreduce.framework.name</name>

        <value>yarn</value>

</property>

<!-- MapReduce JobHistory Server地址 -->

<property>

    <name>mapreduce.jobhistory.address</name>

    <value>hadoop001:10020</value>

</property>

<property>

    <name>mapreduce.jobhistory.webapp.address</name>

    <value>hadoop001:19888</value>

</property>

</configuration>

 

2、复制到其它节点

# scp  $hdh/etc/hadoop/hdfs-site.xml  [email protected]:$hdh/etc/hadoop/

# scp  $hdh/etc/hadoop/hdfs-site.xml  [email protected]:$hdh/etc/hadoop/

3、启动hadoop集群

1-1)首先是确认已经在5个节点都已经启动zk服务:

#  zkServer.sh  start

(每个节点通过 # zkServer.sh  status 查看自己在zk集群中的角色)

1-2)在hadoop001启动hdfs集群及其相关进程:

start-dfs.sh

mr-jobhistory-daemon.sh start historyserver

(PS:

如果hadoop001或hadoop002节点没启动namenode,则在该节点上运行下述启动程序:

$  hdh/sbin/hadoop-daemon.sh start namenode

)

1-3)在hadoop001启动yarn:

#  start-yarn.sh

核对hadoop001和hadoop002上是否都有ResourceManager进程。

1-4)在hadoop002启动ResourceManager:

如果hadoop002上的ResourceManager没有启动,通过查看日志又找不到原因,则在hadoop002上手动启动ResourceManager

yarn-daemon.sh start resourcemanager

核对hadoop001到hadoop006上是否都有该有的进程。

1-5)查看ResourceManager的状态:

查看两个rm的状态

#  yarn rmadmin -getServiceState rm2

standby

# yarn rmadmin -getServiceState rm1

active

1-6)web浏览yarn:

http://192.168.207.31:8088/cluster/cluster

http://192.168.207.32:8088/cluster/cluster

 

1-7) 模拟故障发生:

kill 处于active状态的ResourceManager的pid ,以模拟故障发生:

    会发现另一个节点的ResourceManager转变为了active状态。

恢复被终止的ResourceManager(在发生kill的节点上做):

#  yarn-daemon.sh start resourcemanager

# stop-yarn.sh

hadoop002上:

#  yarn-daemon.sh stop resourcemanager

hadoop001上:

# start-yarn.sh

hadoop002上:

#  yarn-daemon.sh start resourcemanager

kill hadoop001上处于active状态的ResourceManager的pid ,以模拟故障发生:

会发现另一个节点的ResourceManager转变为了active状态。

恢复被终止的ResourceManager:在发生kill的节点上做:

#  yarn-daemon.sh start resourcemanager

 

七、集群服务启动和停止脚步

1、脚本在hadoop002的/root/sh内。

#启动HA方式的Hadoop,ResourceManager,HBase集群的自定义脚本startab.sh

#!/bin/bash

echo "-----------starting HDFS2 and RM HA...-------------"

for i in {001,002,003} ;do

  #清空以往日志记录

  ssh hadoop$i "source /etc/profile;rm -f $hdh/logs/*.*;rm -f $hbh/conf/logs/hbase/*.*"

done

#启动hadoop001到hadoop003的ZooKeeper集群

for i in {001,002,003} ;do

  #清空以往日志记录

  ssh hadoop$i "source /etc/profile;rm -f $zkh/zkdatalog/version-2/*.*"

  #启动服务

  ssh hadoop$i "source /etc/profile;zkServer.sh start"

done

 

sleep 1

#启动hadoop001到hadoop003的journalnode

for i in {001,002,003} ;do

  ssh hadoop$i "source /etc/profile;hadoop-daemon.sh start journalnode"

done

sleep 1

#启动hadoop001,hadoop002的zkfc

ssh hadoop001 "source /etc/profile;hadoop-daemon.sh start zkfc  "

ssh hadoop002 "source /etc/profile;hadoop-daemon.sh start zkfc "

sleep 1

#启动hadoop001,hadoop002的namenode

ssh hadoop001 "source /etc/profile;hadoop-daemon.sh start namenode"

ssh hadoop002 "source /etc/profile;hadoop-daemon.sh start namenode"

#启动hadoop001的历史服务器

ssh hadoop001 "source /etc/profile;mr-jobhistory-daemon.sh start historyserver"

sleep 1

#启动hadoop001到hadoop006的datanode

for i in {001,002,003} ;do

  ssh hadoop$i "source /etc/profile;hadoop-daemon.sh start datanode"

done

sleep 1

#启动hadoop001,hadoop002的ResourceManager

ssh hadoop002 "source /etc/profile;yarn-daemon.sh start resourcemanager"

ssh hadoop001 "source /etc/profile;yarn-daemon.sh start resourcemanager"

sleep 1

#启动hadoop001到hadoop003的NodeManager

for i in {001,002,003} ;do

  ssh hadoop$i "source /etc/profile;yarn-daemon.sh start nodemanager"

done

sleep 1

echo "-----------starting HBase  HA...-------------"

#启动hadoop001,hadoop003的HMaster

ssh hadoop001 "source /etc/profile;hbase-daemon.sh start master"

ssh hadoop003 "source /etc/profile;hbase-daemon.sh start master"

sleep 1

#启动hadoop001到hadoop003的HRegionServer

ssh hadoop001 "source /etc/profile;hbase-daemon.sh start regionserver"

ssh hadoop002 "source /etc/profile;hbase-daemon.sh start regionserver"

ssh hadoop003 "source /etc/profile;hbase-daemon.sh start regionserver"

echo "--------------------------------------------"

 

#查看全部进程的脚本:alljps.sh

#!/bin/bash

for i in {001,002,003}

do

    echo "hadoop$i:"

    ssh hadoop$i "source /etc/profile;jps"

done

#停止HA方式的Hadoop,ResourceManager,HBase集群的自定义脚本stopab.sh

#!/bin/bash

#stop HBase  HA...

for i in {001,003};do

  ssh hadoop$i "source /etc/profile;hbase-daemon.sh stop master;hbase-daemon.sh stop regionserver"

done

ssh hadoop002 "source /etc/profile;hbase-daemon.sh stop regionserver"

stop-yarn.sh

stop-dfs.sh

for i in {001,002,003};do

  ssh hadoop$i "source /etc/profile;zkServer.sh stop"

done

#sleep 1

#在hadoop001停止历史服务器

ssh hadoop001 "source /etc/profile;mr-jobhistory-daemon.sh stop historyserver"

#确保停止RM

ssh hadoop001 "source /etc/profile;yarn-daemon.sh stop resourcemanager"

#ssh hadoop002 "source /etc/profile;yarn-daemon.sh stop resourcemanager"

#停止每个客户机的电源offall.sh

#!/bin/bash

echo "------------------------"

echo "hostname:$HOSTNAME"

for i in {001,002,003}

do

  if [ "hadoop$i" = $HOSTNAME ] ; then

       continue

     else

       ssh hadoop$i "shutdown -h now"

  fi

done

shutdown -h now

 

2、web浏览namenode节点

http://192.168.207.31:50070

http://192.168.207.32:50070

3、web浏览RM节点

http://192.168.207.31:8088/cluster/cluster

http://192.168.207.32:8088/cluster/cluster

4、web浏览HMaster节点

http://192.168.207.31:60010

http://192.168.207.33:60010

 

八、HBase的HA部署

1、服务部署图

每个节点都解压hbase安装文件,并更改安装目录的拥有者和组为root

hadoop003上做如下步骤:

2、创建目录

#  mkdir -p $hbh/conf/{pid,logs/hbase}

#  vim  $hbh/conf/hbase-site.xml

<?xml version="1.0"?>

<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>

    <!-- HBase数据存储路径要引用HDFS HAnamespace名称,此值来自core-site.xml”fs.defaultFS” -->

    <property>

        <name>hbase.rootdir</name>

        <value>hdfs://ns1/hbase</value>

    </property>

    <!-- 完全分布式模式 -->

    <property>

        <name>hbase.cluster.distributed</name>

        <value>true</value>

    </property>

    <!-- HMaster 节点 -->

    <property>

        <name>hbase.master</name>

        <value>hadoop001:60000,hadoop003:60000</value>

    </property>

    <!-- Zookeeper集群 -->

    <property>

        <name>hbase.zookeeper.quorum</name>

        <value>hadoop001:2181,hadoop002:2181,hadoop003:2181</value>

    </property>

    <!-- znode 路径,Zookeeper集群中有多个HBase集群需要设置不同znode -->

    <property>

        <name>zookeeper.znode.parent</name>

        <value>/hbase</value>

    </property>

    <!-- HBase 协处理器 -->

    <property>

        <name>hbase.coprocessor.user.region.classes</name>

        <value>org.apache.hadoop.hbase.coprocessor.AggregateImplementation</value>

    </property>

</configuration>

#  vim  $hbh/conf/hbase-env.sh

export JAVA_HOME=/root/app/jdk1.8.0_211

export HBASE_HEAPSIZE=1G

export HBASE_OPTS="-XX:+UseConcMarkSweepGC"

# Configure PermSize. Only needed in JDK7. You can safely remove it for JDK8+

# export HBASE_MASTER_OPTS="$HBASE_MASTER_OPTS -XX:PermSize=128m -XX:MaxPermSize=128m"

# export HBASE_REGIONSERVER_OPTS="$HBASE_REGIONSERVER_OPTS -XX:PermSize=128m -XX:MaxPermSize=128m"

# Extra ssh options.  Empty by default.

export HBASE_SSH_OPTS="-o ConnectTimeout=1 -p 36000"

# Where log files are stored.  $HBASE_HOME/logs by default.

export HBASE_LOG_DIR=$hbh/conf/logs/hbase

# The directory where pid files are stored. /tmp by default.

export HBASE_PID_DIR=$hbh/conf/pid

export HBASE_MANAGES_ZK=false

 

 

 4# vim  regionservers

192.168.207.31  hadoop001

192.168.207.32  hadoop002

192.168.207.33  hadoop003

 6复制到其余节点

#  scp -r $hbh/conf  [email protected]:$hbh/

#  scp -r $hbh/conf  [email protected]: hbh/

 

#  ssh localhost

 

7Hbase HA启动

1,先启动HDFS HA和RM HA:

# startHa.sh

2,如果用单服务启动方式:

# 在hadoop003和hadoop001上启动HMaster和HRegionserver:

#  hbase-daemon.sh start master;hbase-daemon.sh start regionserver

# 在hadoop002上启动HRegionServer

# hbase-daemon.sh start regionserver

8、浏览Hbase HA:

浏览器打开两个HMaster状态页:

http://192.168.207.33:60010

http://192.168.207.31:60010

9HBaseshell操作测试:

#  hbase shell

> create 'users','user_id','address','info'

>list

>  put 'users','anton','info:age','24'

>  get 'users','anton'

>  disable 'users'

>  drop 'users'

2,如果用单服务停止方式:

# 在hadoop001和hadoop003上停止HMaster和HRegionserver:

#  hbase-daemon.sh stop master;hbase-daemon.sh stop regionserver

# 在hadoop002上停止HRegionServer

# hbase-daemon.sh stop regionserver

(PS: 也可以 # stop-hbase.sh )

九、使用HBase的MapReduce实现

1,配置各个节点:

在hadoop003节点做:

# scp  $hbh/conf/hbase-site.xml  [email protected]:$hdh/etc/hadoop/

# scp  $hbh/conf/hbase-site.xml  [email protected]:$hdh/etc/hadoop/

# scp -r $hbh  [email protected]:/root/app/

# scp -r $hbh  [email protected]:/root/app/

# exit

# ssh  hadoop001

# vim $hdh/etc/hadoop/hadoop-env.sh

在末尾添加:

export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:/root/app/hbase-1.2.0-cdh5.7.0/lib/*

# scp $hdh/etc/hadoop/hadoop-env.sh  [email protected]:$hdh/etc/hadoop/

# scp $hdh/etc/hadoop/hadoop-env.sh  [email protected]:$hdh/etc/hadoop/

2,启动集群:

启动这个HBase HA集群:startab.sh

如果发现哪个节点的进程没有启动,则用hadoop-daemon.sh或者yarn-daemon.sh去启动.

浏览namenode节点:

http://192.168.207.31:50070

http://192.168.207.32:50070

浏览Hbase HA:

http://192.168.207.31:60010

http://192.168.207.33:60010

3,验证配置:

  先用hbase shell创建表scores,并在hbase shell添加两行记录。

然后,在hadoop001节点:

# hadoop jar /root/app/hbase-1.2.0-cdh5.7.0/lib/hbase-server-1.2.0-cdh5.7.0.jar rowcounter scores

  可以在输出信息的最后看到:

org.apache.hadoop.hbase.mapreduce.RowCounter$RowCounterMapper$Counters

ROWS=2

File Input Format Counters

Bytes Read=0

File Output Format Counters

Bytes Written=0

4,批量数据导入到Hbase

  参考《基于Hadoop与Spark的大数据开发实战》page.181.

在hadoop001节点:

先用hbase shell创建表music(只需指定一个列族info,无需指定列):

hbase(main):006:0> create 'music','info'

在hdfs上创建目录/input2/music2:

# hdfs dfs -mkdir -p /input2/music2

然后将含有记录的/root下的文件:

music1.txt,music2.txt,music3.txt

上传到/input2/music2 :

# hdfs dfs -put music*.txt /input2/music2

注意,hdfs事先不能已有/user/root/tmp2,有则应该立即删除.

# hadoop jar /root/app/hbase-1.2.0-cdh5.7.0/lib/hbase-server-1.2.0-cdh5.7.0.jar importtsv -Dimporttsv.bulk.output=tmp2 -Dimporttsv.columns=HBASE_ROW_KEY,info:name,info:singer,info:gender,info:ryghme,info:terminal music /input2/music2

输出信息的最后两行:

File Input Format Counters

        Bytes Read=1571

    File Output Format Counters

        Bytes Written=9795

执行完毕后,会发现在hdfs上新建了目录:/user和其子目录: /user/root/tmp2

将HDFS内存储的数据导入到HBase的表music内:

#  hadoop jar $hbh/lib/hbase-server-1.2.0-cdh5.7.0.jar completebulkload  tmp2   music

此时,可以通过hbase shell看到表music内填充了32行:

 

十、在hadoop002安装MySql和Hive

1,软件版本:

hive-1.1.0-cdh5.7.0, MySQL5.6,mysql-connector-java-5.1.45

2,在/etc/profile加内容:

export  hih=/root/app/hive-1.1.0-cdh5.7.0

export  PATH=$PATH:$hih/bin

3, 在hadoop002安装mysql 5.6:

# yum list installed | grep mysql

mysql-libs.i686     5.1.73-8.el6_8   @anaconda-CentOS-201806291517.i386/6.10

删除已有的mysql文件

# yum -y remove mysql-libs.i686

 

安装及配置

# wget http://repo.mysql.com/mysql-community-release-el6-5.noarch.rpm

# rpm -ivh mysql-community-release-el6-5.noarch.rpm

# yum repolist all | grep mysql

安装MYSQL数据库

# yum install mysql-community-server -y

会下载300多MB的文件.

#chkconfig --list | grep mysqld

#设置为开机启动

# chkconfig --list | grep mysqld

# chkconfig mysqld on

#设置远程root

#启动mysql

# service mysqld start

#设置root密码

# mysql_secure_installation

按照提示回答Y或n;

输入当前密码时,直接按下回车键;

然后设置密码为123456,不删除anonymous账号,允许root远程登录,保留测试数据库,刷新all privileges.

#登陆root账号

# mysql -uroot -p

输入上述设置的密码.

#建立远程root用户

mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;

mysql> flush privileges;

此时可以发现mysql的user表多了一行,该行的Host为%,User为root.

#设置utf-8编码

#查看mysql原本编码:

mysql> show variables like 'character%';

+--------------------------+----------------------------+

| Variable_name            | Value                      |

+--------------------------+----------------------------+

| character_set_client     | utf8                       |

| character_set_connection | utf8                       |

| character_set_database   | latin1                     |

| character_set_filesystem | binary                     |

| character_set_results    | utf8                       |

| character_set_server     | latin1                     |

| character_set_system     | utf8                       |

| character_sets_dir       | /usr/share/mysql/charsets/ |

+--------------------------+----------------------------+

8 rows in set (0.00 sec)

下述背景色为黄色部分未作.

#更改mysql的配置文件

# gedit /etc/my.cnf

#在[mysqld]下添加:

character-set-server=utf8

collation-server=utf8_general_ci

performance_schema_max_table_instances=400

table_definition_cache=400

table_open_cache=256

#对sql_mode做如下修改

sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

#继续添加:

[mysql]

default-character-set = utf8

[mysql.server]

default-character-set = utf8

[client]

default-character-set = utf8

在[mysqld_safe]下添加:

default-character-set = utf8

 

#重启mysql

# service mysqld restart

#再次查看编码:

# mysql -uroot -p

mysql> show variables like 'character%';

 

4,在hadoop002安装和配置hive:

#解压hive-1.1.0-cdh5.7.0.tar.gz到/root/app,并更改拥有者和组为root

# tar -zxvf  hive-1.1.0-cdh5.7.0.tar.gz  -C /root/app

# chown -R  root /root/app

# chgrp -R root /root/app

# cp $hih/conf/hive-env.sh.template $hih/conf/hive-env.sh

# gedit  $hih/conf/hive-env.sh

只需设置一处:

HADOOP_HOME=/root/app/hadoop-2.6.0-cdh5.7.0

# gedit $hih/conf/hive-site.xml

<?xml version="1.0"?>

<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

 

<configuration>

<property>

<name>javax.jdo.option.ConnectionURL</name>

<value>jdbc:mysql://localhost:3306/hive?createDatabaseIfNotExist=true</value>

</property>

<property>

<name>javax.jdo.option.ConnectionDriverName</name>

<value>com.mysql.jdbc.Driver</value>

</property>

<property>

<name>javax.jdo.option.ConnectionUserName</name>

<value>root</value>

</property>

<property>

<name>javax.jdo.option.ConnectionPassword</name>

<value>123456</value>

</property>

</configuration>

5, 配置mysql-connector-java-5.1.47-bin.jar

步骤:下载mysql-connector-java-5.1.47.tar.gz。

解压后,将mysql-connector-java-5.1.47-bin.jar复制到$hih/lib/

为验证设置而重启hadoop002:

#reboot

6,启动前述HA方式的Hadoop,ResourceManager,HBase,然后启动hive

先开启hadoop001和hadoop003的电源.

#运行启动HA方式的Hadoop,ResourceManager,HBase集群的自定义脚本

# startab.sh

在hadoop002使用hive:

运行命令hive:

# hive

此时,mysql数据库内将立即创建数据库hive

此时,必须修改hive数据库的字符集为latin1,否则无法通过hive命令行创建内部表:

# mysql -uroot -p

mysql> ALTER DATABASE hive CHARACTER SET latin1;

在hive命令行上操纵数据库和表:

(注意,hive创建的数据库无法通过mysql直接访问到.)

显示全部数据库:

hive> show databases;

连接默认数据库:

hive> use default;

创建表:

hive> create table student(id int,age int,name string) row format delimited fields terminated by '\t';

hive> desc student;

id                      int                                         

age                     int                                         

name                    string   

下述背景色为黄色部分未作.

 

增加一列:

hive> alter table student add columns(address string);

更新全部列,相当于重新规定表的结构:

hive> alter table student replace columns(id int,name string);

则表只有id和name这两列了.

插入一条记录:

hive> insert into student values(1,19,'aLi');

将启动Map- Reduce过程,用时可能会超过30秒.

hive> select * from student;

OK

  1. 9  aLi

显示全部表:

hive> show tables;

hive>quit;

7,再次修改hive配置

# gedit $hih/conf/hive-site.xml

末尾添加几个属性:

<property>

  <name>hive.enforce.bucketing</name>

  <value>true</value>

</property>

<property>

  <name>hive.support.concurrency</name>

  <value>true</value>

</property>

<property>

  <name>hive.exec.dynamic.partition.mode</name>

  <value>nonstrict</value>

</property>

<property>

  <name>hive.txn.manager</name>

  <value>org.apache.hadoop.hive.ql.lockmgr.DbTxnManager</value>

</property>

<property>

  <name>hive.compactor.initiator.on</name>

  <value>true</value>

</property>

<property>

  <name>hive.compactor.worker.threads</name>

  <value>1</value>

</property>

<property>

  <name>hive.in.test</name>

  <value>true</value>

</property>

2019年5月28日做了上述对hive的更改.

 

 

附录一,Hive的drop table时没有反应的原因和解决办法。

mysql> show variables like 'char%';

第一步:进入mysql,输入:show variables like 'char%'。

此时的character_set_database编码是utf8,问题就出在这里,如果你是latin1,可能是在建好hive数据库后,没有第一时间将character_set_database编码由utf8修改为latin1.而是去hive中create了一张表.而后才将character_set_database编码由utf8改成了latin1,解决方法都一样。

第二步(开始解决问题):在mysql中drop database hive。

mysql> drop database hive;

这一步完成后,hive原来的表都没有了,但表对应于hdfs上的目录仍然存在;此时,可以直接删除hdfs上的这些目录。

第三步:重新create hive,并设置编码

mysql> create database hive;

mysql> alter database hive character set latin1;

第四步:重新启动hive。

此后,可以通过drop  table删除hive的表了。