HBase工作中的一些优化方法
- Pre-creating Regions(预分区)
- 默认情况下,在创建Hbase表的时候会自动创建一个region分区,当导入数据的时候,所有的Hbase客户端都向这一个region写数据,直到这个region足够大了才进行切分。一种可以加快批量写入速度的方法是通过预先创建一些空的regions,这样当数据写入Hbase时,会按照region分区情况,在集群内做数据的负载均衡。
- rowkey:Hbase中rowkey用来检索表中的记录,支持一下三种方式
- 通过单个rowkey访问:即按照某个rowkey键值进行get操作
- 通过rowkey的range进行scan:通过startRowkey和endRowkey,在这个范围内进行扫描
- 全表扫描:即直接扫描整张表中所有行记录
- 在Hbase中rowkey可以是任意字符串,最大长度64K,一般为10~100bytes,一般设计为定长
- rowkey规则
- 越小越好
- rowkey的设计是要根据实际业务来
- 散列性:
- 取反
- Hash
- column family
- 不要在Hbase一张表里定义太多的column family。目前Hbase并不能很好的处理超过2~3个column family的表。因为某个column family在flush的时候,它邻近的column family也会因关联效应出发flush,最终导致系统产生更多的I/O。
- In memory:创建表时,可以通过HColumnDescriptor.setInMemory(true) 将表放到RS的缓存中,保证在读取的时候被chache命中
- Max version:创建表时,可以通过HColumnDescriptor.setMaxVersions(int maxVersions)设置表中数据的最大版本,如果只需要保存最新版本的数据,那么可以设置setMaxVersions(1)
- Time to live:创建表时,可以通过HColumnDescriptor.setTimeToLive(int timeToLive)设置表中数据的存储生命周期,国企数据将自动被删除,例如如果只需要存储最近两天的数据,那么可以设置setTimeToLive(2 * 24 * 60 * 60)
- Compact & split:
- 在Hbase中,数据在更新时首先写入WAL日志(HLog)和内存(MemStore)中,Memstore中的数据是排序的,当memstore累计到一定阀值时,就会创建一个新的Memstore,并且将老的Memstore添加到flush对了,由单独的线程flush到磁盘上,成为一个StoreFile。与此同时,系统会在zookeeper中记录一个redo point,表示这个时刻之前的变更已经持久化了(minor compact)。
- StoreFile是只读的,一旦创建后就不可以在修改。因此Hbase的更新其实是不断追加的操作。当一个store中的storeFile达到一定的阀值后,就会进行一个合并(major compact),将对同一个key的修改合并到一起,形成一个大的storeFile,当storeFile的大小达到一定阀值后,又回对storeFile进行分割(split),等分为两个storeFile。
- 由于对表的更新是不断追加的,处理读请求是,需要访问store中全部storeFile和memstore,将他们按照rowkey进行合并,由于storeFile和Memstore都是经过排序的,并且storeFile带有内存中索引,通常合并过程还是比较快的
- 实际应用中,可以考虑必要时手动进行major compact,将同一个rowkey的修改进行合并形成一个较大的storeFile。同时将storeFile设置大些,减少split的发生
- Hbase为了防止小文件(被刷到磁盘的memstore)过多,以保证查询效率,Hbase需要在必要的时候将这些小的storeFile合并成相对较大的storeFile,这个过程称之为compact。在Hbase中,主要存在两种类型的compact:minor compaction和major compaction
- minor compaction:是较小、很少文件的合并
- major compaction:将所有的storeFile合并成一个,触发major compaction的可能条件有:major_compact命令、majorCompact() API、RS自动运行(相关参数:hbase.hregion.majorcompaction 默认为24小时、hbase.hregion.majorcompaction.jetter 默认0.2、防止RS在同一时间进行major compaction)
- hbase.hregion.majorcompaction.jetter 作用:对参数hbase.hregion.majorcompaction规定的值起到浮动的作用,假如两个参数都为默认值24和0.2,那么major compact最终使用的数值为:19.2~28.8这个范围
- 关闭自动 major compaction
- 手动编程 major compaction
- minor compaction的运行机制要复杂一些,它由一下几个参数共同决定:
- hbase.hstore.compaction.min :默认值为 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开始选择
- 多个HTable并发写
- HTable参数设置
- Auto flush:HTable.setAutoFlush(false),关闭客户端的自动flush,这样可以批量写入数据到Hbase,而不是有一条put就执行一次更新,只有当put填满客户端写缓存时,才实际向Hbase服务端发起写情趣。默认auto flush是开启的
- write buffer:设置客户端的buffer大小,如果新设的buffer小于当前写buffer中的数据,buffer将会被flush到服务端
- WAL Flag
- 注意:谨慎选择关闭WAL日志,因为这样,如果RS宕机,put/delete的数据将无法根据WAL日志进行恢复
- 批量写
- 多线程并发写
- scan caching
- Hbase的conf配置文件中配置
- 通过调用HTable.setScannerCaching()进行配置
- 通过调用scan.setCaching() 进行配置
- 三者的优先级越来越高级
- 批量读
- 多线程并发读
- 缓存查询结果
- Blockcache
- Hbase上RS的内存分为两个部分,一部分作为Memstore,主要用来写,另外一部分作为BlockCache,主要用来读
- 写请求会先写入memstore,RS会给每个region提供一个memstore,当memstore满64M以后,会启动flush刷新到磁盘。当memstore的总大小超过限制时(heapsize * hbase.regionserver.global.memstore.upperlimit * 0.9),会强行启动flush进程,从最大的memstore开始flush直到低于限制
- 读请求先到memstore中查数据,查不到就到BlockCache中查,再查不到就会到磁盘上读,并把结果放入BlockCache。由于BlockCache采用LRU策略,因此BlockCache达到上线(heap size * hfile.block.cache.size * 0.85)后,会启动淘汰机制,淘汰掉最老的一批数据
- 一个RS上有一个BlockCache和N个Memstore,他们的大小和不能大于等于heapsize * 0.8,否则Hbase不能启动。默认BlockCache为0.2,memstore为0.4。对于注重读响应时间的系统,可以将BlockCache设大些,比如BlockCache=0.4,memstore=0.39,以加大缓存的命中率
HBase工作中的一些优化方法的更多相关文章
- HBase实际应用中的性能优化方法
- 制作移动端手机网站过程中的SEO优化方法技巧
据国内三大运营商数据来看,中国的手机用户数已达10亿,超过2/5的移动用户每个月都会从手机终端访问网页,如今的移动端手机网站比例肯定有提升,但是对于这些存在的移动版本网站来说,马海祥查看了很大一部分手 ...
- Android中的布局优化方法
http://blog.csdn.net/rwecho/article/details/8951009 Android开发中的布局很重要吗?那是当然.一切的显示样式都是由这个布局决定的,你说能不重要吗 ...
- hive工作中的一些优化策略
1.hive抓取策略 hive.fetch.task.conversion = more/none more不走mr,none走mr 2.explain 显示执行计划 3.设置 ...
- impala 中SQL的优化方法
1.取流水表的数据时,如果是使用全部分区数据,不能从SA层数据取数,需要改从SH层取数,因为SH层为parquet存储,查询性能较好. 2.对于脚本中使用的临时表,如果存在以下情况需要进行统计表信息 ...
- angular1中ng-repeat效率优化方法:
1.当 ng-repeat 的数组被替换时, 它默认并不会重新利用已有的 Dom 元素,而是直接将其全部删除并重新生成新的数组 Dom 元素: 2.Dom 的频繁操作是非常不友好的, ng-repea ...
- javascript中最常用的方法
平时在工作中时常需要一些方法,下面列举几个最常用的几个方法. 1. indexOf(searchvalue,fromindex) 该方法用于查找一个字符串是否包含了另一个字符串 indexOf() 方 ...
- JS单例模式在工作中的使用
为了尽可能的减少全局变量的污染,在写js的时候可以采用单例模式,形式如下: 比如有一个js叫demo.js,那么我们可以在js里这样写: var demo = {} 这样做的目的是将整个js当成一个对 ...
- Android中ListView的几种常见的优化方法
Android中的ListView应该算是布局中几种最常用的组件之一了,使用也十分方便,下面将介绍ListView几种比较常见的优化方法: 首先我们给出一个没有任何优化的Listview的Adapte ...
随机推荐
- IDEA运行报错: Maven编译错误:不再支持源选项 5。请使用 6 或更高版本
这里 记录下 这个问题的解决方案: 1:修改maven settings.xml 中的数据 这里的版本要对应现在使用的jdk版本 2:检查idea 配置 图中2块区域要一致 检查这块地方对应了自己的j ...
- Linux常用命令之权限管理
在linux中的每一个文件或目录都包含有访问权限,这些访问权限决定了谁能访问和如何访问这些文件和目录,这也让linux更安全.下面主要讲解下常用的权限命令chgrp,chmod,chown . 1.文 ...
- 使用re.split 按标点+空格的一种分割办法
import re import string t1 = re.split("["+string.punctuation+" ]","(555) 12 ...
- 完美解决迅雷极速版强制升级到迅雷X
虽然迅雷已死,但是还是软件还是有点点用的.废话不好多说,直接上解决办法: 1. 找到桌面的迅雷图标,右键选择打开文件位置; 2. 根据路径找到: 相对路径:Thunder Network\Thunde ...
- 敏捷之旅--携程Scrum Master 新官上任三把火?
随着敏捷在国内的推行,越来越多的公司和组织开始使用敏捷领导团队. 敏捷团队如雨后春笋之势涌现. 敏捷教练的团队也越来越壮大. 原先只需要一个敏捷教练就能搞定,但是随着团队越来越多,我们难免会将 ...
- python webdriver 常用元素操作
1.新建实例 xx_driver = os.path.abspath(r"路径") os.environ["webdriver.xx.driver"] = xx ...
- 写个shell脚本搭载jenkins让你的程序部署飞起来
[转载请注明]: 原文出处:https://www.cnblogs.com/jstarseven/p/11399251.html 作者:jstarseven 码字挺辛苦的..... 说明 ...
- Java 迭代接口:Iterator、ListIterator 和 Spliterator
1. 简介 当我们使用 for 或 while 循环来遍历一个集合的元素,Iterator 允许我们不用担心索引位置,甚至让我们不仅仅是遍历一个集合,同时还可以改变它.例如,你如果要删除循环中的元素, ...
- IOS系统
苹果产品以前技术是很牛逼.但是,苹果的系统是IOS系统,是一个封闭系统,就是你只看的到程序看不到文件的存储位置,相当于说他们自己的软件或者要花钱的软件才可以在闭环系统里面通过苹果视频该软件导出来,祝2 ...
- C# 读取Word内容控件
在Word中,借助内容控件,可设计出具有特定功能的文档或模板.以下表格中简单介绍了几种常用的内容控件. 名称 简介 下拉列表内容控件 下拉列表包含了一个预先定义好的列表.和组合框不同的是下拉列表不允许 ...