Hbase
Posted com.少年
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hbase相关的知识,希望对你有一定的参考价值。
文章目录
概述
- Hbase官网
- 相关代码
- 基于hdfs的开源、分布式、非关系K-V 数据库
- 数十亿行 X 数百万列,进行随机、实时读/写访问
- 通过时间戳控制版本,返回最新版本数据
- 读流程比写流程慢
- 数据没有类型,都以byte数组存储
- 数据自动分片
基本概念
Hbase | mysql |
---|---|
namespace (命名空间) | 库 |
table:创建表时,只需要指定列族即可,列可以动态增加 | 表 |
列族 | - |
列 | 列 |
row-key:数据通过rowKey查询和修改 | 主键 |
基本架构
- Zookeeper:管理元数据信息
- Hmaster
- Region Server
数据模型
Region的横向切分
- 自动切分:当
Region
中store
中的文件超过计算公式时,会自动切分Region
- 手动规划:建表的时候,手动规划分区,见优化内容
数据读写流程
写流程
- 客户端从zk获取meta表所在regionServer
- 客户端从meta表中获取数据表所在regionServer
- 客户端从数据表所在regionServer写入数据
读流程
- 客户端从zk获取meta表所在regionServer
- 客户端从meta表中获取数据表所在regionServer
- 同时读取
磁盘
内存
block cache
的数据,进行合并 - 同时把
磁盘
的数据缓存到block cache
- 返回时间戳最大的
文件合并
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
搭建
- 软连接需要使用的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
- 修改hive 配置文件
<property>
<name>hive.zookeeper.quorum</name>
<value>localhost</value>
</property>
<property>
<name>hive.zookeeper.client.port</name>
<value>2181</value>
</property>
使用
关联
- Hbase 和 Hive 同时建表,数据可以自动同步
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 出现 org.apache.hadoop.hbase.ipc.ServerNotRunningYetException: Server is not running yet 错误(示例代码