Apache HBase
1、 HBase基础
1.1 基本概念
-
hbase是bigtable的开源java版本,是建立在hdfs之上。
-
提供高可靠性、高性能、列存储、可伸缩、实时读写nosql的数据库系统。
- 它介于nosql和RDBMS之间,仅能通过主键(row key)和主键的range来检索数据,仅支持单行事务(可通过hive支持来实现多表join等复杂操作)。
- 主要用来存储结构化和半结构化的松散数据。
- Hbase查询数据功能很简单,不支持join等复杂操作,不支持复杂的事务(行级的事务)
- Hbase中支持的数据类型:byte[]
- 与hadoop一样,Hbase目标主要依靠横向扩展,通过不断增加廉价的商用服务器,来增加计算和存储能力。
-
HBase中的表一般有这样的特点:
- 大:一个表可以有上十亿行,上百万列
- 面向列:面向列(族)的存储和权限控制,列(族)独立检索。
- 稀疏:对于为空(null)的列,并不占用存储空间,因此,表可以设计的非常稀疏。
-
和行式数据库的区别
-
1、行式数据库在分析的时候,将id,name,age,sex,score;完整的信息读入内存,造成大量的内存和IO浪费。
-
2、列式数据库的思维是把行式数据库全部拆开,按照列的方式重新组合存储,一列所有的行的数据存放在一起。带来的好处就是,要分析男女就直接访问所有的男女信息,要分析销售额,就直接访问消费额相关的数据。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4578yWho-1571129226161)(/img/2012121416.jpeg)]
-
1.2 Hbase表结构
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dpTCChYk-1571129226166)(img/2017-12-27_180515.jpg)]
- 表(table):用于存储管理数据,具有稀疏的、面向列的特点。HBase中的每一张表,就是所谓的大表(Bigtable),可以有上亿行,上百万列。对于为值为空的列,并不占用存储空间,因此表可以设计的非常稀疏。
- 行键(RowKey):类似于MySQL中的主键,HBase根据行键来快速检索数据,一个行键对应一条记录。与MySQL主键不同的是,HBase的行键是天然固有的,每一行数据都存在行键。
- 列族(ColumnFamily):是列的集合。列族在表定义时需要指定,而列在插入数据时动态指定。列中的数据都是以二进制形式存在,没有数据类型。在物理存储结构上,每个表中的每个列族单独以一个文件存储(参见图1.2)。一个表可以有多个列簇。
- 时间戳(TimeStamp):是列的一个属性,是一个64位整数。由行键和列确定的单元格,可以存储多个数据,每个数据含有时间戳属性,数据具有版本特性。可根据版本(VERSIONS)或时间戳来指定查询历史版本数据,如果都不指定,则默认返回最新版本的数据。
- 区域(Region):HBase自动把表水平划分成的多个区域,划分的区域随着数据的增大而增多。
动手实践:将以下用户的信息保存到Hbase中
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OaNzDOWR-1571129226169)(img/2017-12-27_192040.jpg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-piiU788x-1571129226170)(img/2017-12-27_192757.jpg)]
1.3 Hbase整体结构
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gFQcQPb8-1571129226172)(img/2017-12-27_180706.jpg)]
1.3.1 Client
- ①使用HBase RPC机制与HMaster和HRegionServer进行通信;
- ②Client与HMaster进行通信进行管理类操作;
- ③Client与HRegionServer进行数据读写类操作。
1.3.2 Zookeeper
- ①保证任何时候,集群中只有一个running master,避免单点问题;
- ②存贮所有Region的寻址入口,包括-ROOT-表地址、HMaster地址;
- ③实时监控Region Server的状态,将Region server的上线和下线信息,实时通知给Master;
- ④存储Hbase的schema,包括有哪些table,每个table有哪些column family。
1.3.3 HMaster
可以启动多个HMaster,通过Zookeeper的Master Election机制保证总有一个Master运行。
角色功能:
- ①为Region server分配region;
- ②负责region server的负载均衡;
- ③发现失效的region serve并重新分配其上的region;
- ④GFS上的垃圾文件回收;
- ⑤处理用户对标的增删改查操作。
1.3.4 HRegionServer
HBase中最核心的模块,主要负责响应用户I/O请求,向HDFS文件系统中读写数据。
作用:
- ①维护Master分配给它的region,处理对这些region的IO请求;
- ②负责切分在运行过程中变得过大的region。
- 此外,HRegionServer管理一些列HRegion对象,每个HRegion对应Table中一个Region,HRegion由多个HStore组成,每个HStore对应Table中一个Column Family的存储,Column Family就是一个集中的存储单元,故将具有相同IO特性的Column放在一个Column Family会更高效。
1.3.4 HStore
HBase存储的核心,由MemStore和StoreFile组成。
用户写入数据的流程为:client写入 -> 存入MemStore,一直到MemStore满 -> Flush成一个StoreFile,直至增长到一定阈值 -> 触发Compact合并操作 -> 多个StoreFile合并成一个StoreFile,同时进行版本合并和数据删除 -> 当StoreFiles Compact后,逐步形成越来越大的StoreFile -> 单个StoreFile大小超过一定阈值后,触发Split操作,把当前Region Split成2个Region,Region会下线,新Split出的2个孩子Region会被HMaster分配到相应的HRegionServer上,使得原先1个Region的压力得以分流到2个Region上,如图所示。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-asO4aJfd-1571129226173)(img/2017-12-27_231532.jpg)]
1.3.6 HRegion
一个表最开始存储的时候,是一个region。
一个Region中会有个多个store,每个store用来存储一个列簇。如果只有一个column family,就只有一个store。
region会随着插入的数据越来越多,会进行拆分。默认大小是10G一个。
1.3.7 HLog
在分布式系统环境中,无法避免系统出错或者宕机,一旦HRegionServer意外退出,MemStore中的内存数据就会丢失,引入HLog就是防止这种情况。
工作机制:每个HRegionServer中都会有一个HLog对象,HLog是一个实现Write Ahead Log的类,每次用户操作写入Memstore的同时,也会写一份数据到HLog文件,HLog文件定期会滚动出新,并删除旧的文件(已持久化到StoreFile中的数据)。当HRegionServer意外终止后,HMaster会通过Zookeeper感知,HMaster首先处理遗留的HLog文件,将不同region的log数据拆分,分别放到相应region目录下,然后再将失效的region重新分配,领取到这些region的HRegionServer在Load Region的过程中,会发现有历史HLog需要处理,因此会Replay HLog中的数据到MemStore中,然后flush到StoreFiles,完成数据恢复。
1.4 查询路由
HBase中存有两张特殊的表,-ROOT-和.META.。
-
.META.:记录了用户表的Region信息,.META.可以有多个regoin。
-
-ROOT-:记录了.META.表的Region信息,-ROOT-只有一个region。Zookeeper中记录了-ROOT-表的location。
Client访问用户数据之前需要首先访问zookeeper,然后访问-ROOT-表,接着访问.META.表,最后才能找到用户数据的位置去访问
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-T1zAjohT-1571129226175)(img/2017-12-27_230552.jpg)]
2、Hbase集群部署
操作步骤说明:
- 下载安装包
- 修改配置文件
- regionservers
- hbase-site.xml
- hbase-env.sh
- 拷贝hadoop配置文件
- 分发配置文件
- 启动集群
2.1 下载安装包
wget http://mirrors.hust.edu.cn/apache/hbase/1.3.1/hbase-1.3.1-bin.tar.gz
tar -zxvf hbase-1.3.1-bin.tar.gz -C /export/servers/
cd ../servers/
mv hbase-1.3.1 hbase
vi /etc/profile
-
export HBASE_HOME=/export/servers/hbase
export PATH=${HBASE_HOME}/bin:$PATH
-
source /etc/profile
2.2 修改配置文件
进入配置文件所在的目录
cd /export/servers/hbase/conf/
修改第一个配置文件 regionservers
vi regionservers
-
node02
node03
修改第二个配置文件 hbase-site.xml
注意:以下配置集成的是hadoop ha集群。
如果您的集群没有配置ha,hbase.rootdir 配置项目需要修改:hdfs://master:9000/hbase
vi hbase-site.xml
-
<configuration>
<property>
<name>hbase.rootdir</name>
<value>hdfs://ns1/hbase</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.master.port</name>
<value>16000</value>
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/export/data/zk/</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>node01,node02,node03</value>
</property>
<property>
<name>hbase.zookeeper.property.clientPort</name>
<value>2181</value>
</property>
</configuration>
修改第三个配置文件 hbase-env.sh
HBASE_MANAGES_ZK=false 表示,hbase和大家伙公用一个zookeeper集群,而不是自己管理集群。
vi hbase-env.sh
-
export JAVA_HOME=/export/servers/jdk
export HBASE_MANAGES_ZK=false
修改第四个配置文件 拷贝hadoop配置文件
拷贝hadoop的配置文件到hbase的配置文件目录
2.3 分发安装文件并启动
分发配置文件
scp -r /export/servers/hbase/ node02:/export/servers/
scp -r /export/servers/hbase/ node03:/export/servers/
启动集群
startzk.sh
start-dfs.sh
start-hbase.sh
启动异常:
2017-12-27 06:27:54,882 INFO [node01:16000.activeMasterManager] master.ServerManager: Waiting for region servers count to settle; currently checked in 0, slept for 67247 ms, expecting minimum of 1, maximum of 2147483647, timeout of 4500 ms, interval of 1500 ms.
解决办法:
保证每台机器时间一致。
ntpdate -u 0.uk.pool.ntp.org
ntpdate -u 1.uk.pool.ntp.org
。
3、Hbase Shell操作
3.1 连接集群
hbase shell
3.2 创建表
create 'user','base_info'
3.3 插入数据
put 'user','rowkey_10','base_info:username','张三'
put 'user','rowkey_10','base_info:birthday','2014-07-10'
put 'user','rowkey_10','base_info:sex','1'
put 'user','rowkey_10','base_info:address','北京市'
put 'user','rowkey_16','base_info:username','张小明'
put 'user','rowkey_16','base_info:birthday','2014-07-10'
put 'user','rowkey_16','base_info:sex','1'
put 'user','rowkey_16','base_info:address','北京'
put 'user','rowkey_22','base_info:username','陈小明'
put 'user','rowkey_22','base_info:birthday','2014-07-10'
put 'user','rowkey_22','base_info:sex','1'
put 'user','rowkey_22','base_info:addr