hbase基本概念,
说在前面,本文部分内容来源于社区官网经过适度翻译,部分根据经验总结,部分是抄袭网络博文,(不一一列举引用,在此致歉)一并列在一起,本文的目的,希望能总结出一些有用的,应该注意到的东西,基本思路是先提出一个话题,在此话题内,把相关联的东西加进去,而不是单独分出章节单独介绍,虽然条理性欠差,但有利于后期根据关键词查找。Apache HBase 是Hadoop database的简称,hbase 是一个分布式,可扩展的,面向大数据存储的数据库。 HBase 基本概念 1、region region 是部分数据,所以是所有数据的一个自己,但region包括完整的行,所以region 是行为单位 表的一个子集。 每个region 有三个主要要素:
-
- 它所属于哪张表
- 它所包含的的第一行(第一个region 没有首行)
- 他所包含的最后一行(末一个region 没有末行)
4、访问流程
-
- 客户端client 首先连接到ZooKeeper 这是就要先查找-ROOT-的位置。
- 然后client通过-ROOT- 获取所请求行所在范围 所属的.META.region的位置。
- client接着查找.META.region来获取user-space region 所在的节点和位置。
- 接着client 就可以直接和管理者那个region的RegionServer 进行交互。
-
- mapred.map.max.attempts map 任务最大尝试次数 默认是4
- mapred.reduce.max.attempts reduce 任务最大尝试次数 默认是4
-
- 保证任何时候,集群中只有一个master
- 存贮所有Region的寻址入口。
- 实时监控RegionServer的状态,将Region server的上线和下线信息实时通知给Master
- 存储Hbase的schema,包括有哪些table,每个table有哪些column family
6、Hmaster 上面说了,Zookeeper避免了HMaster的单点问题,一个Hbase集群可以启动多个HMaster,而Zookeeper通过Election的方式保证集群中只有一个HMaster处于live的状态 其它都处于休眠的状态,如果HMaster出现问题,则Zookeeper 则唤醒其它休眠的HMaster。 HMaster 在功能上主要负责哪些工作呢? 1、管理用户对Table的增、删、改、查操作 2、管理RegionServer的负载均衡、调整Region的分布 3、在Region Split后,将新Region分布到不同的RegionServer。 4、在RegionServer宕机后,那该RegionServer上所管理的Region 由HMaster进行重新分配。 总结HMaster 的主要任务:1、HTable DDL 操作 2、Region 分配工作。 其余的基本上都是client 和RegionServer打交道来完成的。
7、HRegionServer HRegionServer 主要负责相应用户的I/O请求,进而跟HDFS交互,从HDFS中读写数据,虽然每个进程都很重要,但个人认为HRegionServer是HBase中最核心的进程。 下面对HRegionServer的内部结构做一个简单描述: HRegionServer 内部管理了一系列的HRegion对象,HRegion和Region是一回事吗?其实HRegion对应了Table中的一个Region,HRegion是对其进行的封装。每个HRegion 中由多个HStore组成。 HStore则对应Table中的Column Family,不论此Column Family 内部有多少数据,都会创建一个新的HStore,因此将相同属性的数据放进相同的Column Family 很有 必要,避免一次访问,访问多个HStore,性能低下。而HStore 则是HBase的核心的存储单元了,而HStore 由两个部分组成,一时MemStore,再就是StoreFile MemStore 是Sorted Memory Buffer ,client 写入的数据先写入MemStore,当达到MemStore的阀值时,将其Flush 成为一个StoreFile(HFile),StoreFile 则是存储在硬盘上的 文件,具体这个阀值时多少? hbase.hregion.memstore.flush.size 这个参数表示每个MemStore的大小,当然系统默认是134217728 bytes 也就是128M,这个参数需考虑每个RS负担的Region个数。 这个参数的作用是当单个Region内所有的memstore大小总和超过指定值时,flush该region的所有memstore。RegionServer的flush是通过将请求添加一个队列,模拟生产 消费模式来异步处理的。那这里就有一个问题,当队列来不及消费,产生大量积压请求时,可能会导致内存陡增,最坏的情况是触发OOM。 上面说到,当该Region下所有的MemStore 之和超过指定值时,就触发flush,而前面又说了在一个Region下 每个Column Family 一个HStore ,那多个Column Family 这样 问题出来了,如果一个HStore数据量大,而另外一个HStore 仅有几条数据,会同时 flush吗? 对,这就说明了一个问题,在Hbase表设计的时候尽量设置单一ColumnFamily的 表,否则Hbase不能很好的处理上面类似的问题。 除了上面的参数还有两个参数 hbase.regionserver.global.memstore.upperLimit 默认 0.4 也就是40% 为了防止MemStore占用总内存过大,当RegionServer所有Region达到总heap内存的40%,Hbase会Block所有的更新,来flush所有的MemStore,并释 放MemStore占用的内存 hbase.regionserver.global.memstore.lowerLimit 默认是 0.35 也就是 35% 这个参数表示,当该RegionServer 下所有的MemStore达到 总Heap 内存的35%时,触发flush个别占用内存大的MemStore,这是会做block,写更新还 是会收影响。
8、HBase数据存储 1、HBase中所有的数据都是存放在Hadoop HDFS文件系统上,而这部分文件包括两种文件类型: 一是HFile Hadoop的二进制文件,实际上是StoreFile对HFile 做了一个轻量级包装,所以StoreFile 的底层就是Hfile。 二是HLog File 也就是HBase的WAL (Write Ahead Log),实际上在hadoop内部以Sequence File 的形式存在。什么是Sequence File 会在后面的Hadop章节中做介绍,现在 了解它是一个由二进制序列化过的key/value的字节流组成的文本存储文件。 下面是HFile 的存储格式,也是官方的一个图。 再把第二张图贴出来: 结合上面两张图看,更加直观,第一张图是HFile 文件的格式,下面图是其中Data Block 中KeyValue的 详细结构,如果第一张图相当于分子的话,那第二张就是原子,最小的不可再分的。 看第一张:HFile文件是不定长的,订场的只有其中两块 FileInfo 和 Trailer 分别存储文件的Meta信息,比如AVG_KEY_LEN,LAST_KEY,COMPARATOR,MAX_SEQ_ID_KEY等信息,Data Index 和 Meta Index 分别记载了每个Data块和Meta块的起始点。Data Block 是 HBase I/O的基本单元,这看到了 Region 最后也是到了Block,不过这个Block是可以手动设置的。 比如:create 'newtable',{NAME=>'info',BLOCKSIZE=>'131072'},我就是将Family info 的BlockSize 设置为132072 就是是128M 默认是65536 也就是64M刚好和hadoop的hdfs block 也就是dfs.block.size 默认也是64M 是一样的?对吗?错误,Hbase 列族Data Block size 是 65536字节 也就是64k 是hdfs block size的 1/1024,这地方和Hdfs是一个区别,采用这么细粒度,目的在块操作 时更有效的加载和缓存数据,它不依赖于HDFS 块的尺寸设计,而仅仅属于hbase内部的一个属性,而HDFS把块设计成64M是方便MapReduce时使用. 下面再把Data 打开看看它内部有些什么东西,Magic 和繁多的KeyValue. Magic内容就是一些随机数字,目的是防止数据损坏,而KeyValue 再次放大 看第二张图,KeyValue的结构图: 开始是两个固定长度的数值,分别表示Key的长度和Value的长度。紧接着是Key,开始是固定长度的数值,表示RowKey的长度,紧接着是RowKey,然后是固定长度的数值,表示 Family的长度,然后是Family,接着是Qualifier,然后是两个固定长度的数值,表示Time Stamp和Key Type(Put/Delete)。Value部分没有这么复杂的结构,就是纯粹的二进制数据。 HLog File 机构不做详细的说明了,是SequenceFile 文件,仅做一下HLogFile是如果工作的介绍一下: Client 想Hbase 写数据的时候,会同时写MemStore 和 HLog ,当间隔一定的时间,MemStore 永久存储到硬盘中了,也就是由MemStore flush成storeFile 了,那这部分Hlog就会删除 但是,当MemStore还没写到硬盘中时,RegionServer 突然挂了怎么办?那这时HMaster 该粉墨登场了,它会将Hlog 根据分配到不同的region中,并将挂了的RegionServer 下的Region重 新分配到新的RegionServer,当RegionServer Load Region的时候,发现有为处理的HLog,那就通过Replay log的方式写入到MemStore 中,完成数据恢复。
本站文章为和通数据库网友分享或者投稿,欢迎任何形式的转载,但请务必注明出处.
同时文章内容如有侵犯了您的权益,请联系QQ:970679559,我们会在尽快处理。