hadoop实时day20–Apache HBase
今日课程内容大纲
1、Apache HBase 内部原理
2、zk在hbase中作用
3、HBase读写数据流程
4、HBase 3个核心机制
memstore flush机制
storefile compact机制
region split机制
5、HBase java api操作
hbase <--->spark、flink、java
DDL:创建表 删除表 修改表(shell)
DML:put get scan delete
查询是重中之重。
6、HBase和mapreduce集成
如何使用mr程序读写hbase的数据
课程重点:all.
HBase 架构原理
-
hbase中zk的作用
-
zk保存了meta表的位置信息
-
meta表中记录了表的元数据信息
-
所有任何表的DML操作必须先访问zk.
-
栗子
#step1 客户端访问zk get /hbase/meta-region-server #结果:meta在node-2上 #step2 去node-2上读取meta表数据 scan 'hbase:meta' #结果: t_user 数据位于node-2 #step3 客户端直接去node-2上 通过regionserver和表region进行交互
-
-
HBase 读写数据流程
-
写数据流程
-
-
客户端访问zk 获取meta表位置信息。客户端进行cache(缓存),便于后续访问。
-
客户端根据meta位置信息 到指定rs服务器上读取meta信息
-
获取待写入数据位于region位置信息。
-
客户端直接去对应regionserver上 进行数据写操作
-
先写wal,在写memstore。两个都成功校验无误 客户端返回。
至于内存中数据后续如何写入磁盘 属于hbase内部问题 客户端不关心的。
-
-
读数据流程
-
客户端访问zk 获取meta表位置信息。客户端进行cache,便于后续访问。
-
客户端根据meta位置信息 到指定rs服务器上读取meta信息
-
获取待待读取数据位于region位置信息。
-
客户端直接去对应regionserver上 进行数据读操作
- 先读memstore 再读storefile
- 把结果进行合并 找出符合客户端需要的数据版本返回(主要是因为版本问题)。
上述这种机制导致hbase在读数据反而比写数据。这正好好mysql等主流数据库相反。 hbase写数据的时候比mysql快一个数量级。 在读数据的时候反而满了一个数量级。
-
-
HBase 3个核心机制
-
memstore flush机制
-
背景
因为客户端在写数据的时候都是直接把数据写入内存的。内存使用大写是有限制 无法支撑大表数据所有存储。意味着最终的数据还是需要落入磁盘变成文件。
-
本质:memstore----->storeFile
-
触发机制
# RegionServer级别 hbase.regionserver.global.memstore.size=0.4 #可以堆内存40% hbase.regionserver.global.memstore.size.lower.limit=0.95 #触发比例 策略:当触发刷新阈值 按照 Memstore 由大到小执行,先 Flush Memstore最大的Region, 再执行次大的, 直至总体Memstore 内存使用量低于阈值 弊端:在regionserver级别flush 会阻塞整个regionserver服务 性能影响最大。 # region级别 hbase.hregion.memstore.flush.size #默认128M 注意:当大于 4*128M region会阻塞 速度写入过快 抛出异常。 # 时间触发机制 hbase.regionserver.optionalcacheflushinterval 默认1小时 # 手动触发机制 flush ‘tablename‘
-
-
StoreFile Compact 机制
-
背景
memstore flush,会把内存中数据刷新到磁盘上变成storefile文件。 每刷写一次都是一个文件,造成后续小文件过多。 弊端: 给namenode造成压力 元数据吃内存 后续hbase查询数据也不方便 减少 StoreFile数量,提升数据读取效率
-
本质:把多个storefile文件最终合并成为一个文件。在合并中对待删除数据(墓碑标记)、超时数据进行最终的物理删除。
-
具体来看
-
minor compaction 小合并
挑选相邻的多个小文件 重写合并成为一个大文件。 此过程中 不会对数据进行任何删除操作。
-
major compaction 大合并
保证最终一个列族store对应着一个storefile文件 合并中进行数据删除(墓碑标记、过期)
-
-
触发机制
#major 触发机制 hbase.hregion.majorcompaction #大合并间隔7天 hbase.hregion.majorcompaction.jitter #0.5抖动比例 建议:大合并十分耗费资源和性能 会对hbase正常业务访问造成影响 在企业生产环境中 建议设置为0 关闭自己触发的机制 解决:在业务低峰期 手动执行命令进行大合并 major_compact #minor 触发机制 hbase.hstore.compactionThreshold #storeflie 超过3个
-
-
region spilt 机制
-
背景
hbase在管理表的时候 会把表拆分成不同region 不同region可以存储在不同regionserver上 达到大表数据能够存储下和负载均衡问题。 随着数据不断插入 region也会越来越大 涉及region如何拆分问题。 建表的时候 默认是一个region。
-
机制
# 在hbase 0.94版本之前 ConstantSizeRegionSplitPolicy hbase.hregion.max.filesize = 10G 如果某个region的数据达到10G 就会等分为2. 实际切割 # 在hbase 0.94版本之后 IncreasingToUpperBoundRegionSplitPolicy Min (R^2 * “hbase.hregion.memstore.flush.size”, “hbase.hregion.max.filesize”) R:region 个数 hbase.hregion.memstore.flush.size =128M hbase.hregion.max.filesize = 10G 动态
-
注意事项
- 在hbase region拆分过程中 需要regionserver参与拆分
- 在region进行迁移 负载均衡的时候 需要master参与 涉及跨网络跨机器传递数据。
- 企业中通常采用预分区技术 提前指定分区个数。再加上rowkey良好设计 保证数据尽量负载均衡。避免了数据跨机器迁移。
-
HBase角色职责
-
HMaster
- DDL操作
- region故障恢复、负载均衡迁移
-
HRegionServer
- DML操作
- 3个核心机制:memstore flush、storefile compact、region split
-
zk集群
-
meta表位置信息
/hbase/meta-region-server
-
master HA
-
hbase集群的信息
- 主从角色当前在线的位置信息
- 命名空间列表 表列表
-
无zk无hbase.
-
HBase java API
-
在实际开发中 对于hbase操作 几乎都是通过代码操作的。(java sacla)
-
在java操作hbase的过程中 只需要指定zk集群的地址即可。
-
HBase 通用基础API
//创建hbase配置对象 用于指定集群信息 Configuration conf = HBaseConfiguration.create(); //设置zk集群信息 conf.set("hbase.zookeeper.quorum","node-1:2181,node-2:2181,node-3:2181"); //通过连接工厂类获取一个连接 Connection connection = ConnectionFactory.createConnection(conf); //基于连接获取Admin对象 Table对象 Admin admin = connection.getAdmin(); //DDL操作 Table table = connection.getTable("表名"); //DML操作
-
具体操作
-
DDL
- 开发环境准备–判断一张表是否存在
- 创建表
- 修改表
-
DML
-
插入数据 put
myuser.put(put); myuser.put(List<Put> puts);
-
查询数据
- get 查询
- scan 查询
-
删除数据
addColumn(final byte [] family, final byte [] qualifier) addColumn(byte [] family, byte [] qualifier, long timestamp) addColumns(final byte [] family, final byte [] qualifier) addColumns(final byte [] family, final byte [] qualifier, final long timestamp) // //delete.addColumn(Bytes.toBytes("f1"),Bytes.toBytes("name")); //不指定 删除最新版本 //delete.addColumn(Bytes.toBytes("f1"),Bytes.toBytes("name"),2); //指定的话 删除指定的版本数据 //delete.addColumns(Bytes.toBytes("f1"),Bytes.toBytes("name")); //不指定 删除的是全部版本数据 delete.addColumns(Bytes.toBytes("f1"),Bytes.toBytes("name"),2);//指定版本 删除小于等于指定版本的数据
create 't_5', {NAME => 'f1', VERSIONS => 3} put 't_5','001','f1:name','allen1',1 put 't_5','001','f1:name','allen2',2 put 't_5','001','f1:name','allen3',3 scan 't_5', {VERSIONS => 5}
-
filter 过滤器的使用
-
-
-
HBase中工具类
-
Bytes工具类
- 因为hbase底层数据都是bytes[] 在编程中繁涉及其他数据类型和byte[]之间互相转换的问题。
- hbase为此封装了一个工具类 专门用于bytes操作
org.apache.hadoop.hbase.util.Bytes
-
CellUitil工具类
- 在开发中涉及到从cell中提取列族 列 列值等属性信息 提取出来是bytes类型
- hbase为此封装了一个工具来 专门用于提取cell属性信息。
org.apache.hadoop.hbase.CellUtil
-
-
hbase filter过滤器
-
客户端进行扫描的时候 如果添加过滤器 在哪里执行呢?
过滤器在服务端执行 regionserver那里执行 把过滤之后的结果再返回客户端。
-
如何使用过滤器呢?
-
Comparator 比较器 根据何种规则比较。
BinaryComparator 按字典序顺序比较指定字节数组,采用 Bytes.compareTo(byte[]) BinaryPrefixComparator 跟前面相同,只是比较左端的数据是否相同 RegexStringComparator 提供一个正则的比较器,仅支持 EQUAL 和非 EQUAL SubstringComparator 判断提供的子串是否出现在value 中。 string.contains
-
比较运算符
LESS < LESS_OR_EQUAL <= EQUAL = NOT_EQUAL <> GREATER_OR_EQUAL >= GREATER > NO_OP 排除所有
-
-
过滤器种类
- RowFilter
- FamilyFilter
- QualifierFilter
- ValueFilter
- SingleColumnValueFilte
- SingleColumnValueExcludeFilter
- PrefixFilter
-
今日作业
-
HBase 架构组件 regionserver内部组件
-
HBase读写流程
- zk到底承担什么职责
-
HBase 3个核心机制
- flush
- compact
- split
-
java api操作
配置对象 连接 工厂 admin Table
-
预先课程
-
hbase和其他软件整合
- mapreduce读写
- hive整合
- sqoop使用
-
预分区
-
rowkey设计
-