谷歌三驾马车 gfs mapreduce bigTable(hbase)

1 Hbase 简介

命令行一般就测试一下用,更多时用api操作

https://www.bilibili.com/video/BV1Y4411B7jy/?spm_id_from=333.337.search-card.all.click&vd_source=568a2e03d216d37342da7a1a6053d5f7

1.1 Hbase定义

Hbase 1.3 尚硅谷 - 图2

分布式:可搭集群,, 可扩展:上下限调

hdfs不支持随机写。 hbase实现了hdfs的随机写(其实就是将数据下载后修改再重新上传)。

表 增删改(改是重点)查

1.2 Hbase 数据模型

1.2.1 Hbase逻辑结构

Hbase 1.3 尚硅谷 - 图3

Hbase 1.3 尚硅谷 - 图4

rowKey 按字典排,有>无

实际信息都是放到hdfs中存储。 这边store存储实际信息。

Region 表的切片内容

1.2.2 Hbase 物理存储结构

Hbase 1.3 尚硅谷 - 图5学hbase框架时,时间很重要~ 主要根据时间戳进行一些操作、

删除时,删除的时间戳要大于/等于 要删除数据的最新时间戳

1.2.3 数据模型

Hbase 1.3 尚硅谷 - 图6

Hbase 1.3 尚硅谷 - 图7

Hbase 1.3 尚硅谷 - 图8Hbase 1.3 尚硅谷 - 图9Hbase 1.3 尚硅谷 - 图10

缺少 time Stamp时,不同时间戳 单元格中的内容cell 是不同的

hbase拆到最小是cell

1.3 HBase基本架构

Hbase 1.3 尚硅谷 - 图11Hbase 1.3 尚硅谷 - 图12Hbase 1.3 尚硅谷 - 图13

2 Hbase 快速入门

测试用的较多,生产环境应用比较少

2.1 Hbase 安装部署

注:hbase配置文档中不会出现大写。

哒哒哒,需要注意会有 ReginServer 要单独启动。

2.2 Hbase shell操作 DDL DML

Hbase 1.3 尚硅谷 - 图14

Hbase 1.3 尚硅谷 - 图15

如果哪个常用命令不会写了,直接 输出,然后回车

Hbase 1.3 尚硅谷 - 图16

Hbase 1.3 尚硅谷 - 图17Hbase 1.3 尚硅谷 - 图18

删除命名空间时,要先删除命名空间中的表

scan(左闭右开)、get、put、

Hbase 1.3 尚硅谷 - 图19

增删改查都是根据时间戳进行

Hbase 1.3 尚硅谷 - 图20

versions 几个版本—-是hbase将来会为你存几个版本~

3 HBase 进阶 重点!

hlog与wal意思相同

3.1 架构详细图

Hbase 1.3 尚硅谷 - 图21

Hlog 预写入日志

HMaster (表DDL)

RegionServer(数据DML) 维护多个Region

同一个HRegion的不同store对应不同的列族

Store存储是相互分离的。 内容存在两个位置1 Mem store(内存中) 2 StoreFile(格式是HFile 磁盘中)

Mem store中内容可以刷写出1到多个storeFile。 storeFile最终要写如到hdfs的datanode,最终磁盘

3.2 写数据流程

最早还会有个-root- 表。先请求 -root-表再请求 meta表。当时主要担心meta表会做切分,但经过实际生产长时间验证,meta几乎是不会做切分的,于是后来就去掉了-root-表。

Hbase 读比写要慢

Hbase 1.3 尚硅谷 - 图22

1个源数据对应的是1个region

先写到wal,再写到内存。

源码层面:构建时也是先构建wal,当wal写入成功后 内存才会成功,如果wal不成功,内存中内容清空。

Hbase 1.3 尚硅谷 - 图23

hbase存储特点:稀疏性。

3.3 MemStore Flush流程

Hbase 1.3 尚硅谷 - 图24

Hbase 1.3 尚硅谷 - 图25

哒哒哒,下面还会有。应用时去搜索就好

在配置文件中可以配置的。 配置时,搜 flush会快速一点

Hbase 1.3 尚硅谷 - 图26

3.4 读流程

元数据

LRU cache 最近最少使用

查看解析HFile 工具及使用方式

读比写慢。

Hbase 1.3 尚硅谷 - 图27Hbase 1.3 尚硅谷 - 图28

3.5 StoreFile Compaction

Hbase 1.3 尚硅谷 - 图29

Hbase 1.3 尚硅谷 - 图30

读写流程是可以不需要master的,但如果没有master 集群不健康

数据真正删除时间 看博客

视频22

flush针对内存

触发删除数据的情况

  1. flush 或 comcat (major)
    1. flush 可删除在同一个内存中的(已经push了/已标记的)数据,不可删除的是跨越多个文件的数据(flush删除的是必须与flush在同一个文件中的数据)
    2. comcat(major) 将内存中内容都放一起了,见面后知道删不删除
  2. 删除标记会被删,在major见面时删除,也将其他该删除的内容一并删除
  3. 涉及多个版本时,会保留最大的版本

3.6 Region Split

Hbase 1.3 尚硅谷 - 图31

Hbase 1.3 尚硅谷 - 图32

自动切分会带来数据的热点问题; 一般建表的时候预分区—-防止数据倾斜,如3w数据建3个分区,第一个分区1~1w,第二个分区2~2w,第三个分区3~3w

官网建议使用列族时,使用一个列族; 防止生成太多小文件(flush刷写时,全局[所有列族]都刷写,不论文件大小)。

生产环境中可以使用多个,要自己分好(设计时几个文件尽量保持内容增长速度相同)。

4 Hbase API 重点! 这部分讲到的细节比较多 实操中

这个看官网好

视频P31 总结很nice

视频P37 总结

先学怎么用,再看原理,再看代码;

HbaseAPI

DDL 判断表是否存在

共用方法,可以提出来/放静态代码块中

Hbase 1.3 尚硅谷 - 图33

Hbase 1.3 尚硅谷 - 图34

可以在最后关闭,这个公共的对象都用完后再关(main中关闭 也是看作用域).

DDL 创建表

Hbase 1.3 尚硅谷 - 图35

Hbase 1.3 尚硅谷 - 图36

Hbase 1.3 尚硅谷 - 图37

DDL 创建命名空间

DDL 删除表

DML 插入数据

DML 查数据(get)

get返回的数据是 list集合/单个的某个值。

查可以指定到 列、列族、rowkey 都可

DML 查数据(scan)

scan返回的数据是一个新的容器类,类似set集合。但不是set集合,因为hbase扫描表 会扫描到很多内容,如果将扫描到的内容一个个放入集合中,会消耗大量内存客户端会崩掉,一般客户端也不会向set中存放太大数据,所以使用一个新容器类。 扫描时不断向该容器类中放内容,类似一个iterator过程。

ResultScanner

DML 删除数据

视频31

删除时,尽量使用 加s的这种方式。

Hbase 1.3 尚硅谷 - 图38

知其然,知其所以然。

p35 17分钟

Hbase 1.3 尚硅谷 - 图39

建议建表时,指定单个版本。

大数据中框架最难的点是数据一致性问题。它里面很多都是在做判断、做校验

两军问题,拜占廷将军问题 可以了解了解

视频P37 总结

MapReduce

Hbase 1.3 尚硅谷 - 图40

官方 HBase-MapReduce

只要能连接hbase,可分析(的框架) 就都可做为hbase的分析引擎。

word文档格式容易出现问题,最好先放到别的位置看一看有没有多空格、多制表符。

本地==>hbase hbase==>本地 本地<==>Hbase 可以通过mapReduce引擎 就是之前接触到的。

Hbase 1.3 尚硅谷 - 图41

命令行中 \ 是换行的意思。命令行中没有回车,回车就代表执行命令了。 如果去掉上面的\,可能会报错也可能会直接执行。写成多行方便阅读。

官方是读hdfs文件放到hbase表中

自定义HBase-MapReduce

就是做读写。没有复杂逻辑。

读hbase表,将内容写到另外一张hbase表中,做一些数据的过滤

注意:版本不同可能会有细微差别。

避免reduce产生数据倾斜,可以在map端先做一些事情。

结果驱动过程,以结果为导向。挺强~

与Hive的集成

本质:hive是分析框架,hbase是存储框架

HBase 与 Hive 的对比

Hbase 1.3 尚硅谷 - 图42 Hbase 1.3 尚硅谷 - 图43

Hbase与Hive集成使用

P43 P44 兼容性问题; 可以重新编译 ==> 将源码(hive)撸下来放到hbase中重新编译打包。 让环境发生一点事情;

hive中插入,hbase中查看到; hbase中插入,hive中查看到。

API 回顾

api的删除;

mapReduce;

与hive集成; 兼容不兼容; cdh是解决兼容性的。 cdh会略慢于正常版本的;建立关联表。放数据时hive有类型,hbase没有类型

5 Hbase 优化

5.1 高可用

的的的;节点挂了还可用-。-

RegionServer挂掉了,但master活着;master将RegionServer给其他去管理

5.2 预分区 重点 7 预分区/设计,2读写,1 其他

P48Hbase 1.3 尚硅谷 - 图44

预分区决定要素:1、未来发展数据量,2、机器规模

生产模式下一般1个机器最大放2~3个Region;

如果未来发展数据量超出预估很多很多,一般会换一个新的表把数据导出去。

如果某个rowkey设计的不合理,可以split切一下动态扩展一两个;而如果是想从5个扩展到10、20个直接重新建表导入比较好。

id会补成统一位数,方便管理的

Hbase 1.3 尚硅谷 - 图45Hbase 1.3 尚硅谷 - 图46图中这两种用的都少

一些。

5.3 RowKey 设计 重点 7 预分区/设计,2读写,1 其他Hbase 1.3 尚硅谷 - 图47经常一块读的数据放到一个Region中且最好放在一起,所以也要考虑集中性这方面是考虑业务性,业务决定将来什么数据在一起读。

从原则性

  1. 散列性:尽量均匀分布在多个分区中;
  2. 唯一性
  3. 长度规则 生产环境一般是 70~100位

如果只有一个表,没有散列性可言;设计时主要还是考虑散列性;另外两个比较简单。

散列最好的方式还是轮询

P50

5.4 内存优化

Hbase 1.3 尚硅谷 - 图48

5.5 基础优化

Hbase 1.3 尚硅谷 - 图49Hbase 1.3 尚硅谷 - 图50

Hbase 1.3 尚硅谷 - 图51Hbase 1.3 尚硅谷 - 图52

预分区和rowKey设计是最重要的; 前期服务端设计的好,可以对客户端进行微调让性能更好;但如果服务端设计的差,调客户端意义不大。

6 Hbase 实战之谷粒微博

P53 4