概述
安装包版本
jdk-8u333-linux-x64.tar.gz
hadoop-3.2.4.tar.gz
apache-zookeeper-3.6.3-bin.tar.gz
hbase-2.2.7-bin.tar.gz
2、解压配置环境变量
# 放到/opt/目录
cd /opt
# 解压
tar -zxvf hbase-2.2.7-bin.tar.gz
# 重命名
mv hbase-2.2.7-bin hbase2.2
# 添加环境变量
vi ~/.bashrc
# set hbase_env
export HBASE_HOME=/opt/hbase2.2
export PATH=$PATH:$HBASE_HOME/bin
source ~/.bashrc
3、修改hbase-env.sh文件
cd /opt/hbase2.2/conf
vi hbase-env.sh
添加: export HBASE_MANAGES_ZK=false
添加: export JAVA_HOME=/opt/jdk1.8/
4、修改hbase-site.xml文件
cd /opt/hbase2.2/conf
vi hbase-site.xml
*1 将hbase.cluster.distributed值从false改成true
2 添加:
hbase.rootdir
hdfs://master:8020/hbase
此4行内容是在上面配置
**hdfs://master:8020/hbase 这个值就是hadoop配置文件core-site.xml与hbase-site.xml文件中的hdfs的端口号必须匹配
hbase.cluster.distributed true hbase.rootdir hdfs://master:8020/hbase hbase.tmp.dir ./tmp hbase.unsafe.stream.capability.enforce false *
5、启动服务
/opt/hbase2.2/bin/start-hbase.sh
6、验证
6.1 ps -ef | grep hbase
6.2 打开浏览器访问
http://192.168.56.101:16010
hbase基础介绍
hbase其实是Hadoop database的简称,是列式存储数据库。
是一种分布式、可扩展、支持海量数据存储的 NoSQL 数据库。
简介
在HBASE中,数据存储在具有行和列的表中。这是看起来关系数据库(RDBMS)一样,但将HBASE表看成是多个维度的Map结构更容易理解。
ROWKEY C1列蔟 C2列蔟
rowkey 列1 列2 列3 列4 列5 列6
术语
表(Table)
HBase中数据都是以表形式来组织的
HBase中的表由多个行组成
行(row)
HBASE中的行由一个rowkey(行键)和一个或多个列组成,列的值与rowkey、列相关联
行在存储时按行键按字典顺序排序
行键的设计非常重要,尽量让相关的行存储在一起
例如:存储网站域。如行键是域,则应该将域名反转后存储(org.apache.www、org.apache.mail、org.apache.jira)。这样,所有Apache域都在表中存储在一起,而不是根据子域的第一个字母展开
列(Column)
HBASE中的列由列族(Column Family)和列限定符(Column Qualifier)组成
表示如下——列族名:列限定符名。例如:C1:USER_ID、C1:SEX
列族(Column Family):一个table可以有多个列族
出于性能原因,列族将一组列及其值组织在一起
每个列族都有一组存储属性,例如:
是否应该缓存在内存中
数据如何被压缩或行键如何编码等
表中的每一行都有相同的列族,但在列族中不存储任何内容
所有的列族的数据全部都存储在一块(文件系统HDFS)
HBase官方建议所有的列蔟保持一样的列,并且将同一类的列放在一个列蔟中
列标识符(Column Qualifier)
列族中包含一个个的列限定符,这样可以为存储的数据提供索引
列族在创建表的时候是固定的,但列限定符是不作限制的
不同的行可能会存在不同的列标识符
单元格(Cell)
单元格是行、列系列和列限定符的组合
包含一个值和一个时间戳(表示该值的版本)
单元格中的内容是以二进制存储的
ROW COLUMN+CELL
1250995 column=C1:ADDRESS, timestamp=1588591604729, value=xC9xBDxCExF7xCA
1250995 column=C1:LATEST_DATE, timestamp=1588591604729, value=2019-03-28
1250995 column=C1:NAME, timestamp=1588591604729, value=xB7xBDxBAxC6xD0xF9
1250995 column=C1:NUM_CURRENT, timestamp=1588591604729, value=398.5
1250995 column=C1:NUM_PREVIOUS, timestamp=1588591604729, value=379.5
1250995 column=C1:NUM_USEAGE, timestamp=1588591604729, value=19
1250995 column=C1:PAY_DATE, timestamp=1588591604729, value=2019-02-26
1250995 column=C1:RECORD_DATE, timestamp=1588591604729, value=2019-02-11
1250995 column=C1:SEX, timestamp=1588591604729, value=xC5xAE
1250995 column=C1:TOTAL_MONEY, timestamp=1588591604729, value=114
概念模型
Row Key Time Stamp ColumnFamily contents ColumnFamily anchor ColumnFamily people
“com.cnn.www” t9 anchor:cnnsi.com = “CNN”
“com.cnn.www” t8 anchor:my.look.ca = “CNN.com”
“com.cnn.www” t6 contents:html = “…”
“com.cnn.www” t5 contents:html = “…”
“com.cnn.www” t3 contents:html = “…”
“com.example.www” t5 contents:html = “…” people:author = “John Doe”
上述表格有两行、三个列族(contens、ancho、people)
“com.cnn.www”这一行anchor列族两个列(anchor:cssnsi.com、anchor:my.look.ca)、contents列族有个1个列(html)
“com.cnn.www”在HBase中有 t3、t5、t6、t8、t9 5个版本的数据
HBase中如果某一行的列被更新的,那么最新的数据会排在最前面,换句话说同一个rowkey的数据是按照倒序排序的
基本语法
进入hbase客户端:hbase shell
创建表:create ‘test’,‘f1’
查看表:list,
插入数据:
put ‘test’,‘r1’,‘f1:c1’,‘myvalue1’
put ‘test’,‘r2’,‘f1:c2’,‘myvalue2’
查看单条数据:get ‘test’,‘r1’
查看全表数据:scan ‘test’
禁用表:disable ‘test’
删除表:drop ‘test’
HBash之shell操作
1.需求
有以下订单数据,我们想要将这样的一些数据保存到HBase中。
订单ID 订单状态 支付金额 支付方式ID 用户ID 操作时间 商品分类
001 已付款 200.5 1 001 2020-5-2 18:08:53 手机
接下来,我们将使用HBase shell来进行以下操作:
创建表
添加数据
更新数据
删除数据
查询数据
2.创建表
在HBase中,所有的数据也都是保存在表中的。要将订单数据保存到HBase中,首先需要将表创建出来。
2.1 启动HBase Shell:hbase shell
HBase的shell其实JRuby的IRB(交互式的Ruby),但在其中添加了一些HBase的命令。
2.2 创建表:create ‘表名’,‘列蔟名’…
创建订单表,表名为ORDER_INFO,该表有一个列蔟为C1
create ‘ORDER_INFO’,‘C1’;
注意:
create要写成小写
一个表可以包含若干个列蔟
2.3 查看表:list
2.4 删除表:要删除某个表,必须要先禁用表
禁用表:disable “表名”
删除表:drop “表名”
3.添加数据
接下来,我们需要往订单表中添加以下数据。
订单ID 订单状态 支付金额 支付方式ID 用户ID 操作时间 商品分类
ID STATUS PAY_MONEY PAYWAY USER_ID OPERATION_DATE CATEGORY
1 已提交 4070 1 4944191 43946.5064351852 手机
3.1 put操作
HBase中的put命令,可以用来将数据保存到表中。但put一次只能保存一个列的值。
以下是put的语法结构:put ‘表名’,‘ROWKEY’,‘列蔟名:列名’,‘值’
–要添加以上的数据,需要使用7次put操作。如下:
put ‘ORDER_INFO’,‘000001’,‘C1:ID’,‘000001’
put ‘ORDER_INFO’,‘000001’,‘C1:STATUS’,‘已提交’
put ‘ORDER_INFO’,‘000001’,‘C1:PAY_MONEY’,4070
put ‘ORDER_INFO’,‘000001’,‘C1:PAYWAY’,1
put ‘ORDER_INFO’,‘000001’,‘C1:USER_ID’,4944191
put ‘ORDER_INFO’,‘000001’,‘C1:OPERATION_DATE’,‘2020-04-25 12:09:16’
put ‘ORDER_INFO’,‘000001’,‘C1:CATEGORY’,‘手机;’
4.查看数据
4.1 get命令
在HBase中,可以使用get命令来获取单独的一行数据。
语法:get ‘表名’,‘rowkey’
4.2 显示中文
在HBase shell中,如果在数据中出现了一些中文,默认HBase shell中显示出来的是十六进制编码。要想将这些编码显示为中文,我们需要在get命令后添加一个属性:{FORMATTER => ‘toString’}
4.2.1 查看订单的数据:get ‘ORDER_INFO’,‘000001’, {FORMATTER => ‘toString’}
注:
{key => value},这个是Ruby语法,表示定义一个HASH结构
get是一个HBase Ruby方法,‘ORDER_INFO’、‘000001’、{FORMATTER => ‘toString’}是put方法的三个参数
注意:FORMATTER要使用大写
5.删除操作
5.1 delete命令:删除某列数据
在HBase中,可以使用delete命令来将一个单元格的数据删除。
语法格式如下:delete ‘表名’, ‘rowkey’, ‘列蔟:列’
删除指定的列:delete ‘ORDER_INFO’,‘000001’,‘C1:STATUS’
5.2 deleteall命令:删除整行数据
deleteall命令可以将指定rowkey对应的所有列全部删除。
语法格式如下:deleteall ‘表名’,‘rowkey’
删除指定的订单:deleteall ‘ORDER_INFO’,‘000001’
5.3 truncate命令:清空表
truncate命令用来清空某个表中的所有数据。
语法:truncate “表名”
清空ORDER_INFO的所有数据:truncate ‘ORDER_INFO’
6.导入数据集
文件ORDER_INFO.txt 中,有一份这样的HBase数据集,我们需要将这些指令放到HBase中执行,将数据导入到HBase中。
具体数据可以自己模拟下面的脚本
put ‘ORDER_INFO’,‘097A88-XXX-XXX’,‘C1:STATUS’,‘已完成’
put ‘ORDER_INFO’,‘0E01ED-XXX-XXX’,‘C1:STATUS’,‘已提交’
put ‘ORDER_INFO’,‘0E01ED-XXX-XXX’,‘C1:STATUS’,‘已付款’
6.1 上传command文件
将该数据集文件上传到指定的目录中
6.2 执行
#命令
hbase shell /export/software/ORDER_INFO.txt
离线文件导入HBase
<!-- column_nmu: 要和源数据文件中的列的数量对应 -->
<!-- id: 无关紧要,只是一个ID标识,可不修改 -->
<import id="first" column_num="4">
<!-- index: 原始数据中的列坐标 SMS_ADDRESS -->
<!-- type: 列数据类型 -->
<!-- SMS_ADDRESS: 原始数据列临时字段名 -->
<columns>
<column index="1" type="int">SMS_ID</column>
<column index="2" type="string">SMS_NAME</column>
<column index="3" type="boolean">SMS_ADDRESS</column>
<column index="4" type="long">SMS_SERIAL</column>
</columns>
<!--根据自己数据和业务设计rowkey
-->
<rowkey>
SMS_ID+'_'+substring(SMS_NAME,1,4)+'_'+reverse(SMS_SERIAL)
</rowkey>
<!-- 定义HTable列 -->
<!-- family: 列族columns family -->
<!-- column: 对应于原始数据中的列 -->
<qualifiers>
<!-- column: 定义普通列 -->
<normal family="NF">
<!-- H_ID: HBase表列的字段名 -->
<qualifier column="SMS_ID">H_ID</qualifier>
<qualifier column="SMS_NAME">H_NAME</qualifier>
<qualifier column="SMS_ADDRESS">H_ADDRESS</qualifier>
<qualifier column="SMS_SERIAL">H_SERIAL</qualifier>
</normal>
<!-- 定义组合列 (可选)
-->
<composite family="CF1">
<!-- H_COMBINE_1:组合列名 -->
<qualifier class="com.huawei.H_COMBINE_1">H_COMBINE_1</qualifier>
<columns>
<!-- 用如下三个列去组合 -->
<column>SMS_SERIAL</column>
<column>SMS_ADDRESS</column>
<column>SMS_NAME</column>
</columns>
</composite>
</qualifiers>
<!-- 定义二级索引 (可选) -->
<indices>
<index name="IDX1">
<index_column family="NF">
<!-- 支持的类型只有String,Int,Float,Long,Double,Short,Byte,Char
-->
<!-- 不支持将复合列定义为索引 -->
<!-- 索引类型的首字母需要大写,例如“type”=“String” -->
<qualifier type="String" length="10">H_NAME</qualifier>
<qualifier type="String" length="20">H_ADDRESS</qualifier>
</index_column>
</index>
<index name="IDX2">
<index_column family="CF2">
<!-- “length="30"”指索引列“H_SERIAL”的列值不能超过30个字符。-->
<qualifier type="String" length="30">H_SERIAL</qualifier>
</index_column>
</index>
</indices>
<!-- 定义要过滤的数据行规则 (可选)
-->
<badlines>SMS_ID < 7000 && SMS_NAME == 'HBase'</badlines>
</import>
- 计数操作
count命令:专门用来统计一个表中有多少条数据。
语法:count ‘表名’
注意:这个操作是比较耗时的。在数据量大的这个命令可能会运行很久。
获取订单数据:count ‘ORDER_INFO’ - 大量数据的计数统计
当HBase中数据量大时,可以使用HBase中提供的MapReduce程序来进行计数统计。
语法如下:
$HBASE_HOME/bin/hbase org.apache.hadoop.hbase.mapreduce.RowCounter ‘表名’
8.1 启动YARN集群
#启动yarn集群
start-yarn.sh
#启动historyserver
mr-jobhistory-daemon.sh start historyserver
8.2 执行MR JOB
$HBASE_HOME/bin/hbase org.apache.hadoop.hbase.mapreduce.RowCounter ‘ORDER_INFO’
9. 扫描操作
查询所有数据
scan命令:在HBase,我们可以使用scan命令来扫描HBase中的表。
语法:scan ‘表名’
扫描ORDER_INFO表:scan ‘ORDER_INFO’,{FORMATTER => ‘toString’}
注意:要避免scan一张大表!
查询数据(只显示3条)
scan ‘ORDER_INFO’, {LIMIT => 3, FORMATTER => ‘toString’}
查询订单状态、支付方式
scan ‘ORDER_INFO’, {LIMIT => 3, COLUMNS => [‘C1:STATUS’, ‘C1:PAYWAY’], FORMATTER => ‘toString’}
查询指定订单ID的数据并以中文展示
根据ROWKEY来查询对应的数据,ROWKEY为 ,只查询订单状态、支付方式,并以中文展示。
要查询指定ROWKEY的数据,需要使用ROWPREFIXFILTER,用法为:
语法:scan ‘表名’, {ROWPREFIXFILTER => ‘rowkey’}
scan ‘ORDER_INFO’, {ROWPREFIXFILTER => ‘02602f66-adc7-40d4-8485-76b5632b5b53’, COLUMNS => [‘C1:STATUS’, ‘C1:PAYWAY’], FORMATTER => ‘toString’}
- 过滤器
v在HBase中,如果要对海量的数据来进行查询,此时基本的操作是比较无力的。此时,需要借助HBase中的高级语法——Filter来进行查询。Filter可以根据列簇、列、版本等条件来对数据进行过滤查询。因为在HBase中,主键、列、版本都是有序存储的,所以借助Filter,可以高效地完成查询。当执行Filter时,HBase会将Filter分发给各个HBase服务器节点来进行查询。
HBase中的过滤器也是基于Java开发的,只不过在Shell中,我们是使用基于JRuby的语法来实现的交互式查询。以下是HBase 2.2的JAVA API文档。
http://hbase.apache.org/2.2/devapidocs/index.html
10.1 HBase中的过滤器
在HBase的shell中,通过show_filters指令,可以查看到HBase中内置的一些过滤器。
rowkey过滤器
rowkey过滤器 作用
RowFilter 实现行键字符串的比较和过滤
PrefixFilter rowkey前缀过滤器
KeyOnlyFilter 只对单元格的键进行过滤和显示,不显示值
FirstKeyOnlyFilter 只扫描显示相同键的第一个单元格,其键值对会显示出来
InclusiveStopFilter 替代 ENDROW 返回终止条件行
列过滤器
列过滤器 作用
FamilyFilter 列簇过滤器
QualifierFilter 列标识过滤器,只显示对应列名的数据
ColumnPrefixFilter 对列名称的前缀进行过滤
MultipleColumnPrefixFilter 可以指定多个前缀对列名称过滤
ColumnRangeFilter 过滤列名称的范围
值过滤器
值过滤器 作用
ValueFilter 值过滤器,找到符合值条件的键值对
SingleColumnValueFilter 在指定的列族和列中进行比较的值过滤器
SingleColumnValueExcludeFilter 排除匹配成功的值
其他过滤器
其他过滤器 作用
ColumnPaginationFilter 对一行的所有列分页,只返回 [offset,offset+limit] 范围内的列
PageFilter 对显示结果按行进行分页显示
TimestampsFilter 时间戳过滤,支持等值,可以设置多个时间戳
ColumnCountGetFilter 限制每个逻辑行返回键值对的个数,在 get 方法中使用
DependentColumnFilter 允许用户指定一个参考列或引用列来过滤其他列的过滤器
Java API官方地址:https://hbase.apache.org/devapidocs/index.html
10.2 过滤器的用法
过滤器一般结合scan命令来使用。打开HBase的JAVA API文档。找到RowFilter的构造器说明,我们来看以下,HBase的过滤器该如何使用。
语法:scan ‘表名’, { Filter => "过滤器(比较运算符, ‘比较器表达式’) }
比较运算符
比较运算符 描述
= 等于
大于
= 大于等于
< 小于
<= 小于等于
!= 不等于
比较器表达式
基本语法:比较器类型:比较器的值
比较器 描述 表达式语言缩写
BinaryComparator 匹配完整字节数组 binary:值
BinaryPrefixComparator 匹配字节数组前缀 binaryprefix:值
BitComparator 匹配比特位 bit:值
NullComparator 匹配空值 null
RegexStringComparator 匹配正则表达式 regexstring:正则表达式
SubstringComparator 匹配子字符串 substring:值
10.3 练习
查询指定订单ID的数据
因为要订单ID就是ORDER_INFO表的rowkey,所以,我们应该使用rowkey过滤器来过滤
scan ‘ORDER_INFO’, {FILTER => “RowFilter(=,‘binary:02602f66-adc7-40d4-8485-76b5632b5b53’)”}
查询状态为已付款的订单
因为此处要指定列来进行查询,所以,我们不再使用rowkey过滤器,而是要使用列过滤器
scan ‘ORDER_INFO’, {FILTER => “SingleColumnValueFilter(‘C1’, ‘STATUS’, =, ‘binary:已付款’)”, FORMATTER => ‘toString’}
查询支付方式为1,且金额大于3000的订单
此处需要使用多个过滤器共同来实现查询,多个过滤器,可以使用AND或者OR来组合多个过滤器完成查询
查询支付方式为1
SingleColumnValueFilter(‘C1’, ‘PAYWAY’, = , ‘binary:1’)
查询金额大于3000的订单
SingleColumnValueFilter(‘C1’, ‘PAY_MONEY’, > , ‘binary:3000’)
组合查询
scan ‘ORDER_INFO’, {FILTER => “SingleColumnValueFilter(‘C1’, ‘PAYWAY’, = , ‘binary:1’) AND SingleColumnValueFilter(‘C1’, ‘PAY_MONEY’, > , ‘binary:3000’)”, FORMATTER => ‘toString’}
注意:
HBase shell中比较默认都是字符串比较,所以如果是比较数值类型的,会出现不准确的情况
例如:在字符串比较中4000是比100000大的
Shell管理操作
status - 显示服务器状态
version - 显示HBase版本信息
whoami - 显示HBase当前用户
list - 显示当前所有的表
count - 统计指定表的记录数
describe - 展示表结构信息
exists - 检查表是否存在,适用于表量特别多的情况
is_enabled、is_disabled - 检查表是否启用或禁用
alter - 修改表和列簇
创建一个USER_INFO表,两个列蔟C1、C2
create ‘USER_INFO’, ‘C1’, ‘C2’
新增列蔟C3
alter ‘USER_INFO’, ‘C3’
删除列蔟C3
alter ‘USER_INFO’, ‘delete’ => ‘C3’
注意:‘delete’ => ‘C3’,还是一个Map结构,只不过只有一个key,可以省略两边的{}
disable/enable - 禁用一张表/启用一张表
drop - 删除表
删除一张表,记得在删除表之前必须先禁用
truncate - 清空表的数据
清空表的数据,禁用表-删除表-创建表
HBase表结构设计
1.命名空间
1.1说明
在一个项目中,需要使用HBase保存多张表,这些表会按照业务域来划分
为了方便管理,不同的业务域以名称空间namespace来划分,这样管理起来会更加容易
类似于Hive中的数据库,不同的数据库下可以放不同类型的表
HBase默认的名称空间是default,默认情况下,创建表时表都将创建在 default 名称空间下
HBase中还有一个命名空间hbase,用于存放系统的内建表(namespace、meta)
1.2语法
创建命名空间:create_namespace ‘MOMO_CHAT’
查看命名空间列表:list_namespace
查看命名空间:describe_namespace ‘MOMO_CHAT’
显示指定 NameSpace 下的表:list_namespace_tables ‘名称’
命名空间创建表:
注意:带有命名空间的表,使用冒号将命名空间和表名连接到一起。
#语法
create ‘名称空间:表名’,‘列簇’…
#示例:
#在MOMO_CHAT命名空间下创建名为:MSG的表,该表包含一个名为C1的列蔟。
create ‘MOMO_CHAT:MSG’,‘C1’
删除命名空间:drop_namespace ‘MOMO_CHAT’
删除命名空间,命名空间中必须没有表,如果命名空间中有表,是无法删除的
2.列蔟设计
HBase列蔟的数量应该越少越好
两个及以上的列蔟HBase性能并不是很好
一个列蔟所存储的数据达到flush的阈值时,表中所有列蔟将同时进行flush操作
这将带来不必要的I/O开销,列蔟越多,对性能影响越大
项目中我们一般只设计一个列蔟
3.版本设计
HBase 通过 HColumnDescriptor 为每个列族配置要存储的最大行数版本。最大版本的默认值为1。这是一个重要的参数,因为如数据模型部分所述,HBase 也没有覆盖行的值,而是按时间(和限定符)存储不同的值。在重要的压缩过程中删除多余的版本。最大版本的数量可能需要根据应用程序需求增加或减少。
不建议将最高版本数设置为极高的级别(例如,数百个或更多),除非这些旧值对您非常重要,因为这会大大增加 StoreFile 大小
我们可以通过命令来查看一下版本的信息:
通过以下输出可以看到:
版本是相对于列蔟而言
默认列蔟的版本数为1
hbase(main):015:0> describe “MOMO_CHAT:MSG”
Table MOMO_CHAT:MSG is ENABLED
MOMO_CHAT:MSG
COLUMN FAMILIES DESCRIPTION
{NAME => ‘C1’, VERSIONS => ‘1’, EVICT_BLOCKS_ON_CLOSE => ‘false’, NEW_VERSION_BEHAVIOR => ‘false’, KEEP_DELETED_CELLS => ‘FALSE’, CACHE_DATA_ON_WRITE => ‘false’, DATA_BLOCK_ENCODING => ‘NONE’, TTL => ‘FOREVER’, MIN_VERSIONS => ‘0’, REPLI
CATION_SCOPE => ‘0’, BLOOMFILTER => ‘ROW’, CACHE_INDEX_ON_WRITE => ‘false’, IN_MEMORY => ‘false’, CACHE_BLOOMS_ON_WRITE => ‘false’, PREFETCH_BLOCKS_ON_OPEN => ‘false’, COMPRESSION => ‘NONE’, BLOCKCACHE => ‘true’, BLOCKSIZE => ‘65536’}
1 row(s)
4.数据压缩
4.1 压缩算法
在HBase可以使用多种压缩编码,包括LZO、SNAPPY、GZIP。只在硬盘压缩,内存中或者网络传输中没有压缩。
压缩算法 压缩后占比 压缩 解压缩
GZIP 13.4% 21 MB/s 118 MB/s
LZO 20.5% 135 MB/s 410 MB/s
Zippy/Snappy 22.2% 172 MB/s 409 MB/s
GZIP的压缩率最高,但是其实CPU密集型的,对CPU的消耗比其他算法要多,压缩和解压速度也慢;
LZO的压缩率居中,比GZIP要低一些,但是压缩和解压速度明显要比GZIP快很多,其中解压速度快的更多;
Zippy/Snappy的压缩率最低,而压缩和解压速度要稍微比LZO要快一些
4.2 查看表数据压缩方式
通过以下输出可以看出COMPRESSION => ‘NONE’,HBase创建表默认是没有指定压缩算法的
hbase(main):015:0> describe “MOMO_CHAT:MSG”
Table MOMO_CHAT:MSG is ENABLED
MOMO_CHAT:MSG
COLUMN FAMILIES DESCRIPTION
{NAME => ‘C1’, VERSIONS => ‘1’, EVICT_BLOCKS_ON_CLOSE => ‘false’, NEW_VERSION_BEHAVIOR => ‘false’, KEEP_DELETED_CELLS => ‘FALSE’, CACHE_DATA_ON_WRITE => ‘false’, DATA_BLOCK_ENCODING => ‘NONE’, TTL => ‘FOREVER’, MIN_VERSIONS => ‘0’, REPLI
CATION_SCOPE => ‘0’, BLOOMFILTER => ‘ROW’, CACHE_INDEX_ON_WRITE => ‘false’, IN_MEMORY => ‘false’, CACHE_BLOOMS_ON_WRITE => ‘false’, PREFETCH_BLOCKS_ON_OPEN => ‘false’, COMPRESSION => ‘NONE’, BLOCKCACHE => ‘true’, BLOCKSIZE => ‘65536’}
1 row(s)
4.3 设置数据压缩
创建新的表,并指定数据压缩算法
create “MOMO_CHAT:MSG”, {NAME => “C1”, COMPRESSION => “GZ”}
修改已有的表,并指定数据压缩算法
alter “MOMO_CHAT:MSG”, {NAME => “C1”, COMPRESSION => “GZ”}
5. ROWKEY设计原则
5.1 HBase官方的设计原则
避免使用递增行键/时序数据
如果ROWKEY设计的都是按照顺序递增(例如:时间戳),这样会有很多的数据写入时,负载都在一台机器上。我们尽量应当将写入大压力均衡到各个RegionServer
避免ROWKEY和列的长度过大
在HBase中,要访问一个Cell(单元格),需要有ROWKEY、列蔟、列名,如果ROWKEY、列名太大,就会占用较大内存空间。所以ROWKEY和列的长度应该尽量短
ROWKEY的最大长度是64KB,建议越短越好
使用long等类型比String类型更省空间
long类型为8个字节,8个字节可以保存非常大的无符号整数,例如:18446744073709551615。如果是字符串,是按照一个字节一个字符方式保存,需要快3倍的字节数存储。
ROWKEY唯一性
设计ROWKEY时,必须保证RowKey的唯一性
由于在HBase中数据存储是Key-Value形式,若向HBase中同一张表插入相同RowKey的数据,则原先存在的数据会被新的数据覆盖。
5.2 避免数据热点
热点是指大量的客户端(client)直接访问集群的一个或者几个节点(可能是读、也可能是写)
大量地访问量可能会使得某个服务器节点超出承受能力,导致整个RegionServer的性能下降,其他的Region也会受影响
1、预分区
默认情况,一个HBase的表只有一个Region,被托管在一个RegionServer中
每个Region有两个重要的属性:Start Key、End Key,表示这个Region维护的ROWKEY范围
如果只有一个Region,那么Start Key、End Key都是空的,没有边界。所有的数据都会放在这个Region中,但当数据越来越大时,会将Region分裂,取一个Mid Key来分裂成两个Region
预分区个数 = 节点的倍数。默认Region的大小为10G,假设我们预估1年下来的大小为10T,则10000G / 10G = 1000个Region,所以,我们可以预设为1000个Region,这样,1000个Region将均衡地分布在各个节点上
指定 start key、end key来分区
#语法
create ‘表名‘,’列簇‘,SPLITS=>[分区区间]
#示例,第一个shell命令 创建表的时候,定义了5个分区
hbase> create ‘ns1:t1’, ‘f1’, SPLITS => [‘10’, ‘20’, ‘30’, ‘40’]
hbase> create ‘t1’, ‘f1’, SPLITS => [‘10’, ‘20’, ‘30’, ‘40’]
hbase> create ‘t1’, ‘f1’, SPLITS_FILE => ‘splits.txt’, OWNER => ‘johndoe’
指定分区数量、分区策略
分区策略:
HexStringSplit ROWKEY是十六进制的字符串作为前缀的
DecimalStringSplit ROWKEY是10进制数字字符串作为前缀的
UniformSplit ROWKEY前缀完全随机
#语法
hbase> create ‘t1’, ‘f1’, {NUMREGIONS => 15, SPLITALGO => ‘HexStringSplit’}
2、ROWKEY避免热点设计
1.反转策略
如果设计出的ROWKEY在数据分布上不均匀,但ROWKEY尾部的数据却呈现出了良好的随机性,可以考虑将ROWKEY的翻转,或者直接将尾部的bytes提前到ROWKEY的开头。
反转策略可以使ROWKEY随机分布,但是牺牲了ROWKEY的有序性
缺点:利于Get操作,但不利于Scan操作,因为数据在原ROWKEY上的自然顺序已经被打乱
2.加盐策略
Salting(加盐)的原理是在原ROWKEY的前面添加固定长度的随机数,也就是给ROWKEY分配一个随机前缀使它和之间的ROWKEY的开头不同
随机数能保障数据在所有Regions间的负载均衡
缺点:因为添加的是随机数,基于原ROWKEY查询时无法知道随机数是什么,那样在查询的时候就需要去各个可能的Regions中查找,加盐对比读取是无力的
3.哈希策略
基于 ROWKEY的完整或部分数据进行 Hash,而后将Hashing后的值完整替换或部分替换原ROWKEY的前缀部分
这里说的 hash 包含 MD5、sha1、sha256 或 sha512 等算法
缺点:Hashing 也不利于 Scan,因为打乱了原RowKey的自然顺序
最后
以上就是传统小丸子为你收集整理的hbase基础介绍安装包版本创建一个USER_INFO表,两个列蔟C1、C2新增列蔟C3删除列蔟C3的全部内容,希望文章能够帮你解决hbase基础介绍安装包版本创建一个USER_INFO表,两个列蔟C1、C2新增列蔟C3删除列蔟C3所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复