优化hbase的查询操作-大幅提升读写速率
2014-09-01 22:05
204 查看
环境:suse 8G内存,8核,12T磁盘
hbase master 占一台,其他7台作为hbase的region server
注意:此处不讨论hadoop
情景:
我们有7亿的数据,需要做查询操作,需要从1.7亿的表中查找一个字段,并写入到7亿数据的表中。
这里为了描述方便,将7亿数据的表称为:A表,1.7亿数据的表称为B表。
在初期,我们采用的逻辑是:将A表中的数据读取一行,根据其中的某个字段去组织一个GET,然后
立刻提交,从B表取得要查询的字段的值,组织成一个PUT,并提交到A表。
那么这么做的话,完全发挥不出hbase的效率,因为每个get之间它的key不一定连续,或者说是在同一范围
而hbase的服务端会根据每个请求去加载数据到内存,由于请求的块分散,那么数据在内存中的替换过多的频繁。
很有可能和直接读取磁盘数据差不多。
并且采用这种逻辑去处理数据,需要花费时间太多。差不多是10W行读写数据需要40分钟。这对于A表的更新操作
完全是不能接受的。
之后,通过读数据的读取操作进行封装,组织成一个ArrayList<Get> 当到一定程度的时候采取提交。这里还有一个情况就是
有些数据查询不到,那么需要去连接数据库去申请一个自动分配的值,并立刻提交,因为后面可能有请求这个数据。
这就需要分开处理。
在组织GET 列表的时候需要先查询,注意,不要采用table.get去取一个cell的值并判断是否为null来处理。
而是用table.exist(get) 去查询,这是在server-side跑的,效率要高很多。
对于查询不到的值立刻申请值并写入A表。
对于查询的到的,那么就可前面说的组织get 加入到GET列表中,到一定程度再去一次提交,在取到值之后,
在根据将循环数据的记录,将这些组织成put,数量和GET列表一样,不要去具体指定,在循环一次后直接table.put
其他参数修改方面,写的都很多,这里就不提了。
处理速度(取至其中一台服务器中跑的任务):
2011-12-30 17:10:03 Start Write Lines:1700000
2011-12-30 17:14:10 Writed Lines:1700000
2011-12-30 17:14:11 Start Write Lines:1800000
2011-12-30 17:18:21 Writed Lines:1800000
2011-12-30 17:18:22 Start Write Lines:1900000
2011-12-30 17:22:29 Writed Lines:1900000
2011-12-30 17:22:29 Start Write Lines:2000000
2011-12-30 17:26:37 Writed Lines:2000000
2011-12-30 17:26:37 Start Write Lines:2100000
大约是查询,写入速度是4分钟处理10W行数据。
也就是4000/s的速率,较之前的处理方式提升了一个量级
PS:欢迎搞hadoop,hbase的朋友联系我,相互交流
参考http://www.cnblogs.com/chenjingjing/archive/2010/01/26/1656895.html
hbase master 占一台,其他7台作为hbase的region server
注意:此处不讨论hadoop
情景:
我们有7亿的数据,需要做查询操作,需要从1.7亿的表中查找一个字段,并写入到7亿数据的表中。
这里为了描述方便,将7亿数据的表称为:A表,1.7亿数据的表称为B表。
在初期,我们采用的逻辑是:将A表中的数据读取一行,根据其中的某个字段去组织一个GET,然后
立刻提交,从B表取得要查询的字段的值,组织成一个PUT,并提交到A表。
那么这么做的话,完全发挥不出hbase的效率,因为每个get之间它的key不一定连续,或者说是在同一范围
而hbase的服务端会根据每个请求去加载数据到内存,由于请求的块分散,那么数据在内存中的替换过多的频繁。
很有可能和直接读取磁盘数据差不多。
并且采用这种逻辑去处理数据,需要花费时间太多。差不多是10W行读写数据需要40分钟。这对于A表的更新操作
完全是不能接受的。
之后,通过读数据的读取操作进行封装,组织成一个ArrayList<Get> 当到一定程度的时候采取提交。这里还有一个情况就是
有些数据查询不到,那么需要去连接数据库去申请一个自动分配的值,并立刻提交,因为后面可能有请求这个数据。
这就需要分开处理。
在组织GET 列表的时候需要先查询,注意,不要采用table.get去取一个cell的值并判断是否为null来处理。
而是用table.exist(get) 去查询,这是在server-side跑的,效率要高很多。
对于查询不到的值立刻申请值并写入A表。
对于查询的到的,那么就可前面说的组织get 加入到GET列表中,到一定程度再去一次提交,在取到值之后,
在根据将循环数据的记录,将这些组织成put,数量和GET列表一样,不要去具体指定,在循环一次后直接table.put
其他参数修改方面,写的都很多,这里就不提了。
处理速度(取至其中一台服务器中跑的任务):
2011-12-30 17:10:03 Start Write Lines:1700000
2011-12-30 17:14:10 Writed Lines:1700000
2011-12-30 17:14:11 Start Write Lines:1800000
2011-12-30 17:18:21 Writed Lines:1800000
2011-12-30 17:18:22 Start Write Lines:1900000
2011-12-30 17:22:29 Writed Lines:1900000
2011-12-30 17:22:29 Start Write Lines:2000000
2011-12-30 17:26:37 Writed Lines:2000000
2011-12-30 17:26:37 Start Write Lines:2100000
大约是查询,写入速度是4分钟处理10W行数据。
也就是4000/s的速率,较之前的处理方式提升了一个量级
PS:欢迎搞hadoop,hbase的朋友联系我,相互交流
参考http://www.cnblogs.com/chenjingjing/archive/2010/01/26/1656895.html
相关文章推荐
- 优化hbase的查询操作-大幅提升读写速率
- 优化hbase的查询优化-大幅提升读写速率(转)
- 优化hbase的查询优化-大幅提升读写速率
- 优化hbase的查询提升读写速率优化案例及性能提升的几种方法
- 优化hbase的查询提升读写速率优化案例及性能提升的几种方法
- SQLServer性能优化之 nolock,大幅提升数据库查询性能
- SQLServer性能优化之 nolock,大幅提升数据库查询性能
- SQLServer性能优化之 nolock,大幅提升数据库查询性能
- SQLServer性能优化之 nolock,大幅提升数据库查询性能
- SQLServer性能优化之 nolock,大幅提升数据库查询性能
- 【转载】HBase性能优化方法总结(3):写表操作
- linux下shell读写文件优化操作总结
- 使用C++(通过Thrift)访问/操作/读写Hbase
- Hbase复杂操作的优化- Htable HtablePool
- 【转载】HBase性能优化方法总结(4):读表操作
- sql优化案例:oracle子查询的or 转为 union all以提升查询效率
- Java操作Hbase进行建表、删表以及对数据进行增删改查,条件查询
- oledb读写excel出现“操作必须使用一个可更新的查询”的解决
- 数据库优化查询更新操作/查询最大值
- Java操作Hbase进行建表、删表以及对数据进行增删改查,条件查询