发布人:夏小权 发布主题:HBase 发布时间:2018-12-17

HBase入门基础

发布人:夏小权

一、HBase简介

1HBase概述:

1)HBase 是 BigTable 的开源(源码使用 Java 编写)版本。是 Apache Hadoop 的数据库,是建立在 HDFS 之上,被设计用来提供高可靠性、高性能、列存储、可伸缩、多版本的 NoSQL的分布式数据存储系统,实现对大型数据的实时、随机的读写访问。

2)以下五点是HBase这个NoSQL数据库的要点

2.1)它介于NoSQL 和 RDBMS之间仅能通过主键rowkey和主键的range来检索数据

2.2)HBase查询数据功能很简单不支持join等

2.3)不支持复杂的事务,只支持行级事务 (可通过hive支持来实现多表join等复杂操作)

2.4)Hbase中支持的数据类型:byte[](底层所有数据的存储都是字节组)

2.5)主要用来存储结构化和半松散数据

2HBase的优点、缺点及应用场景

1)HBase优点

1.1)列可以动态增加,并且列为空就不存储数据,节省存储空间。

1.2)Hbase自动切分数据,使得数据存储自动具有水平scalability。

1.3)Hbase可以提供高并发读写操作的支持。

1.4)数据存储在hdfs上,备份机制健全。

1.5)通过zookeeper协调查找数据,访问速度快。

2)HBase的缺点:

2.1)不能支持条件查询,只支持按照Row key来查询。

2.2)HBase并不适合传统的事物处理程序或关联分析,不支持复杂查询,一定程度上限制了它的使用,但是用它做数据存储的优势也同样非常明显。

3)什么场景选择HBase

3.1)因为HBase存储的是松散的数据,所以如果你的应用程序中,数据表每一行的结构是有差别的,那么可以考虑使用HBase。因为HBase的列可以动态增加,并且列为空就不存储数据,所以如果你需要经常追加字段,且大部分字段是NULL值的,那可以考虑HBase。因为HBase可以根据Rowkey提供高效的查询,所以如果你的数据(包括元数据、消息、二进制数据等)都有着同一个主键,或者你需要通过键来访问和修改数据,使用HBase是一个很好地选择。

3HBase数据结构

1) HBase会存储系列的行记录,行记录有三个基本类型的定义:Row Key、Time Stamp、Column Family。

2)Row Key

与NoSQL数据库一样,Row Key是用来检索记录的主键。访问HBase table中的行,只有三种方式:

2.1)通过单个Row Key访问。

2.2)通过Row Key的range全表扫描。

2.3)Row Key可以是任意字符串(最大长度是64KB,实际应用中长度一般为 10 ~ 100bytes),在HBase内部,Row Key保存为字节数组。

2.4)在存储时,数据按照Row Key的字典序(byte order)排序存储。设计Key时,要充分排序存储这个特性,将经常一起读取的行存储到一起(位置相关性)。

3)Column Family

3.1)HBase表中每个列都必须属于某个列族,列族必须作为表模式定义的一部分预先给出(有点像关系型数据库中的列名,定义完一般情况下就不会再去修改);

3.2)列名以列族作为前缀,每个列族都可以有多个列成员。新的列族成员(也就是列)可以随后按需,动态加入。

3.3)Hbase把同一列族里面的数据存储在同一目录下,由几个文件保存。

4)Time Stamp

4.1)在HBase每个cell存储单元对同一份数据有多个版本,根据唯一的时间戳来区分每个版本之间的差异,不同版本的数据按照时间倒序排序,最新的数据版本排在最前面。

4HBase架构原理

1)系统架构图

《发布人:夏小权 发布主题:HBase 发布时间:2018-12-17》

2)Master

2.1)HBase Master用于协调多个Region Server,侦测各个Region Server之间的状态,并平衡Region Server之间的负载。HBase Master还有一个职责就是负责分配Region给Region Server。HBase允许多个Master 节点共存,但是这需要Zookeeper的帮助。不过当多个Master节点共存时,只有一个Master是提供服务的,其他的Master节点处于待命的状态。当正在工作的Master节点宕机时,其他的Master则会接管 HBase 的集群。

3)HRegionServer原理图

《发布人:夏小权 发布主题:HBase 发布时间:2018-12-17》

4)Zookeeper

4.1)对于HBase而言,Zookeeper的作用是至关重要的。首先Zookeeper是作为HBase Master的HA解决方案。也就是说,是Zookeeper保证了至少有一个HBase Master处于运行状态。并且Zookeeper负责Region和Region Server的注册。其实Zookeeper发展到目前为止,已经成为了分布式大数据框架中容错性的标准框架。不光是HBase,几乎所有的分布式大数据相关的开源框架,都依赖于Zookeeper实现HA。

5)HBase原理

5.1)首先我们需要知道HBase的集群是通过Zookeeper来进行机器之前的协调,也就是说HBase Master与Region Server之间的关系是依赖Zookeeper来维护。当一个Client需要访问HBase集群时,Client需要先和Zookeeper来通信,然后才会找到对应的Region Server。每一个 Region Server管理着很多个Region。对于HBase来说,Region是HBase并行化的基本单元。因此,数据也都存储在Region中。

5.2)这里我们需要特别注意,每一个Region都只存储一个Column Family的数据,并且是该CF中的一段(按Row 的区间分成多个Region)。Region所能存储的数据大小是有上限的,当达到该上限时(Threshold),Region会进行分裂,数据也会分裂到多个Region中,这样便可以提高数据的并行化,以及提高数据的容量。

5.3)每个Region包含着多个Store对象。每个Store包含一个MemStore,和一个或多个HFile。MemStore便是数据在内存中的实体,并且一般都是有序的。当数据向Region写入的时候,会先写入MemStore。当MemStore中的数据需要向底层文件系统倾倒(Dump)时(例如MemStore中的数据体积到达MemStore配置的最大值),Store便会创建StoreFile,而StoreFile就是对HFile一层封装。所以MemStore中的数据会最终写入到HFile中,也就是磁盘IO。由于HBase底层依靠HDFS,因此HFile都存储在HDFS之中。这便是整个HBase工作的原理简述。

6)使用HBase时应注意的问题

6.1)基于Hbase的系统设计与开发中,需要考虑的因素不同于关系型数据库,Hbase模式本身很简单,但赋予你更多调整的空间,有一些模式写性能很好,但读取数据时表现不好,或者正好相反,类似传统数据库基于范式的OR建模,在实际项目中考虑Hbase设计模式是,我们需要从以下几方面内容着手:

这个表应该有多少个列簇

列簇使用什么数据

每个列簇应有多少个列

列名应该是什么,尽管列名不必在建表时定义,但是读写数据时是需要的

单元应该存放什么数据

每个单元存储什么时间版本

行健结构是什么,应该包括什么信息

5HBase读写

1)读数据过程:memstore + 磁盘 =完整数据

1.1)联系zookeeper,找到meta表所在的Region Server,定位到要查找数据所在region的Region Server的位置

1.2)client直接与Region Server通信,发起读数据请求

1.3)Region Server找到对应数据的region

1.4)region先到memstore查询数据,如果没有找到,那么从block Cache查询,如果在找不到,那么从storefile查询(查询storefile会使用布隆过滤器)

2)写数据过程:

2.1)联系zookeeper,找到meta表所在的Region Server,定位到要写的数据所在region的Region Server的位置

2.2)client端向Region Server发起写的请求

2.3)Region Server定位到指定的region

2.4)region会检查schema(检查列簇),看是否与schema一致

2.5)如果客户端没有指定版本,则获取当前系统时间为数据版本

2.6)写val(预写日志)

2.7)写到memestore(数据是排序的),达到一定的值,创建新memestore

2.8)判断是否flush到storeFile(storeFile是只读的,一旦创建就不可以修改,其实HBase的更新其实是不断追加的操作)

6、HBase表结构设计

1)列簇设计

追求的原则是:在合理范围内能尽量少的减少列簇就尽量减少列簇。最优设计是:将所有相关性很强的 key-value 都放在同一个列簇下,这样既能做到查询效率最高,也能保持尽可能少的访问不同的磁盘文件以用户信息为例,可以将必须的基本信息存放在一个列族,而一些附加的额外信息可以放在另一列族

2)RowKey的设计及原则

HBase 中,表会被划分为 1…n 个 Region,被托管在 RegionServer 中。Region 二个重要的属性:StartKey 与 EndKey 表示这个 Region 维护的 rowKey 范围,当我们要读/写数据时,如果 rowKey 落在某个 start-end key 范围内,那么就会定位到目标 region 并且读/写到相关的数据

2.1) rowkey 长度原则

Rowkey 是一个二进制码流,Rowkey 的长度被很多开发者建议说设计在 10~100 个字节,不过建议是越短越好,不要超过 16 个字节。

原因如下:

2.1.1)数据的持久化文件 HFile 中是按照 KeyValue 存储的,如果 Rowkey 过长比如 100 个字节,1000 万列数据光 Rowkey 就要占用 100*1000 万=10 亿个字节,将近 1G 数据,这会极大影响 HFile 的存储效率;

2.1.2)MemStore 将缓存部分数据到内存,如果 Rowkey 字段过长内存的有效利用率会降低,系统将无法缓存更多的数据,这会降低检索效率。因此 Rowkey 的字节长度越短越好。

2.1.3)目前操作系统是都是 64 位系统,内存 8 字节对齐。控制在 16 个字节,8 字节的整数倍利用操作系统的最佳特性。

2.2)rowkey 散列原则

2.2.1)如果 Rowkey 是按时间戳的方式递增,不要将时间放在二进制码的前面,建议将Rowkey的高位作为散列字段,由程序循环生成,低位放时间字段,这样将提高数据均衡分布在每个Regionserver 实现负载均衡的几率。如果没有散列字段,首字段直接是时间信息将产生所有新数据都在一个 RegionServer 上堆积的热点现象,这样在做数据检索的时候负载将会集中在个别 RegionServer,降低查询效率。

2.3)rowkey 唯一原则

2.3.1)必须在设计上保证其唯一性。rowkey 是按照字典顺序排序存储的,因此,设计rowkey的时候,要充分利用这个排序的特点,将经常读取的数据存储到一块,将最近可能会被访问的数据放到一块。

7、HBase防止数据热点的有效措施:

1)加盐

1.1)这里所说的加盐不是密码学中的加盐,而是在 rowkey 的前面增加随机数,具体就是给

rowkey 分配一个随机前缀以使得它和之前的 rowkey 的开头不同。分配的前缀种类数量应该

和你想使用数据分散到不同的 region 的数量一致。加盐之后的 rowkey 就会根据随机生成的

前缀分散到各个 region 上,以避免热点。

2)哈希

2.1)哈希会使同一行永远用一个前缀加盐。哈希也可以使负载分散到整个集群,但是读却是

可以预测的。使用确定的哈希可以让客户端重构完整的 rowkey,可以使用 get 操作准确获取

某一个行数据

3)反转

3.1)第三种防止热点的方法是反转固定长度或者数字格式的 rowkey。这样可以使得 rowkey中经常改变的部分(最没有意义的部分)放在前面。这样可以有效的随机 rowkey,但是牺牲了 rowkey 的有序性。反转 rowkey 的例子以手机号为 rowkey,可以将手机号反转后的字符串作为 rowkey,这样的就避免了以手机号那样比较固定开头导致热点问题

4)时间戳反转

4.1)一个常见的数据处理问题是快速获取数据的最近版本,使用反转的时间戳作为 rowkey的一部分对这个问题十分有用,可以用 Long.Max_Value – timestamp 追加到 key 的末尾,例如 [key][reverse_timestamp] , [key] 的最新值可以通过 scan [key]获得[key]的第一条记录,因为 HBase 中 rowkey 是有序的,第一条记录是最后录入的数据。比如需要保存一个用户的操作记录,按照操作时间倒序排序,在设计 rowkey 的时候,可以这样设计[userId 反转][Long.Max_Value – timestamp],在查询用户的所有操作记录数据的时候,直接指定 反 转 后 的 userId , startRow 是 [userId 反 转 ][000000000000],stopRow 是 [userId 反转][Long.Max_Value – timestamp]如果需要查询某段时间的操作记录,startRow 是[user 反转][Long.Max_Value – 起始时间],stopRow 是[userId 反转][Long.Max_Value – 结束时间]

8HBase操作

1)mysql数据导入到HBase中

sqoop import –connectjdbc:mysql://192.168.**.**/mytest –username root –password root

–table student –hbase-tablestudenttest1 –column-family name –hbase-row-key id

–hbase-create-table 自动在 hbase 中创建表

–column-family name 指定列簇名字

–hbase-row-key id 指定 rowkey 对应的 mysql 当中的键

2)HBase中数据导入到Mysql中

先将 hbase 的数据导入到 hdfs 或者 hive,然后再将数据导入到Mysql

3)HBase操作

3.1)显示 hbase 中的表

list

3.2)创建表

create

create’user_info’,{NAME=>’base_info’,VERSIONS=>3},{NAME=>’extra_info’,VERSIONS=>1 }

3.3)像表中添加数据

put

put ‘user_info’, ‘user0000′,’base_info:name’, ‘xxx’

put ‘user_info’, ‘user0000′,’extra_info:size’, ‘xx’

3.4)从表中获取一条数据

get

get ‘user_info’, ‘user0000’

3.5)扫描全表

scan

scan ‘user_info’, {COLUMNS =>’base_info’}

scan ‘user_info’, {COLUMNS =>’extra_info’}

3.6)删除一条记录

delete

delete ‘user’, ‘rk0000’, ‘info:name’,139238

3.7)清空表

truncate

truncate ‘user’

3.8)删除表

disable ‘user’

drop ‘user’

二、HBase集群搭建

1.安装zookeeper集群,此处略

2.找到官网http://hbase.apache.org/1.2/book.html,下载HBase安装包hbase-1.2.6-bin.tar.gz

3.上传到服务器并解压安装包tar -zxvf hbase-1.2.6-bin.tar.gz -C/home/hduser/hadoop_soft/

4.修改配置文件

进入HBase conf目录下

1) vi hbase-env.sh

export

JAVA_HOME=/home/hduser/jdk/jdk1.7.0_80 表示修改为自己的jdk目录

export HBASE_MANAGES_ZK=false 表示不引用 hbase自带的zookeeper,用我们自己安装的zookeeper集群

保存退出

2)vi hbase-site.xml

增加以下配置:

<!– 指定 hbase 在 HDFS 上存储的路径–>

hbase.rootdir

hdfs://youyuan-nameservice/hbase

<!– 指定 hbase 是分布式的–>

hbase.cluster.distributed

true

<!– 指定 zk 的地址,多个用“,”分割–>

hbase.zookeeper.quorum

zookeeper01:2181,zookeeper02:2181,zookeeper03:2181

保存退出

3)vi regionservers

hbase01

hbase02

hbase03

hbase04

4)修改 backup-masters,这个文件需要自己创建,指定备用的主节点

hbase02

5)最重要的一步,要把 hadoop 的 hdfs-site.xml 和 core-site.xml 放到 hbase/conf下

cp/home/hduser/hadoop_soft/hadoop-2.6.0/etc/hadoop/core-site.xml/home/hduser/hadoop_soft/hbase-1.2.6/conf/

cp /home/hduser/hadoop_soft/hadoop-2.6.0/etc/hadoop/hdfs-site.xml/home/hduser/hadoop_soft/hbase-1.2.6/conf/

5、分发安装到各节点

scp -r/home/hduser/hadoop_soft/hbase-1.2.6/ hduser@hbase02:/home/hduser/hadoop_soft/

scp -r/home/hduser/hadoop_soft/hbase-1.2.6/ hduser@hbase03:/home/hduser/hadoop_soft/

scp -r/home/hduser/hadoop_soft/hbase-1.2.6/ hduser@hbase04:/home/hduser/hadoop_soft/

6、同步时间,时间要求比hdfs严格,要求不超过30

7、配置环境变量

vi ~/.bash

exportHBASE_HOME=/home/hduser/hadoop_soft/hbase-1.2.6/

export PATH=$PATH:$HBASE_HOME/bin

保存退出 source ~/.bashrc 使配置生效

8、启动

1)先启动zookeeper集群

zkServer.sh start

2)启动hdfs集群

start-dfs.sh

3)启动hbase集群

start-hbase.sh

4)启动会日志中显示如下

4.1)首先在命令执行节点启动rmaster

4.2)然后分别在hbase集群各节点启动regionserver

4.3)然后在backup-masters文件中配置的备节点上再启动一个master主进程

9http://hbase1:16010/

10、如果有节点相应的进程没启动 ,那么可以手动启动

hbase -daemon.sh start master

hbase -daemon.sh start regionserver

    原文作者:黑权
    原文地址: https://www.jianshu.com/p/8c42f83e45c9
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞