hbase
hbase 是一款开源的,分布式的,版本化的,非关系型(NoSql)数据库
NoSql = not only sql
hive是数据仓库,但是使用的是类sql语句
hbase是数据库,但是不用sql语句
特点:
1.存储量大
2.数据稀疏
3.速度快:数据量比较大的情况下,不是特别慢。
4.数据无类型(单一类型)
应用场景:
1.适合做海量数据的存和取
2.如果数据量不超过千万级别,不建议使用hbase。
3.hbase不适合做细腻的数据分析 where
hbase的表结构
- 表(table):
hbase以表为单位组织数据 - 列族(columnFamily):
由不定多个具有相同意义的列组成一个列族,一个表中可以有多个列族 - 列(column):
列族下的具体的某一列,一个表当中可以存在数百万列。 - 行键(rowKey):
行是由一个Rowkey和多个列族组成,
一行只能有一个行键,用来做当前行的唯一标识,表中可以有数十亿行 - 单元格(cell):
由rowkey,column和columnFamily唯一确定一个单元格 - 时间戳(timestamp):
同一个单元格下可以保存历史版本,通过时间戳进行保存。
hbase的整体架构
- client:
客户端,提交请求,发送数据 - HMaster:
负责管理,HRegionServer,HRegion。。。 - HRegionServer:
维护HRegion,负责切分过大的HRegion,真正执行数据的增删改查 - HRegion:
每个HRegion内会存储一到多行数据,
最原始状态,只有一个HRegion
随着数据量不断增大,HRegion的数量也会逐渐变多
HRegion的数量大到一定程度的时候,就会把数据放到其他的HRegionServer中 - Store:
每个store存的是一个列族 - MemStore:
内存缓冲区,先把数据写入到这里
达到一定的阈值后,会启动flashcache进程将数据写入storeFile中
每次写入生成一个StoreFile - StoreFile:
当StoreFile数量达到一定阈值后,系统会进行合并,并删除一些旧版本的数据
当整个容量达到一定阈值后,会拆分HRegion - HLog:
在写入数据之前,要先写入日志,目的是为了容灾
一旦出现问题,可以通过日志做数据的恢复
环境搭建:
- 本地模式
1.解压缩
2.配置环境变量
3.修改配置文件
a.hbase-env.sh
export JAVA_HOME=xxx
b.hbase-site.xml
<property>
<name>hbase.rootdir</name>
<value>file:///home/bduser/file/hbase</value>
</property>
注意:本地模式的路径前一定要加file:///
4.启动服务
start-hbase.sh
5.正确执行
hbase shell
- 伪分布式模式/完全分布式模式
1.解压缩
2.配置环境变量
3.修改配置文件
a.hbase-env.sh
export JAVA_HOME=xxx
export HBASE_MANAGES_ZK=false
b.hbase-site.xml
直接上传
c.reginservers
node101
node102
node103
node104
4.分发到集群
xsync hbase
xsync .bashrc
xcall source .bashrc
5.启动服务
a.启动hdfs
start-dfs.sh
b.启动zookeeper
xcall zkServer.sh start
c.启动hbase
hbase-start.sh
6.正确执行
hbase shell
如果运行命令出错,尝试替换hadoop中的jar包。
hbase的操作
shell脚本的操作
help 查看hbase的帮助文档
Group:
general 一些关于整个hbase的简单操作
status 查看节点的状态
version 查看hbase的版本
whoami 查看当前的用户名
namespace 关于命名空间(数据库)的增删改查
増:
1.创建一个namespace
create_namespace “”
查:
1.查看有哪些namespace
list_namespace
2.查看某个namespace下有哪些表
list_namespace “name”
3.查看某个namespace的描述信息
describe_namespace “name”
改:
1.添加属性:
alter_namespace “name” {METHOD => “set”,“pk” => “pv”}
2.取消属性:
alter_namespace “name” {METHOD => “unset”,NAME => “pk”}
DDL:关于表的增删改查
増:
1.指定namespace创建表
create “ns:tb”,“cf”,…
2.在default数据库下,指定选项创建表
create “tb”,{NAME=>‘cf1’,VERSIONS=>‘3’,…},
{NAME=>‘cf2’},…
3.在default数据库下,一切选项走默认的简单创建表
create “tb”,“cf1”,“cf2”,…
查:
1.查看表的详细信息
describe/desc “tb”
2.查看表里的行数
count “tb”
3.查看表是否存在,适用于表特别多的情况
exists “tb”
4.查看表是否被禁用/是否允许使用
is_enabled “tb”
is_disabled “tb”
改:
1.修改或添加表里的列族
如果原表没有这个列族就新添加,如果有这个列族就修改
alter “tb”,{NAME=>“cf1”,…},…
2.删除列族
alter “tb”,“delete”=>“cf”
删:
1.删除表
disable “tb”
drop “tb”
注意:不管表是否为空,想要删除表必须先禁用这个表,才能删除
DML:关于表数据的增删改查
増:
1.向表中添加数据
put “tb”,“rk”,“cf:column”,“value”[,ts]
注意:
a.value都以字符串形式表示
b.时间戳可有可无,没有时间戳按照时间的毫秒数算
c.表数据的行数只与rk有关
d.不同行的列不需要对齐
查:
1.全表扫描
//直接全表扫描表信息
a.scan “tb”
//按照RowKey的起始和终止位置查看表数据,前闭后开
b.scan “tb”,{STARTROW=>“rkn”,STOPROW=>“rkn”}
//按照RowKey给定的起始位置到最后位置查看表数据
c.scan “tb”,{STARTROW=>“rkn”}
//按照RowKey的原始起始位置到给定的终止位置查看表数据
d.scan “tb”,{STOPROW=>“rkn”}
2.查看行或列(列族)数据
get “tb”,“rk”
get “tb”,“rk”,“cf”
get “tb”,“rk”,“cf:column”
get “tb”,“rk”,{COLUMN=>“cf[:column]”,VERSIONS=>n}
注意:
a.n<最大值时,显示n条数据
b.n>=最大值时,显示最大值条数据
c.显示顺序按时间戳倒序排序显示
改:
1.改同一个表,rowkey,列族:列下的value值
put “tb”,“rk”,“cf:column”,“value”[,“ts”]
删:
1.删除具体的某一列
delete “tb”,“rk”,“cf:column”
注意:可以删除某行键下的具体的某一列,但是不能删除列族
2.删除一行
deleteall “tb”,“rk”
3.清空表数据,相当于先disable表,drop表,创建表
truncate “tb”
过滤器:
给定一定的条件,过滤出我们想要的数据
相当于是sql语句里的where条件
hbase不太适合做这种按条件查询的比较细腻的操作
过滤器的三个组成部分
普通sql:… where 字段 比较运算符 被比较的内容
-
比较器(指定比较机制)
a.BinaryComparator 按照字节索引顺序比较指定字节数组
b.BinaryPrefixComparator 与上面一样,比较开头是否一致
c.NullComparator 比较给定内容是否为空
d.BitComparator 按位比较
e.RegexStringComparator 提供正则表达式比较规则
f.SubStringComparator 比较字符串子串是否相等 -
比较运算符
LESS < LESS_OR_EQUAL <= EQUAL == NOT_EQUAL != GREATER > GREATE_OR_EQUAL >= NO_OP 排除所有
-
过滤器分类
基本过滤器 1.行键过滤器 RowFilter 2.列族过滤器 FamilyFilter 3.列过滤器 QualifierFilter 4.值过滤器 ValueFilter 5.时间戳过滤器 TimestampFilter 专用过滤器 1.单列值过滤器 SingleColumnValueFilter 2.单列值排除器 SingleColumnValueExcludeFilter 3.前缀过滤器 PrefixFilter 特指行键 4.列前缀过滤器 ColumnPrefixFilter 5.分页过滤器 PageFilter 6.过滤器列表 FilterList
hbase与hive的整合
- 步骤:
1.把hbase的所有的jar包复制到hive下
//cp -n 如果有相同的内容则忽略
cp -n ${HBASE_HOME}/lib/* ${HIVE_HOME}/lib
2.把hive下的hive-hbase-handler-xxx.jar复制到hbase下
cp ${HIVE_HOME}/lib/hive-hbase… ${HBASE_HOME}/lib
3.hive-site.xml中添加与hbase中完全一致的zookeeper内容
4.如果是完全分布式模式,同步数据。 - 验证:
1.在hbase下创建一个aoligei表
2.在hive下创建一个与hbase的关联表
A.关联所有列
CREATE EXTERNAL TABLE hive_aoligei (key string,baseInfo map<string, string>)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,baseInfo:")
TBLPROPERTIES ("hbase.table.name" = "aoligei");
B.关联指定列
CREATE EXTERNAL TABLE hive_aoligei_default (key string,name string,age string)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES("hbase.columns.mapping" = ":key,baseInfo:name,baseInfo:age")
TBLPROPERTIES ("hbase.table.name" = "aoligei");
3.在hbase中添加数据
4.在hive的关联表中查询
hbase的rowkey设计原则
-
唯一原则
保证每行的rowkey都是唯一的,通过它可以确定唯一一行数据 -
长度原则
rowkey从理论上长度能达到64k,一般情况10-100Byte。
原因:
a.每个rowkey虽然很小,但是数量巨大。
b.数量越大,rowkey所占用的空间就越大。
c.不能把有限的空间过多的给与rowkey。
结论:
a.在满足唯一原则的基础上,长度越短越好。
b.如果有非常明确的排序需求,尽量保持rowkey的长度 -
散列原则
在没有非常明确的排序需求的前提下,尽量把rowkey分散开,
为了避免相同开头的数据扎堆,是某个HRegion的容量变得巨大
解决办法:
a.加盐
在rowkey的前面添加n为随机数
b.反转
把数据后面n为没有规律的内容放在最前面