1. 依赖
hadoop-hdfs hadoop3 完全分布式安装
zookeeper zookeeper 集群搭建
2. 下载安装包
选择自己想要的版本点击下载,笔者这里选择 2.4.17
3. 上传解压
使用工具将安装包上传的服务器上
笔者这里选择 上传到 /opt/software 目录,解压到 /opt/module 这两个目录可以随意选择
tar -zxvf hbase-2.4.17-bin.tar.gz -C /opt/module
cd /opt/module
mv hbase-2.4.17 hbase
4. 修改相关配置
cd /opt/module/hbase/conf
4.1. hbase-env.sh
# 应用程序 PID 文件的存放路径,默认 /tmp,这里一定要修改,否则会被回收导致程序无法关闭等问题
export HBASE_PID_DIR=/opt/module/hbase/pids
# 关闭 hbase 内置的 zookeeper,我们需要使用自己搭建的集群
export HBASE_MANAGES_ZK=false
# 配置 master 节点内存大小(这里仅供学习使用所以配置较小,实际环境需要4g以上)
export HBASE_MASTER_OPTS="-Xms64m -Xmx128m"
# 配置 regionServer 节点内存大小(这里仅供学习使用所以配置较小,实际环境需要8g以上)
export HBASE_REGIONSERVER_OPTS="-Xms64m -Xmx128m"
4.2. JVM的一些优化参考(可忽略)
设置年轻代(Young Generation)的内存大小为512MB,它包含Eden区和两个Survivor区,主要用于存放新创建的对象
-Xmn512m
启用CMS(Concurrent Mark Sweep)垃圾回收器。CMS是一个并发的垃圾回收器,它旨在通过减小Full GC的暂停时间来优化应用程序的性能。但是在正常的内存回收中存在一定风险,但是我们的 REGIONSERVER 项目储存的基本都是数据,所以启用该回收器不会出现问题,同时能够提高垃圾回收的性能!但是,从Java 9开始,CMS已经被废弃,并且在后续的Java版本中不再可用。
-XX:+UseConcMarkSweepGC
CMS垃圾回收器在老年代空间使用率达到 70% 时触发并发标记阶段。意味着当老年代空间占用率达到 70% 时,CMS垃圾回收器将开始执行并发标记过程。这里是为了让 REGIONSERVER 服务尽快启动回收,并且设置为只有该种情况才触发标记,忽略其它情况
-XX:CMSInitiatingOccupancyFraction=70
-XX:+UseCMSInitiatingOccupancyOnly
启用ParNew垃圾回收器作为年轻代的垃圾回收器。ParNew是Serial垃圾回收器的并行版本,它使用多个线程来加速年轻代的垃圾回收过程。但是,请注意,从Java 9开始,ParNew垃圾回收器也不再被推荐使用,因为G1垃圾回收器已经成为了默认的垃圾回收器,并且在大多数情况下提供了更好的性能。
-XX:+UseParNewGC
组装起来为:(未验证,只是建议)
export HBASE_REGIONSERVER_OPTS="-Xms2g -Xmx10g -Xmn512m -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=70 -XX:+UseCMSInitiatingOccupancyOnly -XX:+UseParNewGC"
4.3. hbase-site.xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- 设置 是否开启集群模式 -->
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<!-- 设置 hdfs 访问路径 -->
<property>
<name>hbase.rootdir</name>
<value>hdfs://mitchell-101:8020/hbase</value>
</property>
<!-- 设置 zookeeper 的服务器集群地址 -->
<property>
<name>hbase.zookeeper.quorum</name>
<value>mitchell-101:2181,mitchell-102:2181,mitchell-103:2181</value>
</property>
<!-- 设置 zookeeper 的会话超时时间,默认90000 (毫秒),建议设置为 20000 以上 -->
<property>
<name>zookeeper.session.timeout</name>
<value>30000</value>
</property>
<!-- 设置大合并的时间间隔,默认604800000秒 (7天),建议设置为 0,关闭自动合并,关闭后需要记得手动合并 -->
<property>
<name>hbase.hregion.majorcompaction</name>
<value>604800000</value>
</property>
<!-- 设置 HFile 文件的拆分上限值,10737418240 (10GB) ,可以设置为 21474836480 (20GB) -->
<property>
<name>hbase.hregion.max.filesize</name>
<value>10737418240</value>
</property>
</configuration>
4.3. backup-masters
这里配置作为 master 的服务器,可以配置多个从而达到高可用
mitchell-101
4.4. regionservers
这里配置作为
mitchell-101
mitchell-102
mitchell-103
5. 解决 Log4j 兼容性问题
这里是因为 hadoop 和 hbase 同时都有 slf4j 的实现,
而 hbase 底层是依赖 hadoop 的,所以在启动 hbase 时就会出现多实现冲突的问题
cd /opt/module/hbase/lib/client-facing-thirdparty
mv slf4j-reload4j-1.7.33.jar slf4j-reload4j-1.7.33.jar.bak
6. 分发程序包
其中 xsync 是一个分发脚本,在 hadoop 的安装教程中有脚本代码
cd /opt/module
xsync.sh hbase
7. 常用启停命令
cd /opt/module/hbase
# 启动集群
./bin/start-hbase.sh
# 关闭集群
./bin/stop-hbase.sh
# 单独启停 master
./bin/hbase-daemon.sh start master
./bin/hbase-daemon.sh stop master
# 单独启停 regionserver
./bin/hbase-daemon.sh start regionserver
./bin/hbase-daemon.sh stop regionserver
# 启动客户端连接(需要再 master 所在的服务器执行)
./bin/hbase shell
查看是否启动成功 => jpsall.sh
8. 启停帮助脚本
vim mhbase.sh
#!/bin/bash
if [ $# -lt 1 ]
then
echo "请输入参数 start 或者 stop"
exit;
fi
case $1 in
"start")
echo "=============================== 启动 hbase 集群 ==============================="
/opt/module/hbase/bin/start-hbase.sh
;;
"stop")
echo "=============================== 关闭 hbase 集群 ==============================="
/opt/module/hbase/bin/stop-hbase.sh
;;
*)
echo "请输入参数 start 或 stop"
;;
esac
9. 关于版本
hadoop 和 hbase 是可能存在版本冲突的,并且官方文档上说的相互兼容的版本也不是太靠谱
如果你检查了所有配置确定无误但是集群还是起不来的话,那很有可能就是版本问题了
笔者这里就遇到了日志里没有任何报错,但是启动集群时 regionservice 怎么都起不来的,访问 master 的网页也看不到 master 和 regionservice
同时 zookeeper 也明显少了很多东西,这里折腾了好久后面换了个版本发现就可以了,坑爹o(╯□╰)o
所以如果在安装的时候确定了配置什么都没有问题,那很可能就是版本的问题了
这里笔者推荐两个兼容的版本:hadoop 3.3.4 + hbase 2.4.17
由于 hadoop 是 hbase 的基础,这边建议的 hadoop 尽量不要安装过新的版本,因为新版的 hadoop,hbase 可能还没来得及兼容
10. JAVA 客户端连接测试
10.1. pom 依赖
<!-- hbase 客户端依赖,版本号尽量保持和集群的版本相同 -->
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-client</artifactId>
<version>2.4.17</version>
</dependency>
10.2. JAVA 代码
package com.mitchell.mus.tests.main;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Admin;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;
import java.io.IOException;
public class HbaseTests {
public static void main(String[] args) throws IOException {
// 声明一个配置类,配置 hbase 集群连接的 zookeeper 集群的地址和端口
Configuration configuration = HBaseConfiguration.create();
configuration.set("hbase.zookeeper.quorum", "192.168.200.101,192.168.200.102,192.168.200.103");
configuration.set("hbase.zookeeper.property.clientPort", "2181");
// 创建连接
Connection connection = ConnectionFactory.createConnection(configuration);
// 获取元数据操作对象(主要用于对表结构的操作)
Admin admin = connection.getAdmin();
// 获取要操作的表名对象:命名空间,表明
TableName tableName = TableName.valueOf("default", "b_student");
// 判断表是否存在,TableName 的两个参数
boolean flag = admin.tableExists(tableName);
System.out.println(flag);
}
}