hbase 是hadoop生态圈的一员,在数据服务应用中具有举足轻重的地位,我们当然有必要掌握,hbase日常的大部分应用在数据查询服务中,因此查询的时候必然涉及到scan操作,因此在建表的时候就要对htable 进行优化,比如设置块缓存,设置过期时间等,设置保留的版本号,这些为什么如此重要?下面详细说,很多时候感觉hbase很多东西,单深入下去之后就会发现hbase设计实在太为精妙,很多东西都是具有强关联性和一致性。

HBASE 优化

  • HBASE的优化分为通用型的优化和定制型的优化,通用型的优化部分就是不针对具体的业务场景,都会有好的优化效果,定制型的优化需要结合具体的使用场景。

先说下hbase的读流程:

  1. 客户端向Zookeeper(ZK)发起请求,从ZK获取meta表中region所在的位置,根据表的信息找到对应的RegionServer(RS)信息,
  2. 首先从RS的memstore缓存中读取数据,如果存在直接返回,如果查找不到从StoreFile中查找。

hbase的写流程:

  1. 客户端向发起写请求,根据写请求类型不同,如果是修改表结构,创建或者删除表,会与HMaster(HM)交互,如果是更新或者插入操作,则会与zk交互,从ZK获取meta表中region所在的位置,从
  2. 数据会写两份,一份到memstore中,一份到Hlog中,
    1. 当memstore中的文件大小超过阈值时,会把数据flush到storefile中,当storefile中文件数超过一定数目时,会按照某种文件合并策略触发compact操作,把多个storefile合并为一个大的storefile,当形成的storefile超过region 分裂的阈值,又回出发split操作,分裂成2个小的region
    2. 当memstore数据丢失,会从hlog中恢复,同样会执行compact和split操作。

关于compact的触发时机,大家可以看下源码,也有网友分享:

HBase源码分析之compact请求发起时机、判断条件等详情(一)_大数据_辰辰爸的博客-CSDN博客​blog.csdn.net

后面我也会参照源码和自己的理解去写一篇文章,这个点很重要,面试经常问到。

现在读写流程已经分析了,那么开始讲如何优化了。

通用型的优化方法:

1.预先分区: 创建hbase表的时候自动创建多个region分区

2.rowkey优化:rowkey优化结合业务进行设计,考虑查询,

要遵循的几个原则,

  • rowkey长度越小越好,减少存储空间,提高hbase存储效率,
  • rowkey 按照字典排序存储,把经常访问的数据存放在一起,
  • 如果涉及时间的查找,rowkey需要带上时间戳的
  • 前缀加盐处理,写入性能提升,但是读性能会受到影响,主要看如何进行加盐处理(hash处理)。

3. 减少column family 数量,无论是从读和写角度,column family都不要超过2个。

关于这部分的优化,可以参考这篇文章:

HBase 优化,columnFamily和qualifierColumn的设计原则​my.oschina.net

4. 缓存策略

创建表的时候,可以通过HColumnDescriptor.setInMemory(true)将表放在RS的缓存中,保证在读取的时候被cache命中

5. 设置存储生命周期

创建表的时候,可以通过 HColumnDescriptor.setTimeToLive(int timeToLive) 设置表中数据的存储生命期,过期数据将自动被删除,但是也有负作用,这样会导致major compaction的触发,影响regionserver的性能

6. 硬盘配置合理,提供更细粒度的冗余备份,更快速的单盘故障恢复,

每台 RegionServer 管理 10~1000 个 Regions,每个 Region 在 1~2G,则每台 Server 最少要 10G,最大要 1000*2G=2TB,考虑 3 备份,则要 6TB。方案一是用 3 块 2TB 硬盘,二是用 12 块 500G 硬盘,带宽足够时,后者能提供更大的吞吐率,更细粒度的冗余备份,更快速的单盘故障恢复。

7. 分配合适的内存给RS ,在不影响其他服务的情况下,越大越好。

例如在 HBase 的 conf 目录下的 hbase-env.sh 的最后添加 export HBASE_REGIONSERVER_OPTS="-Xmx16000m $HBASE_REGIONSERVER_OPTS”

8. 写备份数

备份数与读性能成正比,与写性能成反比,

且备份数影响高可用性。有两种配置方式,一种是将 hdfs-site.xml 拷贝到 hbase 的 conf 目录下,然后在其中添加或修改配置项 dfs.replication 的值为要设置的备份数,这种修改对所有的 HBase 用户表都生效,另外一种方式,是改写 HBase 代码,让 HBase 支持针对列族设置备份数,在创建表时,设置列族备份数,默认为 3,此种备份数只对设置的列族生效。

8. 批量写,增打客户端一次从服务器拉取的数量,当然要考虑到客户端的内存大小。

1)在 HBase 的 conf 配置文件中进行配置 hbase.client.scanner.caching;

2)通过调用 HTable.setScannerCaching(int scannerCaching) 进行配置;

3)通过调用 Scan.setCaching(int caching) 进行配置。三者的优先级越来越高。

9. RegionServer 的请求处理 IO 线程数

针对不同业务查询需求,设置合理的IO线程数

较少的 IO 线程适用于处理单次请求内存消耗较高的 Big Put 场景 (大容量单次 Put 或设置了较大 cache 的 Scan,均属于 Big Put) 或 ReigonServer 的内存比较紧张的场景。

较多的 IO 线程,适用于单次请求内存消耗低,TPS 要求 (每秒事务处理量 (TransactionPerSecond)) 非常高的场景。设置该值的时候,以监控内存为主要参考。

在 hbase-site.xml 配置文件中配置项为 hbase.regionserver.handler.count。

10. Region 大小设置

再配合 RegionSplitter 这个工具,在需要 split 时,手动 split。手动 split 在灵活性和稳定性上比起自动 split 要高很多,而且管理成本增加不多,比较推荐 online 实时系统使用

其他参数优化可参考:

https://www.ibm.com/developerworks/cn/java/j-lo-HBase/index.html​www.ibm.com

定制化优化方法参考这篇文章:

HBase Rowkey 设计指南​www.iteblog.com

一般我们自己做业务,主要是预先分区,设计rowkey,调整缓存大小,加盐处理,手动split和compact尚未尝试过。

hbase scan超时设置_如何在优化生产环境的hbase相关推荐

  1. hbase scan超时设置_深入浅出HBase系列(二)

    今天来讲讲HBase读的过程: 1.HBase读过程详解 2.1影响HBase读取命令的参数 HBase读包含两种命令:get ,基于确切的RowKey去获取一行数据,通常被称之为随机点查:scan, ...

  2. hbase scan超时设置_hbase scan超时问题

    下面是异常信息: 2018-11-08 16:55:52,361 INFO [main] org.apache.hadoop.hbase.mapreduce.TableRecordReaderImpl ...

  3. hbase scan超时设置_HBase学习之路 (六)过滤器

    点击上方蓝字  关注我们 HBase学习之路 (六)过滤器 过滤器(Filter) 基础API中的查询操作在面对大量数据的时候是非常苍白的,这里Hbase提供了高级的查询方法:Filter.Filte ...

  4. 写一段代码提高内存占用_记录一次生产环境中Redis内存增长异常排查全流程!...

    点击上方 IT牧场 ,选择 置顶或者星标 技术干货每日送达 最近 DBA 反馈线上的一个 Redis 资源已经超过了预先设计时的容量,并且已经进行了两次扩容,内存增长还在持续中,希望业务方排查一下容量 ...

  5. linux ntp时间立即同步命令_记一次生产环境部署NTP服务及配置时间同步

    概述 linux服务器在提供服务时,要和其他机器进行请求的交互,实际生产环境中,可能因为时间不同步,导致了服务异常. 下面介绍下怎么部署NTP服务来解决这个问题. ps:强烈吐槽下头条这个新排版功能, ...

  6. mysql 两张大表关联_详解mysql生产环境如何快速有效的删除大表,附实验说明

    概述 我们很多时候都会去drop一些大表,特别是生产环境做操作时,这里主要提一些注意事项,仅供参考. 01 相关语法 1.删表 DROP TABLE SyntaxDROP [TEMPORARY] TA ...

  7. python 线程超时设置_爬虫基础知识(一)多线程与threading模块

    点击上方"蓝字"关注我们,第一时间推送优质文章! 前言 "本期带来的文章是python中多线程与threading模块的主要内容.主要分为「并发与并行」,「进程与线程」, ...

  8. netty socket超时设置_彻底搞懂 netty 线程模型

    编者注:Netty是Java领域有名的开源网络库,特点是高性能和高扩展性,因此很多流行的框架都是基于它来构建的,比如我们熟知的Dubbo.Rocketmq.Hadoop等.本文就netty线程模型展开 ...

  9. java webservice超时设置_[CXF]Spring下设置CXF的WebService客户端超时时长

    评论 # re: [CXF]Spring下设置CXF的WebService客户端超时时长 2010-01-05 21:47 Emily32Av A kind of good information a ...

最新文章

  1. 通过 “函数对象”看javascript函数
  2. 华为云设计语言_《好设计,有方法:我们在搜狐做产品体验设计》 —2.2 设计语言带来的好处...
  3. 两路服务器型号,两路服务器 核数
  4. JQuery------各种版本下载
  5. Python3条件判断
  6. python算法系列资料集(一)-2022.03.15
  7. 数据库SQL中的分钟表示应该使用MI(非常重要的一个问题,以前一直认为和java中一样,用mm就可以表示);校对规则(查询时区分大小写)
  8. pdf幻灯片:圆锥曲线中的“三定”问题探究(一)
  9. uni-app 变量赋值后被实时同步
  10. android viewholder模式,为什么在ViewHolder模式中ViewHolder类应该是静态的?
  11. 一脸懵逼搭建Zookeeper分布式集群
  12. win7电脑给手机开热点流程
  13. 苹果自研Apple M1芯片对机器学习意味着什么?
  14. [笔记] 关于通过鼠标滚轮设置缩放的技巧
  15. pg_rewind详解
  16. 华夫饼为什么不松软_华夫饼0添加太难了,在家才能做到,松软有营养,好吃又减肥...
  17. 力扣题解:45. 跳跃游戏 II
  18. 反爬虫之猫眼电影字体加密
  19. 音乐对计算机专业的影响,计算机网络技术对音乐发展的影响探讨
  20. Hbaseshell scan多种过滤操作

热门文章

  1. 快速上手关键词抽取的算法
  2. [Google API](1)简介
  3. Single Molecule Real-Time Sequencing
  4. 从FASTQ到BAM经历了什么?
  5. Fast and accurate short read alignment with Burrows-Wheeler transform
  6. Linux指定网卡优先级,如何在Ubuntu中设置网络连接的优先级?
  7. 关于短文本匹配的深度学习模型
  8. 延时函数介绍和呼吸灯的实现
  9. java+long.builder_Java LongStream.Builder accept()用法及代码示例
  10. 量化网络训练--Towards Effective Low-bitwidth Convolutional Neural Networks