`
weitao1026
  • 浏览: 1053077 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Hbase写数据,存数据,读数据的详细过程

 
阅读更多

Client写入 -> 存入MemStore,一直到MemStore满 -> Flush成一个StoreFile,直至增长到一定阈值 -> 出发Compact合并操作 -> 多个StoreFile合并成一个StoreFile,同时进行版本合并和数据删除 -> 当StoreFiles Compact后,逐步形成越来越大的StoreFile -> 单个StoreFile大小超过一定阈值后,触发Split操作,把当前Region Split成2个Region,Region会下线,新Split出的2个孩子Region会被HMaster分配到相应的HRegionServer 上。


Hbase写数据和存数据的过程

<ignore_js_op><iframe id="iframe_0.20402640171035413" style="border: medium; border-image: none; width: 603px; height: 389px;" src="data:text/html;charset=utf8,%3Cimg%20id=%22img%22%20src=%22http://www.aboutyun.com/data/attachment/forum/201412/28/133846gvccfx6v2gixfbzr.jpg?_=5118545%22%20style=%22border:none;max-width:1151px%22%3E%3Cscript%3Ewindow.onload%20=%20function%20()%20%7Bvar%20img%20=%20document.getElementById('img');%20window.parent.postMessage(%7BiframeId:'iframe_0.20402640171035413',width:img.width,height:img.height%7D,%20'http://www.cnblogs.com');%7D%3C/script%3E" frameborder="0" scrolling="no"></iframe> 

 

Client写入 -> 存入MemStore,一直到MemStore满 -> Flush成一个StoreFile,直至增长到一定阈值 -> 出发Compact合并操作 -> 多个StoreFile合并成一个StoreFile,同时进行版本合并和数据删除 -> 当StoreFiles Compact后,逐步形成越来越大的StoreFile -> 单个StoreFile大小超过一定阈值后,触发Split操作,把当前Region Split成2个Region,Region会下线,新Split出的2个孩子Region会被HMaster分配到相应的HRegionServer 上,使得原先1个Region的压力得以分流到2个Region上由此过程可知,HBase只是增加数据,有所得更新和删除操作,都是在Compact阶段做的,所以,用户写操作只需要进入到内存即可立即返回,从而保证I/O高性能。

对上述流程的补充:

补充1:HStore存储是HBase存储的核心,其中由两部分组成,一部分是MemStore,一部分是StoreFiles。
补充2:HLog的功能:
在分布式系统环境中,无法避免系统出错或者宕机,一旦HRegionServer以外退出,
MemStore中的内存数据就会丢失,引入HLog就是防止这种情况。
工作机制:每 个HRegionServer中都会有一个HLog对象,HLog是一个实现Write Ahead Log的类,每次用户操作写入Memstore的同时,也会写一份数据到HLog文件,HLog文件定期会滚动出新,并删除旧的文件(已持久化到 StoreFile中的数据)。当HRegionServer意外终止后,HMaster会通过Zookeeper感知,HMaster首先处理遗留的 HLog文件,将不同region的log数据拆分,分别放到相应region目录下,然后再将失效的region(带有刚刚拆分的log)重新分配,领取到这些region的 HRegionServer在Load Region的过程中,会发现有历史HLog需要处理,因此会Replay HLog中的数据到MemStore中,然后flush到StoreFiles,完成数据恢复。
补充3:Region就是StoreFiles,StoreFiles里由HFile构成,Hfile里由hbase的data块构成,一个data块里面又有很多keyvalue对,每个keyvalue里存了我们需要的值。
补充4:
<ignore_js_op><iframe id="iframe_0.8811067102597507" style="border: medium; border-image: none; width: 432px; height: 232px;" src="data:text/html;charset=utf8,%3Cimg%20id=%22img%22%20src=%22http://www.aboutyun.com/data/attachment/forum/201412/28/133844f93esoatjdw1y8t9.png?_=5118545%22%20style=%22border:none;max-width:1151px%22%3E%3Cscript%3Ewindow.onload%20=%20function%20()%20%7Bvar%20img%20=%20document.getElementById('img');%20window.parent.postMessage(%7BiframeId:'iframe_0.8811067102597507',width:img.width,height:img.height%7D,%20'http://www.cnblogs.com');%7D%3C/script%3E" frameborder="0" scrolling="no"></iframe> 
我们观察上面这一幅图:
一 张表,有两个列族(红颜色的一个,黄颜色的一个),一个列族有两个列,从图中可以看出,这就是列式数据库的最大特点,同一个列族的数据在在一起的,我们还 发现如果是有多个版本,同时也会存多个版本。最后我们还发现里面存了这样的值:r1:键值,cf1:列族的名字,c1:列明。t1:版本号,value值 (最后一幅图说明的是value值可以存放的位置)。通过这样的看法,我们发现如果我们设计表的时候把这几个东西:r1:键值,cf1:列族的名 字,c1:列明的名字取短一点是不是我们会省出好多存储的空间!
还有,我们从这一幅图中还应该得到这样的认识
我 们看倒数第二张图,字段筛选的效率从左到右明显下降,所以在keyvalue的设计时用户可以考虑把一些重要的筛选信息左移到合适的位置,从而在不改变数 据量的情况下,提高查询性能。那么简单的说就是用户应当尽量把查询维度或信息存储在行健中,因为它筛选数据的效率最高。
得到上面的认识后,我们应该还要会有这样的觉悟
HBase 的数据存储时会被有顺序的存储到一个特定的范围,因为我们存储的时候一般都是按顺序的,所以会一直存到同一个region上,由于一个region只能由 一个服务器管理,这样我们老是添加到同一个region上,会造成读写热点,从而使集群性能下降。那么解决这个的办法还是有的,我能想到的就是,比如我们 有9台服务器,那么我们就回去当前时间,然后摸9,加到行健前缀,这样就会被平均的分到不同的region服务器上了,这样带来的好处是,因为相连的数据 都分布到不同的服务器上了,用户可以多线程并行的读取数据,这样查询的吞吐量会提高。
关于我们版本的控制,我们要么就让多台服务器上的时间都同步,要么干脆就在put插入数据的时候,就设置一个客户端的时间戳来代替。(因为我们要是不显示的添加,人家就给我们在自己的服务器上添加了自己的时间了。)
补充5:
设 计表的时候,有两种设计方式,一种是高表设计,一种是胖表设计。根据HBase的拆分规则,我们的高表设计更容易拆分(使用组合键),不过,如果我们设计 成胖表,而我们的这个胖里的数据需要经常修改,这样设计是很合理的,因为我们的HBase保证了行级的原子性,如果设计成高表,反而就不合适了,因为不能 保证跨行的原子性。
补充6:
写缓存
每 一个put的操作实际上是RPC的操作,它将客户端的数据传送到服务器然后返回,这只适合小数据量的操作,如果有个应用程序需要每秒存储上千行数据到 HBase表中,这样处理就不太合适了。HBase的API配备了一个客户端的写缓冲区,缓冲区负责收集put操作,然后调用RPC操作一次性将put送 往服务器。默认情况下,客户端缓冲区是禁止的。可以通过自动刷写设置为FALSE来激活缓冲区。 table.setAutoFlush(false);void flushCommits () throws IOException这个方法是强制 将数据写到服务器。用户还可以根据下面的方法来配置客户端写缓冲区的大小。 void setWritaeBufferSize(long writeBufferSize) throws IOException;默认大小是 2MB,这个也是适中的,一般用户插入的数据不大,不过如果你插入的数据大的话,可能要考虑增大这个值。从而允许客户端更高效地一定数量的数据组成一组通 过一次RPC请求来执行。给每个用户的HTable设置一个写缓冲区也是一件麻烦的事,为了避免麻烦,用户可以在
Hbase-site.xml中给用户设置一个较大的预设值。
  1. <property>
  2. <name>hbase.client.write.buffer</name>
  3. <value>20971520</value>
  4. </property>
复制代码


补充7:
hbase支持大量的算法,并且支持列族级别以上的压缩算法,除非有特殊原因,不然我们应该尽量使用压缩,压缩通常会带来较好的 性能。通过一些测试,我们推荐使用SNAPPY这种算法来进行我们hbase的压缩。





Hbase读数据:

client->zookeeper->.ROOT->.META-> 用户数据表zookeeper记录了.ROOT的路径信息(root只有一个region),.ROOT里记录了.META的region信息, (.META可能有多个region),.META里面记录了region的信息。
补充1:
在 HBase中,所有的存储文件都被划分成了若干个小存储块,这些小存储块在get或scan操作时会加载到内存中,他们类似于RDBMS中的存储单元页。 这个参数的默认大小是64K。通过以上方式设置:void setBlocksize(int s);(HBase中Hfile的默认大小就是64K跟 HDFS的块是64M没关系)HBase顺序地读取一个数据块到内存缓存中,其读取相邻的数据时就可以再内存中读取而不需要从磁盘中再次读取,有效地减少 了磁盘I/O的次数。这个参数默认为TRUE,这意味着每次读取的块都会缓存到内存中。但是,如果用户顺序读取某个特定的列族,最好将这个属性设置为 FALSE,从而禁止使用缓存快。上面这样描述的原因:如果我们访问特定的列族,但是我们还是启用了这个功能,这个时候我们的机制会把我们其它不需要的列 族的数据也加载到了内存中,增加了我们的负担,我们使用的条件是,我们获取相邻数据。 void setBlockCacheEnabled(boolean blockCacheEnable);
补充2:
1:禁止自动刷写。
我们有大批数据要插入时,如果我们没有禁止,Put实例会被逐个的传送到regio服务器
,如果用户禁止了自动刷写的功能,put操作会在写缓冲区被填满时才会被送出。
2:使用扫描缓存。
如果HBase被用作一个mapreduce作业的输入源,请最好将作为mapreduce作业输入扫描
器实例的缓存用setCaching()方法设置为比默认值1更大的数。使用默认值意味着map
任务会在处理每条记录时都请求region服务器。不过,这个值要是500的话,则一次
可传送500条数据到客户端进行处理,当然了这数据也是根据你的情况定的。
这个是行级的,在我们的119页有说明。
3:限定扫描范围。
这个是很好理解的,比如我们要处理大量行(特别是作为mapreduce的输入源),其中
用到scan的时候我们有Scan.addFamily();的方法,这个时候我们如果只是需要到
这个列族中的几个列,那么我们一定要精确。因为过多的列会导致效率的损失。
4:关闭resultScanner
当然了这个不能提高我们的效率,但是如果没关就会对效率有影响。
5:块缓存的用法
首先我们的块缓存是通过Scan.setCacheBolcks();的启动的,那些被频繁访问的行
我们应该使用缓存块,但是mapreduce作业使用扫描大量的行,我们就不该使用这个
了。(这个块缓存跟我在第四节中提到的那个块是不一样的)。
6:优化获取行健的方式
当然用这个的前提是,我们只需要表中的行健时,才能用。那么怎么用在411页有说明。
7:关闭Put上的WAL
书上是这么说,但是我个人觉得这个功能还是不用的好,因为我们关闭了这个功能,
服务器就不会把put写入到WAL,而是直接写到memstore里,这样一旦服务器出现故障
我们的数据就丢失了。
分享到:
评论

相关推荐

    hbase读取数据过程

    HBASE的一个读取数据流程的解析,清晰的画出整个过程,十分有利于理解

    hbase数据可视化系统

    《HBase数据可视化系统构建详解》 在大数据领域,HBase作为一款分布式列式数据库,因其高并发、低延迟和大规模存储的特点,被广泛应用在实时数据处理和分析中。然而,对于非技术人员来说,直接操作HBase命令行进行...

    hbase备份和数据恢复

    也可以使用HBaseSerDe来解析HBase数据。 三、HBase和HDFS互导 1. HBase到HDFS:可以通过HBase的Export工具,将HBase表的数据导出到HDFS文件,然后进行进一步处理或备份。 2. HDFS到HBase:可以使用HBase的Import...

    java操作Hbase之从Hbase中读取数据写入hdfs中源码

    接下来,我们要将读取到的HBase数据写入HDFS。Hadoop提供了`FileSystem`类来操作HDFS,我们可以使用`FSDataOutputStream`来写入文件。以下是一个简单的示例: ```java import org.apache.hadoop.conf.Configuration...

    kettle集群搭建以及使用kettle将mysql数据转换为Hbase数据

    通过本文的介绍,我们了解了Kettle集群的基本概念、搭建步骤以及如何使用Kettle将MySQL数据转换为HBase数据的过程。Kettle作为一款强大的数据集成工具,在企业级数据处理中扮演着重要的角色,尤其是在大数据时代背景...

    Hadoop数据迁移--从Hadoop向HBase载入数据

    HBase是一个基于Hadoop的分布式数据库,它主要用于随机实时读/写访问超大表,适用于存储半结构化或非结构化稀疏数据。在Hadoop数据迁移过程中,从Hadoop向HBase载入数据是常见的操作。 数据迁移主要分为两个步骤: ...

    hbase和hadoop数据块损坏处理

    HBase 和 Hadoop 数据块损坏处理 HBase 和 Hadoop 数据块损坏是非常常见的问题,可能会导致数据丢失、集群崩溃等严重后果。因此,了解如何处理 HBase 和 Hadoop 数据块损坏是非常重要的。本文将介绍 HBase 和 ...

    HBase海量数据存储实战视频教程

    手把手视频详细讲解项目开发全过程,需要的小伙伴自行百度网盘下载,链接见附件,永久有效。 课程简介 从HBase的集群搭建、HBaseshell操作、java编程、架构、原理、涉及的数据结构,并且结合陌陌海量消息存储案例来...

    hbase海量数据的全量导入方法

    #### HBase数据结构与Hadoop生态集成 HBase基于Hadoop框架构建,其底层存储依赖于HDFS(Hadoop Distributed File System),而计算层则利用了MapReduce引擎。HBase的核心数据结构是HStore,它负责存储数据并处理...

    Hbase同步数据到Solr的方案

    为了实现HBase到Solr的数据同步,我们可以使用HBase Indexer,这是一个由NGDATA开发的开源项目,它简化了这个过程,避免了手动编写同步代码的需求,从而减少了开发工作量和并发环境下的性能问题。在CDH 5.0.2版本中...

    基于Django LayUI HBase的文献数据挖掘系统.zip

    《基于Django、LayUI和HBase的文献数据挖掘系统》 在信息化时代,数据挖掘已经成为科研和商业领域的重要工具,它可以帮助我们从海量的数据中发现有价值的信息和模式。本项目“基于Django LayUI HBase的文献数据挖掘...

    读写HBase数据.pdf

    下面将详细介绍如何使用Spark及pyspark进行HBase数据的读写,以及HBase的安装配置。 首先,要进行HBase的安装与配置。这通常包括以下几个步骤: 1. 将HBase安装包上传到服务器(如Ubuntu)上,并解压缩。将其移动...

    python 连接hbase 打印数据

    python 连接hbase 打印数据。hbase 的一些源数据未转化

    浅谈HBASE数据结构设计.pdf

    HBase数据结构设计知识梳理: 1. HBase概述 HBase是Apache Software Foundation旗下的一个开源的非关系型分布式数据库(NoSQL),它是Google Bigtable的开源实现,基于Hadoop文件系统(HDFS)构建。HBase的设计目标...

    HBase写性能优化策略

    然而,随着数据量和访问量的增加,如何对HBase的写性能进行优化成为一个重要的议题。本文旨在提供一系列优化策略,以提高HBase的写入效率和数据写入的稳定性。 首先,要理解HBase写入数据的基本流程:数据首先顺序...

    基于HBase的矢量空间数据分布式存储研究.pdf

    在深入研究HBase的存储模型后,本文对HBase的逻辑模型和物理模型进行了详细介绍。HBase的逻辑模型由行键、列族和时间戳组成,每一行数据由一个唯一的行键标识,而数据则按列族存储。HBase的物理模型则是在底层分布式...

    java解决hive快速导数据到Hbase代码

    本文将详细讨论如何使用Java编程语言实现从Hive到HBase的快速数据导入方案。 首先,Hive是一个基于Hadoop的数据仓库工具,它可以将结构化的数据文件映射为一张数据库表,并提供SQL查询功能,适合大规模数据的离线...

    java 通过thrift-0.9.1读取hbase表数据

    本主题将详细探讨如何利用Java通过Thrift-0.9.1版本来读取HBase表数据。 HBase是一个基于Google Bigtable设计的开源NoSQL数据库,它构建在Hadoop之上,提供高可靠性、高性能、分布式的行存储。HBase支持实时读写,...

Global site tag (gtag.js) - Google Analytics