程序员的自我修养
Home » Apache HBase » HBase的一些基础概念

HBase的一些基础概念

2条评论4,627次浏览

关于HBase MapReduce

正确进行参数传递

MapReduce中传递参数必须通过configuration.set..()一系列函数来设置。如果通过属性来传递参数,那么必然会报空指针的错误。如下为经典错误示例:

运行的结果会是输出10和20吗?单机情况下确实如此,但是若在集群上跑,则会发现a为null,b=0。至于为什么,很简单:集群、分布式、JobTracker、TaskTracker

善用setup()和cleanup()

  • 对于需要传递的参数,最好在setup()中进行初始化,不要在map()中频繁的获取
  • setup()和cleanup()也可以进行输出,输出的内容同样会经过排序,并不会因为从setup()中输出而排在最前面,也不会因为从cleanup()输出而排在最后面

Scan与性能

  • 当Scan的表为输入源时,要关闭块缓存,因为输入的数据通常只会读取一次,没有缓存的必要,对于经常读取的数据则可以开启块缓存。设置方法:scan.setCacheBlocks(),false关闭,true打开
  • Scan的setCaching默认值是1,意思是每获取一行数据就需要请求一次region server。通常在MapReduce中需要将此值设置为一个较大的值,如500,1000。当然也并不是越大越好,还要考虑到响应时间、内存大小等因素
  • Scan可以结合Filter来选择数据,也可以通过addColumn、addFamily来选择特定的列和列族,对于不需要的列和列族不要添加进来,并结合Filter尽量使读出数据最小化
  • 若使用ResultScanner来遍历结果,一定要在finally中将其关闭。同样的,HTable也需要关闭

负载均衡

启动HBase MapReduce时,通常是数据分布在N个Region上就会启动N个Map。所以当数据全部在一个Region上时,就会导致实际上你的MapReduce在跑单机。且当数据都在一个region上时,数据的导入也会存在hot spot(热点)的问题。如何避免这个问题可以参考HBase表结构设计一文中关于rowkey设计的部分。这样设计的好处显而易见,既可以保证rowkey在自己的掌握范围内(指可以通过某种算法重复N次的获取到你需要的数据的rowkey),又可以有效的将数据分散开来,实现真正的集群计算。

还需要强调的一点就是HBase实现分布式是通过将Region分布在不同的机器上来实现的,Region就是最小化的分隔模块了。著名的HBase技术介绍一文中关于这块的图片和介绍是错误的。如下图:

关闭预测执行

Speculative Execution,预测执行:所谓的预测执行,就是当所有task都开始运行之后,Job Tracker会统计所有任务的平均进度,如果某个task所在的task node机器配置比较低或者CPU load很高(原因很多),导致任务执行比总体任务的平均执行要慢,此时Job Tracker会启动一个新的任务(duplicate task),原有任务和新任务(一个task会有多个attempt同时执行)哪个先执行完就把另外一个kill掉。

因为用Hadoop MapReduce操作HBase的时候,会尽量采用本地原则,即相应的task尽量使用本地的数据。而如果另起一个task,则会导致数据不在本地,凭空浪费IO和网络资源。

MapReduce任务的预测执行缺省是打开的,HBase集群一般建议在系统级关闭预测执行,除非在某种特殊情况下需要打开,此时可以每任务配置。在配置文件中设置mapred.map.tasks.speculative.execution和 mapred.reduce.tasks.speculative.execution为false。当单个任务需要打开时:conf.set("mapred.map.tasks.speculative.execution",true)即可。

关于Compaction和Split

先介绍HBase的逻辑结构:Table由多个Region组成,Region分布在不同的HRegionServer上(即分布在不同的机器上);Region由多个Store组成,每个Store保存一个列族的数据;Store由一个MemStore和多个StoreFile组成,当MemStore写满(超过某阀值)时会flush成一个StoreFile。

Compaction发生在StoreFile上;Split发生在Region上,往往将一个Region划分为两个新的Region。

Compaction

Compaction分为Minor Compaction和Major Compaction,不论何种Compaction,新生成的StoreFile都是完全重写的:

  • Minor Compaction,次紧缩:将数量较少的、相邻的、大小较小的StoreFile合并为一个StoreFile。次紧缩不会处理标记为“墓碑”(即要删除)的数据,也不会处理过期数据
  • Major Compaction,主紧缩:主紧缩会将Store内的全部StoreFile合并成为一个StoreFile。并处理墓碑数据和过期数据

Compaction发生的时机:

  1. MemStore flush时
  2. HRegionServer定期检查时
  3. 手动强制发起时:
    • HBaseAdmin客户端发起
    • CompactTool发起

Compaction发生的条件:上述的1和2处并不会都发生Compaction,只有满足一定的条件才会发生。通常是Store内的StoreFile数量超过阀值时才发生。

Compaction相关参数:

  • hbase.store.compaction.ratio:选择进行Compaction操作的文件的算法中的一个参数,默认值1.2f
  • hbase.hstore.compaction.min:每个Store进行Compaction操作的文件数量最小值,默认值2
  • hbase.hstore.compaction.max:进行次紧缩的文件数量最大值,默认值10
  • hbase.hstore.compaction.min.size:小于此大小的文件自动成为Compaction的候选者之一,默认等于hbase.hregion.memstore.flush.size
  • hbase.hstore.compaction.max.size:大于此大小的文件自动被排除在Compaction的候选者之外,默认为Long.MAX_VALUE

Split

当Region大小超过阀值时会进行Split操作。HRegionServer先将该region下线,然后Split成2个子region,并将子region加入到META元信息中,再将他们加入到原本的区域服务器中,最后汇报HMaster

Split发生的时机:

  1. MemStore flush时
  2. Compaction发生后
  3. HBaseAdmin手动强制发起

Split相关参数:

  • hbase.hregion.max.filesize:进行Split操作的Region大小阀值,默认10737418240,也就是10G

关于HBase各组件

HMaster

功能:

  • 负责对Table结构的操作,增删改查Table
  • 负责HRegionServer的负载均衡,调整region的分布
  • 负责新split出来的region的分配
  • 负责将失效的HRegionServer上的region进行重新分配

主要接口:

  • Table:createTable, modifyTable, removeTable, enable, disable...
  • ColumnFamily:addColumn, modifyColumn, removeColumn...
  • Region:move, assign, unassign...

进程:

  • LoadBalancer:负责region的负债均衡
  • CatalogJanitor:周期性的检查和整理.META.表

HRegionServer

功能:

  • 负责处理HMaster为其分配的region的IO操作
  • 负责region的split操作

接口:

  • Data:get, put, delete, next...
  • Region:splitRegion, compactRegion...

进程:

  • CompactSplitThread:检查分割并处理最小紧缩
  • MajorCompactionChecker:检查主紧缩
  • MemStoreFlusher:周期将写到内存存储的内容刷到文件存储
  • LogRoller:周期检查RegionServer的HLog

Client

主要包含访问HBase的一些接口,采用缓存region的位置信息来加快访问;通过RPC机制与HMaster和HRegionServer进行通信。

Zookeeper

  • 记录-ROOT-表的地址,是region寻址的入口
  • 当集群有多个Master启动时,保证集群中只有一个Master
  • HMaster通过Zookeeper监控HRegionServer状态

参考文档

(转载本站文章请注明作者和出处 程序员的自我修养 – SelfUp.cn ,请勿用于任何商业用途)
分类:Apache HBase
标签:
2条评论
  1. Lynda说道:

    That saves me. Thanks for being so seenbils!

  2. car insurance说道:

    Da … batranii or sa stea pe banci la taclale, noi astia mai tineri vom merge la piknik folosing mesele alea comuniste, iar in decembrie vom taia porcu’ pe masa aia de de abator sau ce dracu’ o fi …

发表评论


profile
  • 文章总数:79篇
  • 评论总数:280条
  • 分类总数:31个
  • 标签总数:44个
  • 运行时间:1130天

大家好,欢迎来到selfup.cn。

这不是一个只谈技术的博客,这里记录我成长的点点滴滴,coding、riding and everthing!

最新评论
  • 张瑞昌: 有很多,比较常见的是Jacob迭代法,一次迭代O(n^3), 迭代次数不清楚。 如果是手动算的话按照定义求就可以了
  • Anonymous: :mrgreen:
  • lc277: 你好 我想问下一般删除节点要多久,要删除的datanode大概用了 1t,解除授权已经30多小时还没完成,请问是出现什么问题了吗 麻烦告诉下谢谢 qq1844554123
  • Anonymous: 你好 我想问下一般删除节点要多久,要删除的datanode大概用了 1t,解除授权已经30多小时还没完成,请问是出现什么问题了吗
  • Anonymous: :smile: :grin: :eek:
  • 李雪璇: 想要完整代码,可以帮忙发给我吗
  • Anonymous: 请问一下,那个 user的推荐结果楼主查看了么? 为什么输入数据 最高是五分,输出结果都是7分8分啥的?怎么设置输出的分数的最 大值?
  • Anonymous: 那个 user的推荐结果楼主查看了么? 为什么输入数据 最高是五分,输出结果都是7分8分啥的?
  • Anonymous: stopGracefullyOnShutdown在yarn- client模式下我测试的无效,你的呢
  • Anonymous: 另外,import的lib包能否发个列表.
  • Anonymous: 部分程序已经无法使用, 另外 你的import代码 也应该放上来哈
  • wzq: 赞
  • 增达网: 受教了!呵呵!
  • Anonymous: :!: :smile: :oops: :grin: :eek: :shock:
  • 27: :razz: dsa会报错,rsa不会
  • Anonymous: 看错了 忽略我
  • Anonymous: UserSideCF这个类在哪里
  • 晴子: 在主节点初始化CM5数据库的时候报错误:Verifying that we can write to /opt/cm-5.9.0/etc/cloudera-scm -server log4j:ERROR Could not...
  • zhangnew: 就4题 :?:
  • linxh: “ 但要是遇到预先并不知道数组的长度而又需要获取正确的(或者称之 为原始的)split长度时,该如何处理呢。。? ” 印象中可以split函数参数传-1?