hbase 表结构 环境搭建 hbase的操作 过滤器 hbase与hive的整合 hbase的rowkey设计原则

本文介绍了HBase的基本概念,如其作为NoSQL数据库的特点,以及与Hive的区别。详细讲解了HBase的表结构,包括表、列族、列、行键和单元格。还阐述了HBase的环境搭建步骤,以及HBase操作,如增删改查。此外,文章讨论了HBase与Hive的整合过程,并提出了HBase行键设计的重要原则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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为没有规律的内容放在最前面

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值