HBase 是一个开源的、分布式 NoSQL 数据库,基于 Hadoop 的 HDFS,因此适合用于实时计算,拥有很好的计算处理能力。
HBase
区别和联系
Apache Hive 和 HBase 都是数据库,那么有什么区别呢?
二者区别
Hive:Hive 是基于 Hadoop 的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的 SQL 查询功能。
- Hive 本身不存储和计算数据,它完全依赖于 HDFS 和 MapReduce,Hive 中的表是纯逻辑表。可以认为是 MapReduce 的一个包装。意义就是把方便开发者将类 SQL 语句转化为复杂的 MapReduce 命令。
HBase:HBase 是 Hadoop 的数据库,一个分布式、可扩展、大数据的存储。
- HBase 中表是物理表,不是逻辑表,提供一个超大的内存 Hash 表,搜索引擎通过它来存储索引,方便查询操作;可以认为是 HDFS 的一个包装。本质是数据存储,是个 NoSQL 数据库;
二者联系
HBase 和 Hive 在大数据架构中处在不同位置,HBase 主要解决实时数据查询问题,Hive 主要解决数据处理和计算问题,一般是配合使用。
下载
部署完毕 ZooKeeper 之后即可部署 HBase,在官网下载稳定版。
wget https://dlcdn.apache.org/hbase/2.4.15/hbase-2.4.15-bin.tar.gz
解压到安装目录
sudo tar xf hbase-2.4.15-bin.tar.gz -C /opt
执行用户授权
sudo chown -R $USER:$USER /opt/hbase-2.4.15/
配置
修改配置文件
cd $HBASE_HOME
vim conf/hbase-env.sh
## 添加一行
export HBASE_MANAGES_ZK=false
修改配置文件 conf/hbase-site.xml
在 <configuration>
标签中删除已有的配置,然后加入以下内容
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>hbase.rootdir</name>
<value>hdfs://hadoop1:9000/hbase</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>hadoop1,hadoop2,hadoop3</value>
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/opt/apache-zookeeper-3.7.1-bin/data</value>
</property>
<property>
<name>hbase.wal.provider</name>
<value>filesystem</value>
</property>
</configuration>
小贴士:需要注意的是hbase.zookeeper.property.dataDir
的值需要与 Zookeeper 的zoo.cfg
中的dataDir
的值保持一致。
修改配置文件 conf/regionservers
为
hadoop2
hadoop3
创建配置文件 conf/backup-masters
添加内容
hadoop2
架构
Node Name | Master | Zookeeper | RegionServer |
---|---|---|---|
hadoop1 | yes | yes | no |
hadoop2 | backup | yes | yes |
hadoop3 | no | yes | yes |
分发到所有节点
sudo rsync -av /opt/hbase-2.4.15/ root@hadoop2:/opt/hbase-2.4.15
sudo rsync -av /opt/hbase-2.4.15/ root@hadoop3:/opt/hbase-2.4.15
启动集群
在启动集群前需要确认 HDFS 处于非安全模式(OFF)
$ hdfs dfsadmin -safemode get
Safe mode is OFF
将环境变量发送至所有节点
sudo rsync -av /etc/profile.d/hadoop.sh root@hadoop2:/etc/profile.d/
sudo rsync -av /etc/profile.d/hadoop.sh root@hadoop3:/etc/profile.d/
启动集群
cd $HBASE_HOME
bin/start-hbase.sh
然后使用浏览器访问 http://hadoop1:16010
即可看到管理页面
测试集群
使用命令行客户端访问 HBase 数据库(双井号后是实际执行的 hbase 命令,注意甄别)
$ hbase shell
## 创建指定表单
hbase:001:0> create 'test', 'cf'
Created table test
Took 3.2013 seconds
=> Hbase::Table - test
## 列出指定表单
hbase:002:0> list 'test'
TABLE
test
1 row(s)
Took 0.0409 seconds
=> ["test"]
## 查询表单描述
hbase:003:0> describe 'test'
Table test is ENABLED
test
COLUMN FAMILIES DESCRIPTION
{NAME => 'cf', BLOOMFILTER => 'ROW', IN_MEMORY => 'false', VERSIONS => '1', KEEP
_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCODING => 'NONE', COMPRESSION => 'NONE',
TTL => 'FOREVER', MIN_VERSIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE => '6553
6', REPLICATION_SCOPE => '0'}
1 row(s)
Quota is disabled
Took 0.2960 seconds
## 表单插入数据1
hbase:004:0> put 'test', 'row1', 'cf:a', 'value1'
Took 0.2816 seconds
## 表单插入数据2
hbase:005:0> put 'test', 'row2', 'cf:b', 'value2'
Took 0.0205 seconds
## 表单插入数据3
hbase:006:0> put 'test', 'row3', 'cf:c', 'value3'
Took 0.0122 seconds
## 扫描指定表单
hbase:007:0> scan 'test'
ROW COLUMN+CELL
row1 column=cf:a, timestamp=2022-11-17T15:55:20.979, value=valu
e1
row2 column=cf:b, timestamp=2022-11-17T15:55:25.597, value=valu
e2
row3 column=cf:c, timestamp=2022-11-17T15:55:30.198, value=valu
e3
3 row(s)
Took 0.1707 seconds
## 单行返回形式查询表单
hbase:008:0> get 'test', 'row1'
COLUMN CELL
cf:a timestamp=2022-11-17T15:55:20.979, value=value1
1 row(s)
Took 0.0362 seconds
## 停用表单
hbase:009:0> disable 'test'
Took 1.2226 seconds
## 启用表单
hbase:010:0> enable 'test'
Took 0.6940 seconds
## 再次停用表单
hbase:011:0> disable 'test'
Took 0.3489 seconds
## 删除表单
hbase:012:0> drop 'test'
Took 0.7245 seconds
常见问题
a) 在 hbase shell
中执行命令时报错
ERROR: org.apache.hadoop.hbase.ipc.ServerNotRunningYetException: Server is not running yet
at org.apache.hadoop.hbase.master.HMaster.checkServiceStarted(HMaster.java:2804)
at org.apache.hadoop.hbase.master.MasterRpcServices.isMasterRunning(MasterRpcServices.java:1163)
at org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos$MasterService$2.callBlockingMethod(MasterProtos.java)
at org.apache.hadoop.hbase.ipc.RpcServer.call(RpcServer.java:387)
at org.apache.hadoop.hbase.ipc.CallRunner.run(CallRunner.java:132)
at org.apache.hadoop.hbase.ipc.RpcExecutor$Handler.run(RpcExecutor.java:369)
at org.apache.hadoop.hbase.ipc.RpcExecutor$Handler.run(RpcExecutor.java:349)
这是因为在 hbase-site.xml
里缺少以下配置
<property>
<name>hbase.wal.provider</name>
<value>filesystem</value>
</property>
b) 执行集群停止命令时长时间无响应
执行 stop-hbase.sh
时一直出现等待符(...),且长时间无响应时,在所有节点分别执行
ll /tmp/hbase-*.pid
可以查看节点运行的 hbase 实例类型,比如 master
, regionserver
然后根据实例的类型进行分别关闭
hbase-daemon.sh stop master
hbase-daemon.sh stop regionserver
附录
参考链接
- Hive与HBase的区别与联系 - CNBLOG
- 2.4 Fully Distributed for Production - Apache HBase ™ Reference Guide
- HBase Shell - org.apache.hadoop.hbase.ipc.ServerNotRunningYetException: Server is not running yet - StackOverflow
- Hbase 集群搭建超详细教程 - 掘金
本文由 柒 创作,采用 知识共享署名4.0
国际许可协议进行许可。
转载本站文章前请注明出处,文章作者保留所有权限。
最后编辑时间: 2022-11-13 11:30 AM