Hbase

Posted com.少年

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hbase相关的知识,希望对你有一定的参考价值。

概述

  • Hbase官网
  • 相关代码
  • 基于hdfs开源分布式非关系K-V 数据库
  • 数十亿行 X 数百万列,进行随机、实时读/写访问
  • 通过时间戳控制版本,返回最新版本数据
  • 读流程写流程
  • 数据没有类型,都以byte数组存储
  • 数据自动分片

基本概念

Hbasemysql
namespace (命名空间)
table:创建表时,只需要指定列族即可,可以动态增加
列族-
row-key:数据通过rowKey查询和修改主键

基本架构

  • Zookeeper:管理元数据信息
  • Hmaster
  • Region Server
    在这里插入图片描述

数据模型

Region的横向切分

  • 自动切分:当Regionstore中的文件超过计算公式时,会自动切分Region
  • 手动规划:建表的时候,手动规划分区,见优化内容
    在这里插入图片描述

数据读写流程

写流程

  1. 客户端从zk获取meta表所在regionServer
  2. 客户端从meta表中获取数据表所在regionServer
  3. 客户端从数据表所在regionServer写入数据
    在这里插入图片描述

读流程

  1. 客户端从zk获取meta表所在regionServer
  2. 客户端从meta表中获取数据表所在regionServer
  3. 同时读取磁盘 内存 block cache的数据,进行合并
  4. 同时把磁盘的数据缓存到block cache
  5. 返回时间戳最大的
    在这里插入图片描述

文件合并

Minor compact

  • 小合并

Major compact

  • 大合并,需要rewrite数据文件
  • 删除原文件和数据
    在这里插入图片描述

数据真正删除

  • Hbase以时间戳控制数据版本,删除的数据只是被标记为DELETE
  • flush 时:删除内存中的被删除的数据
  • Major Compact时:删除所有被删除的数据

命令行与客户端

命令行

# 获取所有命令
help
# 获取get命令的使用详细
help 'get'

客户端

<!-- Java 客户端 -->
 <dependency>
     <groupId>org.apache.hbase</groupId>
     <artifactId>hbase-client</artifactId>
     <version>2.4.2</version>
 </dependency>
final Scan scan = new Scan();
// 筛选sex='男'的数据
final Filter filter = new SingleColumnValueFilter(Bytes.toBytes("info"), Bytes.toBytes("sex"), CompareOperator.EQUAL, new RegexStringComparator("男"));
scan.setFilter(filter);
// 预设10个分区,会把【0-9】平均分成10个
admin.createTable(descriptor, Bytes.toBytes("000|"), Bytes.toBytes("009|"), 10);

Hbase 优化

高可用

  • 热备Master:自带,直接启动Master即可

rowKey

  • 设计原则:散列性,唯一性,长度
  • Hbase 只能通过 RowKey 单行查询、扫描一段 rowKey或者全表扫描
  • 所以,rowKey 的设计十分重要,需要查询的字段要拼接rowKey
  • 越高频的查询字段排列越靠左

预分区

  • 手动指定
-- 创建staff1,手动预设五个分区,根据【rowkey】的【字典序】进到不同的【Region】
create 'staff1','info',SPLITS => ['1000','2000','3000','4000']
  • 文件规则
-- splits.txt
aaaa
bbbb
cccc
dddd
-- 文件内部会自动排序
create 'staff3','partition3',SPLITS_FILE => 'splits.txt';
  • 16进制分区
-- hash分区(少用)
create 'staff2','info','partition2',{NUMREGIONS => 15, SPLITALGO =>'HexStringSplit'}

内存

  • 内存建议:不建议过大,【16-48G】
  • 如果内存过大,flush 时间会过长,影响集群使用

hdfs相关

  • 允许 hdfs 追加写
  • dataNode的 允许最大文件打开数
  • 增加 数据操作的等待时间
  • 开启压缩
  • HStore大小【默认:10G】

客户端相关

  • 优化客户端缓存:批量put,会在客户端缓存,然后批量RPC
  • scan.next()一次返回的条数
  • -RPC监听数量,和 客户端连接数 有关

Hbase & Hive

搭建

  1. 软连接需要使用的jar
ln -s $HBASE_HOME/lib/hbase-common-2.4.2.jar $HIVE_HOME/lib/hbase-common-2.4.2.jar
ln -s $HBASE_HOME/lib/hbase-server-2.4.2.jar $HIVE_HOME/lib/hbaseserver-2.4.2.jar
ln -s $HBASE_HOME/lib/hbase-client-2.4.2.jar $HIVE_HOME/lib/hbase-client-2.4.2.jar
ln -s $HBASE_HOME/lib/hbase-protocol-2.4.2.jar $HIVE_HOME/lib/hbase-protocol-2.4.2.jar
ln -s $HBASE_HOME/lib/hbase-it-2.4.2.jar $HIVE_HOME/lib/hbase-it2.4.2.jar
ln -s $HBASE_HOME/lib/htrace-core-3.1.0-incubating.jar $HIVE_HOME/lib/htrace-core-3.1.0-incubating.jar
ln -s $HBASE_HOME/lib/hbase-hadoop2-compat-2.4.2.jar $HIVE_HOME/lib/hbase-hadoop2-compat-2.4.2.jar
ln -s $HBASE_HOME/lib/hbase-hadoop-compat-2.4.2.jar $HIVE_HOME/lib/hbase-hadoop-compat-2.4.2.jar
  1. 修改hive 配置文件
    <property>
        <name>hive.zookeeper.quorum</name>
        <value>localhost</value>
    </property>
    <property>
        <name>hive.zookeeper.client.port</name>
        <value>2181</value>
    </property>

使用

关联

  • HbaseHive 同时建表,数据可以自动同步
CREATE TABLE hive_hbase_emp_table
(
    empno    INT,
    ename    STRING,
    job      STRING,
    mgr      INT,
    hiredate STRING,
    sal      DOUBLE,
    comm     DOUBLE,
    deptno   INT
)
	-- 指定hbase
    STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' 
    -- 指定字段的映射关系
    WITH SERDEPROPERTIES ("hbase.columns.mapping"=":key,info:ename,info:job,info:mgr,info:hiredate,info:sal,info:comm,info:deptno")
    -- 指定hbase 的表名
    TBLPROPERTIES ("hbase.table.name" = "hbase_emp_table");
-- 插入数据
INSERT INTO hive_hbase_emp_table
SELECT *
FROM emp;

分析

  • Hbase 已经存在表,Hive建立一个外部表关联。可以借助 Hive 分析 Hbase 的数据
-- 外部表
CREATE EXTERNAL TABLE hive_hbase_stu
(
    id     INT,
    name   STRING,
    sex    STRING,
    height DOUBLE,
    addr   STRING,
    math   INT
)
    STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
    WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,info:name,info:sex,info:height,info:addr,exam:math")
    TBLPROPERTIES ("hbase.table.name" = "liubin:stu");

SELECT
    sex,
    COUNT(*)
FROM hive_hbase_stu
GROUP BY sex;

应用场景

微博实战

  • 相关代码
  • 发微博,删除
  • 关注用户,取关
  • 获取关注人的微博

表设计

  • weibo-content 微博内容表
    • rowKey:用户id+时间戳
    • 包含微博内容
  • weibo-user 用户表
    • rowKey:分区建+用户id
    • 包含个人信息
  • weibo-relations 用户关注表
    • rowKey:关注人id+被关注人id
    • 被关注人id作为列,userName 作为 value
  • weibo-relations-fans 用户粉丝表
    • 和关注表相反
    • rowKey:被关注人id+关注人id
    • 关注人id作为列,userName 作为 value

重点 粉丝关系

基于上面的设计 - 高表

-- 获取1用户所有的关注人
scan 'weibo-relations',{STARTROW=>'1',ENDROW=>'1|'}
-- 获取用户2所有的粉丝
scan 'weibo-relations-fans',{STARTROW=>'2',ENDROW=>'2|'}

在这里插入图片描述

另一种设计 - 宽表

  • 每个用户对应1行,每一个被关注人,增加一列
  • 可以保证事务性,因为只是一行
    在这里插入图片描述

参考文章

  • https://help.aliyun.com/document_detail/49503.html
  • https://www.bilibili.com/video/BV1Y4411B7jy?p=64
  • HBase in Action

以上是关于Hbase的主要内容,如果未能解决你的问题,请参考以下文章

Hbase的bulkload代码

Hbase 出现 org.apache.hadoop.hbase.ipc.ServerNotRunningYetException: Server is not running yet 错误(示例代码

无法从 MapReduce 代码访问 HBase

spark集成hbase与hive数据转换与代码练习

实用代码| hbase表的创建以及简单的增删改查

HBase代码学习---Flush流程