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 ...
随机推荐
- 利用python自动生成verilog模块例化模板
一.前言 初入职场,一直忙着熟悉工作,就没什么时间更新博客.今天受“利奇马”的影响,只好宅在家中,写写技术文章.芯片设计规模日益庞大,编写脚本成了芯片开发人员必要的软技能.模块端口动不动就几十上百个, ...
- IDEA+maven搭建scala开发环境(spark)(半转载)
以下内容部分来自于https://zhuanlan.zhihu.com/p/23141509,我尝试了一遍,然后添加了一些图片.. 其实我觉得在IDEA中使用scala插件然后创建project的时候 ...
- 如何搭建环境---初识mybatis
一:mybatis概念1:简介 MyBatis本是apache的一个开源项目iBatis,2010年改名为 MyBatis, MyBatis 是一个基于Java的持久层框架.( ...
- JavaScript 数组、字符串、Map、Set 方法整理
在线阅读 https://www.kancloud.cn/chenmk/web-knowledges/1080519 数组 isArray():Array.isArray(value) 用于检测变量是 ...
- java中String,StringBuffer,StringBuilder的区别
String: 1,是字符串常量,一旦创建就不能修改.对于已经存在了的String对象的修改都是重新创建一个新的对象,然后把新的值保存进去. 2,String也是final类,不能被继承. 3,而且S ...
- 如何利用jenkins插件查看allure报告-----完整篇(解决404和无数据问题)
背景: python3+appium+pytest+allure写了安卓的自动化脚本,在windows本机pycharm上跑通过后生成了allure报告. 公司jenkins搭建在linux服务器上 ...
- spring-boot-plus运维部署(八)
spring-boot-plus运维部署 线上部署 打包环境为prod mvn clean package -Pprod 打包后的目录 cd target/spring-boot-plus-1.2.0 ...
- 第 10 篇:小细节 Markdown 文章自动生成目录,提升阅读体验
目录 在文中插入目录 在页面的任何地方插入目录 处理空目录 美化标题的锚点 URL 作者:HelloGitHub-追梦人物 文中涉及的示例代码,已同步更新到 HelloGitHub-Team 仓库 上 ...
- Vue+springboot管理系统
About 此项目是vue+element-ui 快速开发的物资管理系统,后台用的java springBoot 所有数据都是从服务器实时获取的数据,具有登陆,注册,对数据进行管理,打印数据等功能 说 ...
- 关于原生js中函数的三种角色和jQuery源码解析
原生js中的函数有三种角色: 分两大种: 1.函数(最主要的角色)2.普通对象(辅助角色):函数也可以像对象一样设置属于本身的私有属性和方法,这些东西和实例或者私有变量没有关系两种角色直接没有必然的关 ...