一、数据模型

1.数据模型例子

2.数据模型解析

1)存储(keyvalue)

HBase什么样的数据都能储存,数据的话在HBase当中都是以字节数组的形式储存的;HBase中数据的存储是以key-value格式来存储的,key是rowkey+时间戳+列簇,valuValue部分没有那么复杂的结构,就是纯粹的二进制数据

引用原文:https://blog.csdn.net/ping_hu/article/details/77115998

https://blog.csdn.net/weixin_33750452/article/details/90308038

2)Row Key

<1> rowkey介绍

如果你想对HBase的表进行防问的时候必须通过row key,那么row key是什么呢:Row Key代表了一行数据;它可以是任意的字符,但是最大只有64k;并且按照字典排序的;

注:我们可以利用字典排序这个点,将经常使用的数据放在一块,最近要访问的放在一块,来进行小小的优化一下

<2> rowkey设计

row key设计的时候需要注意的是,row key 的设计规则,规则有这么几个

定长

为什么定长呢?那是以为内在HBase当中,row的排序是按照字典排序的,如果不定长的话,排序就有可能会打乱。

越短越好

为什么定长呢?那是以为内在HBase当中,每条数据都会呆着rowkey,所以说rowkey越长,所消耗掉额空间就越多,适当的减少rowkey的长度可以提高存储空间的利用

唯一

按照实际的业务来

3)CF(Clumu Family)

· 列簇的话,它是shcema的一部分,所以它必须预先给出;

· 在HBase表中,列名以列簇为前缀,一个列簇可以有很多个成员(列);

· 成员的话可以按照业务的需求随时追加(动态加入);

· HBase存储把同一个列簇下的数据放在同一个目录下,就是说是以列簇 为目录存储的,目录下的文件存储该列簇的数据;

· 需要注意的是列簇一般最多只能有三个,一般只用一个就行,这是因为当一个列簇flush的时候,因为关联效应其他的列簇同样也会flush,最终导致系统产生更多的IO。

4)TimeTamp

时间戳是有系统生成的,精确到毫秒的64位整数,而且它本身就代表了唯一性;在HBase当中每个cell存储单元对同一份数据有多个版本,而版本 是根据时间戳来区分的,并且这些版本是按照时间倒序排序的,最新的数据版本排在前面的。

5)cell单元格

是row key和列簇交叉决定的,并且是带有版本的;

实际上存储的是一些未解析的字节数组,由row key , clumn(family | qualifier), ersion来定位。

6)Hlog

Hlog其实就是一个普通的hadoop序列文件,它会记录你对HBase表的操作,也会记录你操作的数据。它的key是HLogKey对象,HLogKey中记录了写入数据的归属信息,比如table和region的名字,还有时间戳和序列号,时间戳的值是写入的时间,而序列号的初始值是0,或者是最近一次的写入时间。

7)注意事项

row的设计和列簇的设计

二、HBase架构

架构图

1.架构解析

1)client

包含HBase的接口,并维护cache来加快对HBase的访问

2)zookeeper

保证在任意时刻,只有一个Master是在工作状态的;

并且存储了region的寻址入口;

以及HBase的shcame和表的元数据;

它还有一个作用就是实时的监控者region server的上线和下线状态,并通知给Master,就像个秘书一样。

3)Master

管理region server 的负载均衡和管理用户对表的增删改查;

在一个即使负责为regionserver分配region,以及发现失效的regionserver并重新分配region。

4)RegionServer

负责region的维护以及region的IO请求,还有即使负责将膨胀的region进行切分

5)Region

<1>介绍

先介绍一下region,HBase会吧一张表分成多个区域,每个区域就是一个region,region里面保存的是某一段连续的数据,刚开始的时候就只有一个region,当随着数据的不断插入,region到达某个阀值的时候,这个region就会等分裂变为两个region随着region的不断增多,master会把它分配到不同的节点上,所以说一张表也有可能分配到不同的regionserver上。而一个region又是由多个store组成的,一个store对应的是一个列簇,这是他们之间的关系,我接着说一下store

<2>Store

Store包含了位于内存的memestore和位于磁盘的storeFile,当进行写入操作的时候,数据会先写入memstore,当memestore到达某个阀值,regionserver会启动flashcache,将memestore的数据写入到磁盘,形成一个新的storefile

<3>StoreFile

当storefile增大到一个阀值以后,系统会进行合并,在版本合并过程中,系统会进行版本合并和删除工作,合并成一个更大的storrefile;

当storefile的大小和数量都达到一个阀值以后,region会进行裂变分裂成两个相等的region,然后由master分配,实现负载均衡

<4>Memestore

Memestore的就是一个内存缓冲区,当这个缓冲区满的时候就会溢写数据到形成新的storefile,当客户端检索数据的时候,会先从memestore中检索,检索不到再到storefile中检索

<5>合并(compaction)

说架构的时候可以扯到这个上,合并是发生在写文件的时候,合并的作用 是合并小文件;清楚过期,多余的版本数据;提高读写数据的效率

<6>注意事项

region是HBase中最小的存储和负载均衡的最小单元,最小单元也就意味着分布在不同的regionserver上,而一个region由多个store组成,每个store就是一个列簇,每个store又是由一个memstore和0个或者多个storeFile组成。最终的数据是以HFile的格式存储在HDFS上的,最终数据就是storeFile

三、HBase优化

1.热点问题优化

1)热点现象以及原因

热点问题是指客户端的大量的访问并只在一个节点上访问,这是热点问 题。产生的原因主要是因为大量相似的rowkey都在一个节点上

解决方案

· 有一种解决方案是加盐,这所谓的加盐,是在row key前面加上随机数, 让rowkey之间的差异化变大,至于加多少个随机数就要看你想要分到多少个region了。加盐以后的rowkey就会根据随机生成的前缀分配到不同region上去,避免热点问题。这是加盐

· 将rowkey进行反转也能解决热点问题,虽然这样可以解决热点问题,但是也牺牲了rowkey的有序性

· 使用哈希也可以解决这个问题,将哈希作为rowkey的前缀。

2)表设计

<1>预分区

HBase默认建表的时候只有一个region,在数据写入时,只会往这一个中写入,这就有两个问题,第一个数据都往一个region上写,会有热点问题,第二个当region足够大的时候要进行切分,会消耗集群的IO资源。我们在建表的时候添加一些空的region来预防这两个问题,创建包含预分区表的命令如下:

> create 't1', 'cf', SPLITS => ['20150501000000000', '20150515000000000', '20150601000000000']

<2>rowkey的设计

唯一性;rowkey默认字典升序排序;越短越好,定长;散列;取反;Hash;根据实际的业务来

<3>clumn family的设计

一张表中最多不要定义超过三个,一般一个就行。这么做是因为,如果在有多个列簇的情况下,其中一个flush的时候,它邻近的列簇因为关联效应也会flush,最终导致系统产生更多的IO。还有就是当region到达阀值的时候,要进行裂变了,假设这个region中有两个列簇,一个列簇100000行数据,一个100行数据,这样就会导致100的列同样被分到多个region中,当查询的时候效率会变低

<4>参数优化

设置表在regionserver缓存:In Memory HClumnDiscriptor.setInMemory(true)

设置表的最大版本数:Max VersionsHClumnDiscriptor.setMaxVersions(int versions)

设置表的存储时间:Time To Live HClumnDiscriptor.setTimeToLive(int TimeToLive)

<5>compation

HBase为了防止被刷到磁盘的memorstore的文件太小和过多,以及为了整合storeFile,以保证查询效率,HBase在必要的时候会进行合并,这个过程叫做compation

分类

minor conpaction:minor conpaction的作用是将小文件进行合并优化建议(按照实际需求修改下列参数)

· hbase.hstore.compaction.min :默认值为 3 ,表示一次minor compaction中最少选取3个store file. minor compaction才会启动

· hbase.hstore.compaction.max 默认值为10,表示一次minor compaction中最多选取10个store file

· hbase.hstore.compaction.min.size 表示文件大小小于该值的store file 一定会加入到minor compaction的store file中

·hbase.hstore.compaction.max.size 表示文件大小大于该值的store file 一定会被minor compaction排除

·hbase.hstore.compaction.ratio 将store file 按照文件年龄排序(older to younger),minor compaction总是从older store file开始选择

major compaction: major compaction试讲所有的storeFile合并成一个大的storeFile

major compaction触发条件

major compact命令

major compact()API

region Server自动运行

优化建议是将系统的默认启动改为手动启动

3)写表优化

<1>多table并发写

创建多个HTable客户端用于写操作,提高写数据的吞吐

<2>参数设置

· 关闭自动Flush:将这个参数HTable.setAutoFlush(false)设置为false以后,系统就不用一条数据一更新了,而是等客户端的缓存满了以后再更新,这样就 大大减少了flush的次数

· 设置写数据的缓存大小:将HTable.setWriteBufferSize(WriteBufferSize)这个参数的值设置为实际要写入数量的值,如果实际写入Buffer中的数据量大于这个值的时候,buffer就会将数据flush到服务端。

4)读表优化

<1>多table并发读

创建多个HTable客户端用于读操作,提高读数据的吞吐量

<2>HTabke参数设置

· Scanner Caching:将HBase.Client.Scanner.Caching这个参数设置为一个合理的值,可以减少Scann过程中next()的时间开销,它的代价就是需要客户端通过内存来维持这些cashe 的行为记录

· Scan Attribute Selection:将scan.addColumn("cf1".getBytes(), "name".getBytes());指定列簇来读取,可以减少网络传输的数据量

· Close ResultScanner:释放资源scan取完数据后,要关闭ResultScanner来释放资源再就是使用安全的HTbalePool因为HTbalePool可以自动创建HTble对象,这就解决HTbale线程不安全的的问题还有HTablePool和HTbale是公用的congfiguration连接的,可以减少网络开销再就是使用安全的HTbalePool

四、HBase读写流程

1.写流程

1)Client端先访问zookeeper,通过mate表获取region的信息,并且读取meta表中的数据根据nameSpace、表名和rowkey在mate表中找到对应的region信息接着通过这个region,找到对应的regionserver

2)把数据分写在memostore和Hlog上一份,这么做是为了防止memostore中的数据丢失,可以使用Hlog来恢复

3)我们都知道数据写入的时候会先写入位于内存的memstore,当到达memstore存储的80%的时候,memstore会溢写到磁盘,成为一个新的shtoreFile文件,我们也都知道当storeFile文件到达一定阀值的时候,系统会进行一次合并,将小的storeFile文件合并成一个大的StoreFile文件,当storeFile文件的大小和数量都到达一个阀值的收,当前region就会等分裂变为两个region,接着通过master分配到对应 的regionserver上去。

2.读流程

1)client先访问zookeeper,通过meta表获取region信息,并且读取mate表中的数据

2)接着在通过namespace、表名以及rowkey在mate表中获取对应的region信息通过这个region信息呢,找到对应的regionserver信息这样的话数据的路径就知道了,接着我们就通过这个路径找到对应的rergion

3)读取的时候是先去memstore查找,如果没有的再去storeFile中查找,这么做是因为系统设置的就是这么做

hbase 二进制数据写入_HBase总结相关推荐

  1. hbase 二进制数据写入_Hbase对于大对象存储的三种主要解决方案

    本帖最后由 非鱼 于 2015-4-29 12:23 编辑 方案1:HBase自身的大对象存储方案 由于HBase底层数据都是以Bytes数组来存储,对于非结构化数据的大对象可以很容易的转成Bytes ...

  2. hbase 二进制数据写入_分布式数据库HBase的架构设计详解(有彩蛋)

    原标题:分布式数据库HBase的架构设计详解(有彩蛋) 本文根据DBAplus社群第99期线上分享整理而成,文末还有好书送哦~ 讲师介绍 陈鸿威 云财经大数据CTO 曾任百度高级工程师,现主持设计开发 ...

  3. hbase 二进制数据写入_linux 写入二进制文件内容

    {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...

  4. hbase集群 数据写入_Hbase实用技巧:全量+增量数据的迁移方法

    摘要:本文介绍了一种Hbase迁移的方法,可以在一些特定场景下运用. 背景 在Hbase使用过程中,使用的Hbase集群经常会因为某些原因需要数据迁移.大多数情况下,可以跟用户协商用离线的方式进行迁移 ...

  5. hbase集群 数据写入_HBase架构与原理详解

    一.概述 HBase是基于列式存储的分布式数据库,底层存储采用的是LSM树,是Hadoop生态下核心技术之一. 1.1 架构图 1.2 组件介绍 HBase由三种类型的服务器以主从模式构成: Regi ...

  6. hbase集群 数据写入_HBase神器 | BDSHBase集群之间数据迁移同步的利器

    BDS定位 BDS针对开源HBase目前存在的同步迁移痛点,自主研发的一套数据迁移的平台,用于HBase集群的无缝迁移.主备容灾.异地多活.在线离线业务分离.HBase数据归档.对接RDS实时增量数据 ...

  7. SpringBoot整合HBase将数据写入Docker中的HBase

    在之前的项目里,docker容器中已经运行了HBase,现将API操作HBase实现数据的增删改查 通过SpringBoot整合Hbase是一个很好的选择 首先打开IDEA,创建项目(project) ...

  8. ofstream文件输出流把二进制数据写入文件

    1.添加头文件 #include <fstream> #include <sstream>using namespace std; 2.执行文件打开写入关闭操作 //在实际应用 ...

  9. Hbase的数据切分

    Hbase数据切分 通过切分,一个region变为两个近似相同大小的子region,再通过balance机制均衡到不同 region server上,使系统资源使用更加均衡. 切分原因 数据分布不均匀 ...

  10. 通过BigExcelWriter导出包含数据和图片的excel表,涉及到sheet.createDrawingPatriarch()画图对象,涉及到url转二进制数据

    通过BigExcelWriter导出包含数据和图片的excel表,涉及到sheet.createDrawingPatriarch()画图对象,涉及到url转二进制数据 文章目录 通过BigExcelW ...

最新文章

  1. python自动发送微信公众号_使用python一步一步搭建微信公众平台(四)----将小黄鸡引入微信自动回复...
  2. java配置文件实现方式_java相关:详解Spring加载Properties配置文件的四种方式
  3. ACMNO.20 C语言-插入队列 已有一个已排好的9个元素的数组,今输入一个数要求按原来排序的规律将它插入数组中。 输入 第一行,原始数列。 第二行,需要插入的数字。
  4. Treemap and Treeset java 实现
  5. ios 静态方法是否能被重写_小米新系统亮相,比苹果iOS更干净,21款手机支持升级...
  6. 设置树莓派开机自动运行代码
  7. javaweb学习总结(七)——HttpServletResponse对象(一)
  8. viewport实现html页面动态缩放/meta viewport/viewport
  9. 【Linux网络编程】浅谈 TCP 三次握手和四次挥手
  10. 异步编程异常和死锁处理
  11. 最大流自用模板(例题:HDU1532)
  12. python开发技术文档范文_程序员编写技术文档的新手指南
  13. 计算机网络学习socket--day3
  14. CTF Just Click
  15. IDEA编辑页面html jsp js java无法即时生效
  16. 第01章 golang语言
  17. 【大数据】大数据平台技术方案及案例
  18. android手机如何加速,小技巧:如何给Android手机上的Chrome浏览器加速
  19. linux推送打印机脚本,共享Linux 打印机给Windows
  20. 诺贝尔经济学奖计算机,诺贝尔经济学奖获得者克鲁格曼曾经指出:在经历数千年之后,现代社会运用大型计算机,对成千上万的因素进行...

热门文章

  1. java语言的一些小语法
  2. 数据可视化历史上的“人肉里程碑”
  3. 【VScode】使用VScode来写markdown ② 流程图
  4. 对*.ini文件的增删改查
  5. PIC24 通过USB在线升级 -- USB HID bootloader
  6. Vbox导入已经安装好的Redhat系统 重启网卡 提示 “Device eth0 does not seem to be present, delaying initialization.”...
  7. httpd-2.2部署Discuz!论坛系统、wordpress博客系统和phpMyAdmin程序
  8. 区块链应用 | 区块链火了,这到底是虚火还是实火?
  9. react-router使用总结
  10. eclipse中MAVEN的web项目部署至TOMCAT的步骤