基于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
【前提工作】
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部署完毕后的服务.
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.sh和mapred-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)在hadoop001或hadoop002节点做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状态.
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),共7个hadoop进程.
2)浏览文件:
作者已经上传necklace.txt文件到hdfs的根目录:
hadoop001:
# hadoop fs -cat /necklace.txt
能正常显示necklace.txt的全部内容.
3、故障转移实验
1)只是终止处于active状态的namenode进程
假设此时hadoop001的namenode处于active状态;
将hadoop001的namenode进程用kill命令终止:
# kill namenode进程的pid
此时可以发现hadoop002的namenode立刻转换为active状态!而且能正常浏览necklace.txt的内容.说明自动故障转移成功!
因此,如果hadoop001和hadoop002上只运行NameNode进程,而不运行其它Hadoop进程,则任何一个NameNode所在的节点即使断电,也不会影响整个Hadoop系统的运行。
在终止了namenode进程的节点上启动故障节点的namenode:
# hadoop-daemon.sh start namenode
2)节点断电:
将namenode处于active状态的节点hadoop001通过虚拟机直接”关闭电源”。
另一个namenode节点(hadoop002)始终无法自动转为active状态。此时,手动**hadoop002的NameNode:
$hdh/bin/hdfs haadmin -transitionToActive nn2 --forceactive
可以通过下述命令查看其是否为active状态:
$hdh/bin/hdfs haadmin -getServiceState nn2
可以发现,hadoop002的namenode无法转为active状态。
原因:这是由于我们这个集群的namenode所在的节点还运行了其它关键服务而造成的。
现在做恢复:
启动hadoop001,然后,启动zk,hdfs和namenode:
# zkServer.sh start
# start-dfs.sh
启动了hadoop001的5个hadoop进程.
注意!此时hadoop002的namenode自动转换为了active状态, 并且能正常浏览hdfs上的necklace.txt.说明自动故障转移成功!
此时,可以在hadoop002或hadoop001上浏览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节点
3、web浏览RM节点
http://192.168.207.31:8088/cluster/cluster
http://192.168.207.32:8088/cluster/cluster
4、web浏览HMaster节点
八、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 HA的namespace名称,此值来自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
7、Hbase 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状态页:
9、HBase的shell操作测试:
# 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节点:
浏览Hbase HA:
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
- 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的表了。