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

HBase的一些基础概念

2条评论4,419次浏览

关于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篇
  • 评论总数:402条
  • 分类总数:31个
  • 标签总数:44个
  • 运行时间:1013天

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

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

最新评论
  • 晴子: 在主节点初始化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?
  • linxh: 班门弄斧一下: ssh host cmd 和直接ssh上后cmd结果不一样是因为ssh直接运行远程命令 是非交互非登录模式与ssh上去得到一个登录交互式Shell二 者加载的环境变量不一样。
  • 匿名: 其实文本分类和数字分类是一样的,只是文本分类需要多一个步骤, 就是计算它的tf-idf值将其转换为double类型
  • yurnom: 可能苹果最近又改变了返回值吧,最近没做测试了。 BadDeviceToken一般测试环境和正式环境弄错的情况 下会出现。
  • Anonymous: :razz: 博主,良心贴啊, 最近也在弄apns推送。 有个问题想请教你一下啊。 你博客中写的 Unregistered 错误,有准确的说明吗, 我看你博客中写的:...
  • 一波清泉: 回复邮箱: 1004161699@qq.com 多谢
  • Anonymous: 17/02/09 01:15:02 WARN Utils: Service ‘SparkUI’ could not bind on port 4040. Attempting port...
  • pacificLee: :twisted:
  • 小码: 为什么没有后面的呢,只有前10个
  • Anonymous: :lol:
  • Anonymous: :razz: 楼主是属于会聊天的。 我想问,sqoop发了几个版本了,应该没这些问题了吧。
  • Anonymous: Config.kafkaConfig.kafkaGroupI d 这个是指自己配置的group id 还是从 import org.apache.kafka.common.config .Config 这个类...
  • Anonymous: ZkUtils.getPartitionsForTopics (zkClient, Config.kafkaConfig.topic) 那个方法是在 spark-streaming_2.10 中 kafka...
  • Anonymous: ZkUtils.getPartitionsForTopics (zkClient, Config.kafkaConfig.topic) 你确定 kafka 里面有这个类 ? 个人在kafka 最新 稳定版...
  • Anonymous: :roll:
  • Anonymous: 很不错,试问有java版的吗?
  • Anonymous: 赞
  • Anonymous: 哈哈 看楼主的吐槽乐死了 where子句是可以写的 同样找不到资料 一点点试出来的 select id from xxxx where ${CONDITIONS} and 1=1 and 2=2 limit 4