本篇将在阿里云ECS服务器部署HADOOP集群(一):Hadoop完全分布式集群环境搭建的基础上搭建,多添加了一个 datanode 节点 。
1 节点环境介绍:
1.1 环境介绍:
- 服务器:三台阿里云ECS服务器:master, slave1, slave2
- 操作系统:CentOS 7.3
- Hadoop:hadoop-2.7.3.tar.gz
- Java: jdk-8u77-linux-x64.tar.gz
- HBase: hbase-1.2.6-bin.tar.gz
- ZooKeeper: zookeeper-3.4.14.tar.gz
1.2 各节点角色分配
- master: NameNode、SecondaryNameNode、HMaster、QuorumPeerMain
- slave1: DataNode、HMaster(候补节点)、HRegionServer、QuorumPeerMain
- slave2: DataNode、HRegionServer、QuorumPeerMain
2 HBase 下载
下载 hbase-1.2.6-bin.tar.gz 并在合适的位置解压缩,笔者这里解压缩的路径为:
/usr/local
将解压得到的目录改名为 hbase
1 cd /usr/local 2 mv hbase-1.2.6/ hbase/
3 添加 HBase 环境变量
在"/etc/profile"中添加内容:
1 export HBASE_HOME=/usr/local/hbase 2 export PATH=$PATH:$HBASE_HOME/bin
重新加载环境:
source /etc/profile
4 修改 HBase 配置信息
4.1 修改 hbase 环境变量 (hbase-env.sh)
编辑文件:
vim $HBASE_HOME/conf/hbase-env.sh
添加内容:
1 export JAVA_HOME=/usr/local/jdk1.8 2 export HBASE_CLASSPATH=/usr/local/hadoop/etc/hadoop3 export HBASE_MANAGES_ZK=false
关于 HBASE_CLASSPATH , 官方文档解释如下:Of note, if you have made HDFS client configuration changes on your Hadoop cluster, such as configuration directives for HDFS clients, as opposed to server-side configurations, you must use one of the following methods to enable HBase to see and use these configuration changes:
- Add a pointer to your
HADOOP_CONF_DIR
to theHBASE_CLASSPATH
environment variable in hbase-env.sh. - Add a copy of hdfs-site.xml (or hadoop-site.xml) or, better, symlinks, under ${HBASE_HOME}/conf, or
- if only a small set of HDFS client configurations, add them to hbase-site.xml.
An example of such an HDFS client configuration is dfs.replication
. If for example, you want to run with a replication factor of 5, HBase will create files with the default of 3 unless you do the above to make the configuration available to HBase.
HBASE_MANAGES_ZK 设置是否使用内置 ZooKeeper ,默认为 true 也就是使用内置 ZooKeeper 笔者这里使用外置 ZooKeeper 。(生产环境建议使用外置ZooKeeper,维护起来比较方便,可参考到底要不要用hbase自带的zookeeper)
4.2 修改 hbase 默认配置(hbase-site.xml)
编辑文件:
vim $HBASE_HOME/conf/hbase-site.xml
配置可参考如下代码:
1 <configuration> 2 <!--HBase 的数据保存在 HDFS 对应的目录下--> 3 <property> 4 <name>hbase.rootdir</name> 5 <value>hdfs://master:9000/hbase</value> 6 </property> 7 <!--是否分布式环境--> 8 <property> 9 <name>hbase.cluster.distributed</name> 10 <value>true</value> 11 </property> 12 <!--配置 ZK 的地址, 三个节点都启用 ZooKeeper--> 13 <property> 14 <name>hbase.zookeeper.quorum</name> 15 <value>master,slave1,slave2</value> 16 </property> 17 <!--内置 ZooKeeper 的数据目录--> 18 <property> 19 <name>hbase.zookeeper.property.dataDir</name> 20 <value>/usr/local/hbase/zookeeper</value> 21 </property> 22 </configuration>
4.3 指定 regionservers (regionservers)
编辑文件:
vim $HBASE_HOME/conf/regionservers
添加内容:
1 slave1 2 slave2
4.4 指定候补节点(backup-masters)
这个文件需要自己创建。
编辑文件:
vim $HBASE_HOME/conf/backup-masters
添加内容:
slave1
为了保证HBase集群的高可靠性,HBase支持多Backup Master 设置。当Active Master挂掉后,Backup Master可以自动接管整个HBase的集群。
5 分发 hbase 和 profile 给 slave1,slave2(建议将 hbase 压缩后分发)
1 scp -r /usr/local/hbase slave1:/usr/local 2 scp -r /usr/local/hbase slave2:/usr/local
1 scp /etc/profile slave1:/etc/ 2 scp /etc/profile slave2:/etc/
分发后分别在各节点重新加载环境并测试,可使用 hbase version 测试。
6 安装 ZooKeeper
参考 阿里云ECS服务器部署HADOOP集群(三):ZooKeeper 完全分布式集群搭建
7 开放相关端口(坑!!!!!!)
注:服务器端口全部开放的可以直接跳过这一步,不想看笔者BB的也可以直接跳到该小结的最后。
可能是由于计算机网络没学好,从搭建Hadoop开始大半的时间都被浪费到这个端口问题上,各种 Error 全都是因为这个问题。😭😭😭
至此发誓一定要认真重新学习一遍计算机网络!!!
回到正题:阿里云服务器默认只开放三个端口,如下
所以Hadoop集群搭建的各种所需端口都需要自己手动开放。
看到一些例如一些废弃的端口如 yarn 的 web ui 旧端口 8088 会被黑客用来挖矿的关于端口开放安全性的问题,笔者尝试一个个的参照配置文件一个个的添加端口,结果遇到各种问题。例如
- web UI 打不开
- web UI 显示内容有问题
- 各节点的通讯问题
- hbase 报错
起初在 Hadoop 配置的时候还好,问题还比较容易发现,但是随着从底层的向上延伸到了 Hadoop 的组件问题就变的很神秘了, 例如在 hbase 中遇到的
- ERROR: org.apache.hadoop.hbase.PleaseHoldException: Master is initializing;
- ERROR: org.apache.hadoop.hbase.ipc.ServerNotRunningYetException: Server is not running yet;
- master.ServerManager: Waiting for region servers count to settle;
- The Load Balancer is not enabled which will eventually cause performance degradation in HBase as Regions will not be distributed across all RegionServers. The balancer is only expected to be disabled during rolling upgrade scenarios.
-
zookeeper.ClientCnxn: Session 0x0 for server null, unexpected error, closing socket connection and attempting reconnect
java.net.SocketException: Network is unreachable;
-
Caused by: org.apache.hadoop.hbase.ipc.RemoteWithExtrasException(org.apache.hadoop.hbase.exceptions.OutOfOrderScannerNextException): org.apache.hadoop.hbase.exceptions.OutOfOrderScannerNextException: Expected nextCallSeq: 1 But the nextCallSeq got from client: 0; request=scanner_id: 5643550422109494702 number_of_rows: 100 close_scanner: false next_call_seq: 0
-
master.SplitLogManager: finished splitting (more than or equal to) 0 bytes
-
hbase:meta,,1.1588230740 state=PENDING_OPEN, ts=Tue Nov 24 08:26:45 UTC 2015 (1098s ago), server=amb2.service.consul,16020,1448353564099
-
17/11/12 22:44:10 INFO hdfs.DFSClient: Exception in createBlockOutputStream
java.io.IOException: Bad connect ack with firstBadLink as 192.168.0.101:50010
at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.createBlockOutputStream(DFSOutputStream.java:1456)
at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.nextBlockOutputStream(DFSOutputStream.java:1357)
at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.run(DFSOutputStream.java:587)
注:这次没有记录Error所以以上都是从浏览器历史记录中找到的,有些不完整的用网上的相似的Error替代了。
这些问题在网上找到的所有解决方法大致归结为以下几点:
- 关闭防火墙
- 禁用 selinux
- 退出 hdfs 安全模式
- 配置时间同步
- hosts 文件的各节点 IP 内外网配置
- 重新格式化 hdfs
- 修复 hbase
- 存在节点未启动或非正常关闭
但是:
- 阿里云服务器防火墙默认是关闭的
- 阿里云服务器 selinux 默认是禁用的
- hdfs 并没有处在安全模式
- 阿里云服务器时间自动同步
- 在 阿里云ECS服务器部署HADOOP集群(一):Hadoop完全分布式集群环境搭建 已经配置好
- hdfs 删掉了 tmp 重新格式化试了没用
- 修复了 hbase 没用
- 节点均正常启动并且没有异常关闭
所以试了这么多方法我的这么多Error一个都没解决。。。
认真看了官方文档尝试了各种配置甚至尝试了各个版本的hbase,在老师的开导下先换了HMaster的放置的节点失败了,尝试伪分布式也失败,但这时的 Error 已经不像刚开始的又少又难懂,网上匹配的结果也很少,范围越来越小,Error越来越明显了。然后就发现了原来是 hdfs 之间的连接问题,但是因为菜还不太明确问题,所以便尝试将 hdfs 设置成伪分布式,终于成功了!然后又尝试配置两个节点的 hdfs 集群,这时终于从 log 中确定了问题所在,原来是节点的 50010 50020 端口没开放,导致节点间无法通讯。于是一气之下打开了服务器的所有端口,重新配置了一遍便成功了。
总结:log 一定要认真仔细查看并去理解,如果遇到报错很少并且各种方法都无效的情况时,应该尝试更换思路,比如简单化当前的配置,缩小范围,获得一些新的、更多的Error,绝对不能放弃,只要是个错误,就一定可以得到解决,除非它本身就是个Error。。。学会变换不同的思路去解决问题,方法肯定尝试不完~
所以对于端口问题有两种解决办法:
- 根据官方文档将默认配置需要的端口一个个的开放。
- 直接 1/65535, 将所有端口开放,可能会出现安全问题。
8 启动使用外置 ZooKeeper 的 HBase
8.1 启动各组件
启动顺序:hdfs-->zookeeper-->hbase
1 # master 2 start-dfs.sh 3 zkServer.sh start 4 # slave1, slave2 5 zkServer.sh start 6 # master 7 start-base.sh
8.2 检查各节点的所有进程是否已启动
[root@master ~]# jps 17136 HMaster 14532 QuorumPeerMain 16885 SecondaryNameNode 16695 NameNode 17324 Jps [root@slave1 ~]# jps 11138 HRegionServer 11475 Jps 9479 QuorumPeerMain 11015 DataNode 11225 HMaster [root@slave2 ~]# jps 5923 DataNode 6216 Jps 5288 QuorumPeerMain 6040 HRegionServer
9 访问HBase
9.1 通过 HBase Shell 访问
进入 hbase shell
hbase shell
在 hbase shell 中输入 list 结果如下
hbase(main):001:0> list TABLE 0 row(s) in 0.3050 seconds => []
9.2 通过 Web 访问
打开网页 http://master:16010(IP根据实际情况修改),可以看到如下页面:
10 搭建完成
至此,基于阿里云三台服务器的HBASE完全分布式集群搭建就完成了!