视频教程链接:https://www.bilibili.com/video/BV1Z84y1z787/
HBase是一个开源的、分布式的、版本化的、非关系数据库,适合对大数据进行随机、实时的读/写访问。
HBase 是 Apache Hadoop 项目的子项目,适合存储非结构化数据,基于列而不是基于行。
HBase的名字的来源是Hadoop database,即 Hadoop 数据库。
参考文章:
《VMware 安装 Centos 7 Linux 虚拟机》(含b站视频教程链接):
https://www.hanshuixin.com/app/blog/detail/839c494401839c52b7642c9380920001
参考文章:
《Centos Linux 安装 JDK 8、配置环境变量》(含b站视频教程链接):
https://www.hanshuixin.com/app/blog/detail/839c494401839e49fa8a2c9380920002
参考文章:
《Centos Linux 安装单机 Hadoop(HDFS)》(含b站视频教程链接):
https://www.hanshuixin.com/app/blog/detail/839c49440183a41b4a732c9380920003
查看 JDK 版本 与 HBase 版本的兼容性对照表:
官网文档地址:
https://hbase.apache.org/book.html#basic.prerequisites
HBase Version | JDK 6 | JDK 7 | JDK 8 | JDK 11 |
---|---|---|---|---|
HBase 2.3+ | ❌ 不兼容 | ❌ 不兼容 | ✔️ 兼容 | ⚠️ 未经测试* |
HBase 2.0-2.2 | ❌ 不兼容 | ❌ 不兼容 | ✔️ 兼容 | ❌ 不兼容 |
HBase 1.2+ | ❌ 不兼容 | ✔️ 兼容 | ✔️ 兼容 | ❌ 不兼容 |
HBase 1.0-1.1 | ❌ 不兼容 | ✔️ 兼容 | ⚠️ 未经测试 | ❌ 不兼容 |
HBase 0.98 | ✔️ 兼容 | ✔️ 兼容 | ⚠️ 未经测试 | ❌ 不兼容 |
HBase 0.94 | ✔️ 兼容 | ✔️ 兼容 | ❌ 不兼容 | ❌ 不兼容 |
查看安装机器的 JDK 版本
java -version
# 结果为 1.8.0_341
根据结果可知,JDK 8 可以安装 HBase 1.2+ 、HBase 2.0-2.2 、HBase 2.3+ 。
查看Hadoop 版本 与 HBase 版本的兼容性对照表
官网文档地址:
https://hbase.apache.org/book.html#basic.prerequisites
HBase-2.3.x | HBase-2.4.x | |
---|---|---|
Hadoop-2.10.x | ✔️ 兼容 | ✔️ 兼容 |
Hadoop-3.1.0 | ❌ 不兼容 | ❌ 不兼容 |
Hadoop-3.1.1+ | ✔️ 兼容 | ✔️ 兼容 |
Hadoop-3.2.x | ✔️ 兼容 | ✔️ 兼容 |
Hadoop-3.3.x | ✔️ 兼容 | ✔️ 兼容 |
HBase-2.0.x | HBase-2.1.x | HBase-2.2.x | |
---|---|---|---|
Hadoop-2.6.1+ | ✔️ 兼容 | ❌ 不兼容 | ❌ 不兼容 |
Hadoop-2.7.[0-6] | ❌ 不兼容 | ❌ 不兼容 | ❌ 不兼容 |
Hadoop-2.7.7+ | ✔️ 兼容 | ✔️ 兼容 | ❌ 不兼容 |
Hadoop-2.8.[0-2] | ❌ 不兼容 | ❌ 不兼容 | ❌ 不兼容 |
Hadoop-2.8.[3-4] | ✔️ 兼容 | ✔️ 兼容 | ❌ 不兼容 |
Hadoop-2.8.5+ | ✔️ 兼容 | ✔️ 兼容 | ✔️ 兼容 |
Hadoop-2.9.[0-1] | ⚠️ 未经测试 | ❌ 不兼容 | ❌ 不兼容 |
Hadoop-2.9.2+ | ⚠️ 未经测试 | ⚠️ 未经测试 | ✔️ 兼容 |
Hadoop-3.0.[0-2] | ❌ 不兼容 | ❌ 不兼容 | ❌ 不兼容 |
Hadoop-3.0.3+ | ❌ 不兼容 | ✔️ 兼容 | ❌ 不兼容 |
Hadoop-3.1.0 | ❌ 不兼容 | ❌ 不兼容 | ❌ 不兼容 |
Hadoop-3.1.1+ | ❌ 不兼容 | ✔️ 兼容 | ✔️ 兼容 |
HBase-1.5.x | HBase-1.6.x | HBase-1.7.x | |
---|---|---|---|
Hadoop-2.7.7+ | ✔️ 兼容 | ❌ 不兼容 | ❌ 不兼容 |
Hadoop-2.8.[0-4] | ❌ 不兼容 | ❌ 不兼容 | ❌ 不兼容 |
Hadoop-2.8.5+ | ✔️ 兼容 | ✔️ 兼容 | ✔️ 兼容 |
Hadoop-2.9.[0-1] | ❌ 不兼容 | ❌ 不兼容 | ❌ 不兼容 |
Hadoop-2.9.2+ | ✔️ 兼容 | ✔️ 兼容 | ✔️ 兼容 |
Hadoop-2.10.x | ⚠️ 未经测试 | ✔️ 兼容 | ✔️ 兼容 |
HBase-1.0.x (Hadoop 1.x is NOT supported) | HBase-1.1.x | HBase-1.2.x | HBase-1.3.x | HBase-1.4.x | |
---|---|---|---|---|---|
Hadoop-2.4.x | ✔️ 兼容 | ✔️ 兼容 | ✔️ 兼容 | ✔️ 兼容 | ❌ 不兼容 |
Hadoop-2.5.x | ✔️ 兼容 | ✔️ 兼容 | ✔️ 兼容 | ✔️ 兼容 | ❌ 不兼容 |
Hadoop-2.6.0 | ❌ 不兼容 | ❌ 不兼容 | ❌ 不兼容 | ❌ 不兼容 | ❌ 不兼容 |
Hadoop-2.6.1+ | ⚠️ 未经测试 | ⚠️ 未经测试 | ✔️ 兼容 | ✔️ 兼容 | ❌ 不兼容 |
Hadoop-2.7.0 | ❌ 不兼容 | ❌ 不兼容 | ❌ 不兼容 | ❌ 不兼容 | ❌ 不兼容 |
Hadoop-2.7.1+ | ⚠️ 未经测试 | ⚠️ 未经测试 | ✔️ 兼容 | ✔️ 兼容 | ✔️ 兼容 |
HBase-0.92.x | HBase-0.94.x | HBase-0.96.x | HBase-0.98.x (Support for Hadoop 1.1+ is deprecated.) | |
---|---|---|---|---|
Hadoop-0.20.205 | ✔️ 兼容 | ❌ 不兼容 | ❌ 不兼容 | ❌ 不兼容 |
Hadoop-0.22.x | ✔️ 兼容 | ❌ 不兼容 | ❌ 不兼容 | ❌ 不兼容 |
Hadoop-1.0.x | ❌ 不兼容 | ❌ 不兼容 | ❌ 不兼容 | ❌ 不兼容 |
Hadoop-1.1.x | ⚠️ 未经测试 | ✔️ 兼容 | ✔️ 兼容 | ⚠️ 未经测试 |
Hadoop-0.23.x | ❌ 不兼容 | ✔️ 兼容 | ⚠️ 未经测试 | ❌ 不兼容 |
Hadoop-2.0.x-alpha | ❌ 不兼容 | ⚠️ 未经测试 | ❌ 不兼容 | ❌ 不兼容 |
Hadoop-2.1.0-beta | ❌ 不兼容 | ⚠️ 未经测试 | ✔️ 兼容 | ❌ 不兼容 |
Hadoop-2.2.0 | ❌ 不兼容 | ⚠️ 未经测试 | ✔️ 兼容 | ✔️ 兼容 |
Hadoop-2.3.x | ❌ 不兼容 | ⚠️ 未经测试 | ✔️ 兼容 | ✔️ 兼容 |
Hadoop-2.4.x | ❌ 不兼容 | ⚠️ 未经测试 | ✔️ 兼容 | ✔️ 兼容 |
Hadoop-2.5.x | ❌ 不兼容 | ⚠️ 未经测试 | ✔️ 兼容 | ✔️ 兼容 |
查看安装机器的 Hadoop 版本
hadoop version
# 结果为 Hadoop 3.3.4
根据结果可知,Hadoop 3.3.4 可以安装 HBase-2.3.x 、HBase-2.4.x。
官网提供的版本
HBase 官网下载地址:
https://hbase.apache.org/downloads.html
最终选择版本 HBase 2.4.14
当前环境 | 支持的 HBase 版本 | 最终选择 |
---|---|---|
JDK 1.8.0_341 | HBase 1.2+ 、HBase 2.0-2.2 、HBase 2.3+ | HBase 2.4.14 |
Hadoop 3.3.4 | HBase-2.3.x 、HBase-2.4.x | HBase 2.4.14 |
官网下载链接:
https://dlcdn.apache.org/hbase/2.4.14/hbase-2.4.14-bin.tar.gz
国内镜像下载链接:
https://mirrors.tuna.tsinghua.edu.cn/apache/hbase/2.4.14/hbase-2.4.14-bin.tar.gz
将安装包 hbase-2.4.14-bin.tar.gz
上传到 /root/
目录。
# 进入到root目录
cd /root
# 解压
tar -zxvf hbase-2.4.14-bin.tar.gz
# 创建安装目录
mkdir /usr/local/hbase/
# 将解压后的hadoop挪到创建的安装目录
mv /root/hbase-2.4.14/ /usr/local/hbase/
# 进入到安装目录
cd /usr/local/hbase/hbase-2.4.14/
# 查看
ll
hbase-env.sh
# 查看本机 JAVA_HOME 的值
echo $JAVA_HOME
# 结果为 /usr/local/java/jdk1.8.0_341 ,将该值配到下面脚本
vi /usr/local/hbase/hbase-2.4.14/conf/hbase-env.sh
添加以下内容:
export JAVA_HOME=/usr/local/java/jdk1.8.0_341
export HBASE_DISABLE_HADOOP_CLASSPATH_LOOKUP="true"
注:HBase 自带 zookeeper ,上述配置文件中的 HBASE_MANAGES_ZK=true
默认为 true,代表使用自带的 zookeeper。此处使用默认配置,即使用 HBase 自带的 zookeeper。
hbase-site.xml
vi /usr/local/hbase/hbase-2.4.14/conf/hbase-site.xml
添加以下内容:
<property>
<name>hbase.cluster.distributedname>
<value>truevalue>
property>
<property>
<name>hbase.rootdirname>
<value>hdfs://127.0.0.1:9000/hbasevalue>
property>
<property>
<name>hbase.zookeeper.quorumname>
<value>127.0.0.1value>
property>
<property>
<name>hbase.zookeeper.property.dataDirname>
<value>/usr/local/hbase/hbase-2.4.14/data/zookeepervalue>
property>
regionservers
vi /usr/local/hbase/hbase-2.4.14/conf/regionservers
内容设置为:
127.0.0.1
vi /etc/profile
在文件末尾添加以下内容:
export HBASE_HOME=/usr/local/hbase/hbase-2.4.14
export PATH=$HBASE_HOME/bin:$PATH
使环境变量生效:
# 运行配置文件
source /etc/profile
# 检查 PATH 中是否包含 $HBASE_HOME/bin 对应的绝对路径
echo $PATH
HBase 是依赖 Hadoop 的,所以,先启动 Hadoop。
# 查看Hadoop是否启动
jps -l
# 启动Hadoop
start-all.sh
启动脚本位于/usr/local/hbase/hbase-2.4.14/bin/start-hbase.sh
,由于配置了环境变量,可以直接执行start-hbase.sh
脚本进行启动。
启动命令:
start-hbase.sh
hbase shell
# 列出所有命名空间
list_namespace
# 创建一个命名空间
create_namespace 'hbase_ns_test_1'
# 列出所有表
list
# 列出指定命名空间下的所有表
list_namespace_tables 'hbase_ns_test_1'
需求
有两个程序,第一个程序会每隔一小时,将全国每个县区的天气情况记录下来,第二个程序供后人查询某个时间某个地点的天气情况。
要求设计一张HBase表,支持记录并查询 指定时间、指定地点 的 天气历史记录,时间粒度精确到小时、地点粒度精确到县区。
中文表名
天气历史记录表
英文表名
weather_record
HBase 表全名
即 命名空间:表名
hbase_ns_test_1:weather_record
列簇(Column Family)设计
天气信息:weather_info
,存放 天气、温度、湿度、风力;
时空信息:space_time_info
,存放 时间、省、市、县区;
行键(Row Key) 设计
满足查询条件
支持查询 指定时间、指定地点 的天气历史记录。那么 rowkey 必须包含 时间、省、市、县区 这4个信息。
唯一性
时间、省、市、县区 这4个信息拼起来可以唯一确定一条天气历史记录数据。
散列性(防止数据倾斜)
Hbase 在读写数据时需要通过 RowKey 找到对应的 Region。在 HBase 中,一个 Region 就相当于一个数据分片,每个 Region 都有 StartRowKey 和 StopRowKey(用来表示 Region 存储的 RowKey 的范围),HBase表里面的数据是按照 RowKey 来分散存储到不同的 Region 里面的。
散列性要求将数据记录均衡的分散到不同的 Region 中,避免热点现象、导致数据倾斜(当大量请求访问 HBase 集群的一个或少数几个节点,造成少数 RegionServer 的读写请求过多,负载过大,而其他 RegionServer 负载却很小)。
此处使用一个简单方法实现散列:反转时间 作为rowkey的开头。
时间是以年开头的,年份变化很慢;倒序之后为小时开头,小时变化较快。如将2022101201
倒序为1021012202
。这样,rowkey 的开头就是 在 0~9 之间变化的,否则 rowkey 的开头是 2022 的 第一个数字 2。如下表所示:
小时 | 00 | 01 | 02 | … | 23 |
---|---|---|---|---|---|
时间(正序) | 2022101200 | 2022101201 | 2022101202 | … | 2022101223 |
时间(倒序) | 0021012202 | 1021012202 | 2021012202 | … | 3221012202 |
最终 rowkey
rowkey组成:时间(倒序)~省~市~县区
案例:1021012202~GuangDong~GuangZhou~LiWan
表结构
表名 | 天气历史记录表(weather_record) | |||||||||
列簇 | 天气信息(weather_info) | 时空信息(space_time_info) | 行键(rowkey) | |||||||
字段名 | 天气(weather) | 温度(temperature) | 湿度(humidity) | 风力(wind_power) | 时间(time) | 省级(province) | 地市(city) | 县区(county) | ||
sunny | 28 | 0.33 | 2 | 2022-10-12_01 | GuangDong | GuangZhou | LiWan | 1021012202~GuangDong~GuangZhou~LiWan | ||
sunny | 27 | 0.35 | 2 | 2022-10-12_01 | GuangDong | GuangZhou | Tianhe | 1021012202~GuangDong~GuangZhou~Tianhe | ||
sunny | 29 | 0.32 | 2 | 2022-10-12_02 | GuangDong | GuangZhou | LiWan | 2021012202~GuangDong~GuangZhou~LiWan | ||
rain | 19 | 0.67 | 3 | 2022-10-12_01 | ZheJiang | HangZhou | XiHu | 1021012202~ZheJiang~HangZhou~XiHu |
# 查看要创建的表是否存在
exists 'hbase_ns_test_1:weather_record'
# 建表命令:create '表名','列簇名1','列簇名2',...
create 'hbase_ns_test_1:weather_record','weather_info','space_time_info'
# put '表名','行键','列簇名:列名','值'[,'时间戳']
# 第1行
put 'hbase_ns_test_1:weather_record','1021012202~GuangDong~GuangZhou~LiWan','weather_info:weather','sunny'
put 'hbase_ns_test_1:weather_record','1021012202~GuangDong~GuangZhou~LiWan','weather_info:temperature','28'
put 'hbase_ns_test_1:weather_record','1021012202~GuangDong~GuangZhou~LiWan','weather_info:humidity','0.33'
put 'hbase_ns_test_1:weather_record','1021012202~GuangDong~GuangZhou~LiWan','weather_info:wind_power','2'
put 'hbase_ns_test_1:weather_record','1021012202~GuangDong~GuangZhou~LiWan','space_time_info:time','2022-10-12_01'
put 'hbase_ns_test_1:weather_record','1021012202~GuangDong~GuangZhou~LiWan','space_time_info:province','GuangDong'
put 'hbase_ns_test_1:weather_record','1021012202~GuangDong~GuangZhou~LiWan','space_time_info:city','GuangZhou'
put 'hbase_ns_test_1:weather_record','1021012202~GuangDong~GuangZhou~LiWan','space_time_info:county','LiWan'
# 第2行
put 'hbase_ns_test_1:weather_record','1021012202~GuangDong~GuangZhou~Tianhe','weather_info:weather','sunny'
put 'hbase_ns_test_1:weather_record','1021012202~GuangDong~GuangZhou~Tianhe','weather_info:temperature','27'
put 'hbase_ns_test_1:weather_record','1021012202~GuangDong~GuangZhou~Tianhe','weather_info:humidity','0.35'
put 'hbase_ns_test_1:weather_record','1021012202~GuangDong~GuangZhou~Tianhe','weather_info:wind_power','2'
put 'hbase_ns_test_1:weather_record','1021012202~GuangDong~GuangZhou~Tianhe','space_time_info:time','2022-10-12_01'
put 'hbase_ns_test_1:weather_record','1021012202~GuangDong~GuangZhou~Tianhe','space_time_info:province','GuangDong'
put 'hbase_ns_test_1:weather_record','1021012202~GuangDong~GuangZhou~Tianhe','space_time_info:city','GuangZhou'
put 'hbase_ns_test_1:weather_record','1021012202~GuangDong~GuangZhou~Tianhe','space_time_info:county','Tianhe'
# 第3行
put 'hbase_ns_test_1:weather_record','2021012202~GuangDong~GuangZhou~LiWan','weather_info:weather','sunny'
put 'hbase_ns_test_1:weather_record','2021012202~GuangDong~GuangZhou~LiWan','weather_info:temperature','29'
put 'hbase_ns_test_1:weather_record','2021012202~GuangDong~GuangZhou~LiWan','weather_info:humidity','0.32'
put 'hbase_ns_test_1:weather_record','2021012202~GuangDong~GuangZhou~LiWan','weather_info:wind_power','2'
put 'hbase_ns_test_1:weather_record','2021012202~GuangDong~GuangZhou~LiWan','space_time_info:time','2022-10-12_02'
put 'hbase_ns_test_1:weather_record','2021012202~GuangDong~GuangZhou~LiWan','space_time_info:province','GuangDong'
put 'hbase_ns_test_1:weather_record','2021012202~GuangDong~GuangZhou~LiWan','space_time_info:city','GuangZhou'
put 'hbase_ns_test_1:weather_record','2021012202~GuangDong~GuangZhou~LiWan','space_time_info:county','LiWan'
# 第4行
put 'hbase_ns_test_1:weather_record','1021012202~ZheJiang~HangZhou~XiHu','weather_info:weather','rain'
put 'hbase_ns_test_1:weather_record','1021012202~ZheJiang~HangZhou~XiHu','weather_info:temperature','19'
put 'hbase_ns_test_1:weather_record','1021012202~ZheJiang~HangZhou~XiHu','weather_info:humidity','0.67'
put 'hbase_ns_test_1:weather_record','1021012202~ZheJiang~HangZhou~XiHu','weather_info:wind_power','3'
put 'hbase_ns_test_1:weather_record','1021012202~ZheJiang~HangZhou~XiHu','space_time_info:time','2022-10-12_01'
put 'hbase_ns_test_1:weather_record','1021012202~ZheJiang~HangZhou~XiHu','space_time_info:province','ZheJiang'
put 'hbase_ns_test_1:weather_record','1021012202~ZheJiang~HangZhou~XiHu','space_time_info:city','HangZhou'
put 'hbase_ns_test_1:weather_record','1021012202~ZheJiang~HangZhou~XiHu','space_time_info:county','XiHu'
查看表行数
# count '表名'
count 'hbase_ns_test_1:weather_record'
查看表中全部数据
# scan '表名'
scan 'hbase_ns_test_1:weather_record'
查看指定 rowkey 的一行数据
这里查看 “2022年10月12日01时” > ”浙江省“ > ”杭州市“ > ”西湖区“ 的天气,那么rowkey
就是1021012202~ZheJiang~~HangZhou~XiHu
# get '表名','rowkey'
get 'hbase_ns_test_1:weather_record','1021012202~ZheJiang~HangZhou~XiHu'
查看指定 rowkey 区间的数据
这里查看 “2022年10月12日01时” > “广东省” > “广州市” 所有县区的天气,那么rowkey
的范围就是 1021012202~GuangDong~GuangZhou~A
~ 1021012202~GuangDong~GuangZhou~Z
# scan '表名',{STARTROW=>'rowkey范围开始行前缀',STOPROW=>'rowkey范围结束行前缀',LIMIT=>结果集大小}
scan 'hbase_ns_test_1:weather_record',{STARTROW=>'1021012202~GuangDong~GuangZhou~A',STOPROW=>'1021012202~GuangDong~GuangZhou~Z',LIMIT=>10}
# 防火墙放行 16010 tcp 端口
firewall-cmd --zone=public --add-port=16010/tcp --permanent
# 防火墙重新加载
firewall-cmd --reload
浏览器访问部署机器IP:16010
:
http://192.168.10.31:16010