HBase优化——读写优化

Hbase2.0查询优化

1)设置scan缓存

HBase中Scan查询可以设置缓存,方法是setCaching(),这样可以有效的减少服务端与客户端的交互,更有效的提升扫描查询的性能。

Scan scan = new Scan();
scan.setCaching(1000);

2)显示的指定列

当使用Scan或者GET获取大量的行时,最好指定所需要的列,因为服务端通过网络传输到客户端,数据量太大可能是瓶颈。如果能有效过滤部分数据,能很大程度的减少网络I/O的花费。

Scan scan = new Scan();scan.addColumn(Bytes.toBytes("f"), Bytes.toBytes("t"));scan.addFamily(Bytes.toBytes("f"));

Get get = new Get(Bytes.toBytes("demo"));get.addColumn(Bytes.toBytes("f"), Bytes.toBytes("t"));get.addFamily(Bytes.toBytes("f"));

一般情况下用:
scan.addColumn(…)

3)关闭ResultScanner

如果在使用 table.getScanner之后,忘记关闭该类,它会一直和服务端保持连接,资源无法释放,从而导致服务端的某些资源不可用。

所以在用完之后,需要执行关闭操作,这点与JDBS操作MySQL类似。

Scan scan = new Scan()
ResultScanner scanner = table.getScanner(scan)
for (Result  rs <- scanner) {
   do something.....
}
scanner.close()

4) 禁用块缓存

如果批量进行全表扫描,默认是有缓存的,如果此时有缓存,会降低扫描的效率。

Scan scan = new Scan()
scan.setCacheBlocks(true|false);

对于经常读到的数据,建议使用默认值,开启块缓存

5) 缓存查询结果

对于频繁查询HBase的应用场景,可以考虑在应用程序和Hbase之间做一层缓存系统(redis等),新的查询先去缓存查,缓存没有再去查Hbase。

6)设定scan的查询范围

如果可以明确的扫描范围,建议设置scan的StartRow和StopRow

Scan scan = new Scan();
scan.withStartRow(Bytes.toBytes("0000"));
scan.withStopRow(Bytes.toBytes("9999"));

7) 批量get执行

如果可以确定rowkey的值,在批量查询的时候建议用批量Get方式

List<Get> gets = new ArrayList<Get>();
gets.add(new Get(Bytes.toBytes("000")));
gets.add(new Get(Bytes.toBytes("111")));
gets.add(new Get(Bytes.toBytes("222")));
gets.add(new Get(Bytes.toBytes("333")));
table.get(gets)

Hbase2.0写入优化

写也是Hbase常有的操作之一,并且Hbase在写入操作上有着其他NoSQL无法比拟的优势,下面讲如何优化写入操作

1)关闭写WAL日志
一般为了保证系统的高可用性,WAL日志默认是开启状态,WAL主要用于灾难恢复的,如果应用可以容忍一定的数据丢失风险,可以在写数据的时候,关闭写WAL。

风险: 当RegionServer宕机时,写入的数据出现丢失,且无法恢复

2)设置AutoFlush
Htable有一个属性是AutoFlush,该属性用于支持客户端的批量更新,默认是true,当客户端每收到一条数据,立刻发送到服务端,如果设置为false,当客户端提交put请求时候,先将该请求在客户端缓存,到达阈值的时候或者执行hbase.flushcommits(),才向RegionServer提交请求。

table.setAutoFlush(false);
table.setWriteBufferSize( 12 * 1024 * 1024 );

3)预创建Region
一般表刚开始只有一个Region,插入该表的数据都会保存在此Region中,插入该表的所有塑化剂都会保存在该Region中,当到达一定的阈值时,才发生分裂。 这样开始时刻针对该表的写操作都集中在某台服务器上,造成这台服务器的压力很紧张,同时对整个集群资源的浪费

建议刚开始的时候预创建Region,可以使用Hbase自带的RegionSplitter

4)延迟日志flush
默认写入操作,首先写入WAL,并且在1S内写入HDFS,这个时间默认是1S,可以通过参数配置

hbase.regionserver.optionallogflushinterval

可以配置大一点的值,比如5s,这段时间数据会保留在内存中,直到RegionServer周期性的执行flush操作。

原文地址:https://www.cnblogs.com/yyy-blog/p/11867041.html

时间: 2024-11-09 02:10:53

HBase优化——读写优化的相关文章

hbase读写优化

一.hbase读优化 客户端优化 1.scan缓存是否设置合理? 优化原理:一次scan请求,实际并不会一次就将所有数据加载到本地,而是多次RPC请求进行加载.默认100条数据大小. 优化建议:大scan场景下将scan缓存从100增大到500或者1000,以减少RPC次数 2.get请求是否可以使用批量请求? 优化原理:Hbase分别提供了单条get以及批量get的API接口,使用批量get接口可以减少客户端到RegionServer之间的PRC连接数,提高读取性能. 3.请求是否可以显示指定

【黑科技】读写优化

读入优化: inline int read() { char ch; bool flag = false; int a = 0; while(!((((ch = getchar()) >= '0') && (ch <= '9')) || (ch == '-'))); if(ch != '-') { a *= 10; a += ch - '0'; } else { flag = true; } while(((ch = getchar()) >= '0') &&am

一个Hbase数据读取优化的小例子

今天群里有个有经验的大神提了一个问题(@尘事随缘),记录下来. A君搭建一个小型的集群,7台DataNode,一台主节点.需求是这样:通过MR程序去读取Hbase表里面的数据,程序运行后发现速度比较慢,通过查询任务详细发现,累计需要1542个Map完成,目前有14个MAP在执行.客户对此速度表示不满意,请问如何优化? 首先通过Job看,有1542个Map需要执行,说明Hbase,有1542个分区(每个分区对应一个Map),这是一个知识点. 数据不存在热点,Hbase处理性能没有问题 有1542个

hbase表设计优化原则 ***** 生产环境中使用小结

2019/2/28 星期四 hbase表设计优化原则 https://www.cnblogs.com/qingyunzong/p/8696962.html表设计1.列簇设计 追求的原则是:在合理范围内能尽量少的减少列簇就尽量减少列簇. 最优设计是:将所有相关性很强的 key-value 都放在同一个列簇下,这样既能做到查询效率 最高,也能保持尽可能少的访问不同的磁盘文件. 以用户信息为例,可以将必须的基本信息存放在一个列族,而一些附加的额外信息可以放在 另一列族.2.RowKey 设计 HBas

hbase G1 GC优化

本文借鉴之前HBaseConAsia2017,小米公司对hbase g1 gc的优化分享.此外还可以参考apache官方博客对于hbase g1 gc优化的一篇文章(Tuning G1GC For Your HBase Cluster) g1 gc的优化主要是对一些重要的参数进行调整,然后执行压力测试,分析G1的日志.G1日志处理可以使用HubSpot开发的一个Python工具, 叫做 gc_log_visualizer , 这个工具通过正则提取日志数据, 然后绘制成监控图, 比较方便查看G1的

性能优化——算法优化

背景 由于某种原因,我们系统需要记录另一个系统中一个表里的id.但是,当我们记录完了以后,别人系统可能会删除那个表里的一些数据,这样的话,我们这边就多了一些无效数据,所以,我们必须的找到这些无效的id,然后将其删除. 开始,我们的实现是这样:我们将记录下来的所有id放在一个list里,然后传到另一个系统,他将他们已经删除的id返回.具体处理代码如下: <pre name="code" class="java">public String findDele

HBase 数据读写流程

HBase 数据读写流程 2016-10-18 杜亦舒 读数据 HBase的表是按行拆分为一个个 region 块儿,这些块儿被放置在各个 regionserver 中 假设现在想在用户表中获取 row key 为 row0001 的用户信息 要想取得这条数据,就需要先找到含有此条记录的 region HBase 是如何定位到具体 regionserver 中的具体 region 的呢? HBase 中有一个内置的 hbase:meta 表,其中记录了所有表的所有 region 的详细信息 例如

凸优化之优化、对偶、KKT-七月算法(julyedu.com)4 月机器学习算法班学习笔记

优化 一般优化问题的基本形式 凸优化的基本形式 共轭函数 共轭函数是凸函数 对偶问题 拉格朗日函数 拉格朗日对偶函数 KKT条件 小结 优化 一般优化问题的基本形式 minimizef0(x),x∈Rn s.t.fi(x)≤0,i=1?m s.t.hj(x)=0,j=1?n 定义域为 当 m=n=0 时,约束优化问题退化成无约束优化问题 注意:这是是优化问题的一般形式,对 fi(x) 和 hi(x) 无特殊要求.就是并不要求这些函数一定可导,也不要求只有一个极值点,就是啥要求都没. 凸优化的基本

优化!优化!

网上看到一篇文章,虽然它讲的是一个js库内部的方法,但对我理解js的MVC模式还是很有帮助的,为防止以后访问不了,先抄下来: $.Class为javascript模拟了继承的实现,他将jquery面向函数的编程和面向对象的编程衔接在一起.$.Class基于 John Resig 的Simple Class类库,除了原型继承外,他还有其他一些特性:静态继承.自描述(Introspection).命名空间的支持.创建和初始化方法.更容易创建的回调函数. 构造函数 我们通过下面的方式生命一个类型: $