当处理由连续事件得到的数据时,即时间上连续的数据。这些数据可能来自于某个传感器网络、证券交易或者一个监控系统。它们显著的特点就是rowkey中含有事件发生时间。带来的一个问题便是HBase对于row的不均衡分布,它们被存储在一个唯一的rowkey区间中,被称为region,区间的范围被称为Start Key和End Key。

对于单调递增的时间类型数据,很容易被散列到同一个Region中,这样它们会被存储在同一个服务器上,从而所有的访问和更新操作都会集中到这一台服务器上,从而在集群中形成一个hot spot,从而不能将集群的整体性能发挥出来。

要解决这个问题是非常容易的,只需要将所有的数据散列到全部的Region上即可。这是可以做到的,比如,在rowkey前面加上一个非线程序列,常常有如下选择:

Hash散列

您可以使用一个Hash前缀来保证所有的行被分发到多个Region服务器上。例如:

byte prefix =
(byte) (Long.hashCode(timestamp) % );

byte[] rowkey =
Bytes.add(Bytes.toBytes(prefix), Bytes.toBytes(timestamp);

这个公式可以产生足够的数字,将数据散列到所有的Region服务器上。当然,公式里假定了Region服务器的数目。如果您打算后期扩容您的集群,那么您可以把它先设置为集群的整数倍。生成的rowkey类似下面:

0myrowkey-1,
1myrowkey-2, 2myrowkey-3, 0myrowkey-4, 1myrowkey-5, \

2myrowkey-6, …

当他们将按如下顺序被发送到各个Region服务器上去:

0myrowkey-1

0myrowkey-4

1myrowkey-2

1myrowkey-5

换句话说,对于0myrowkey-1和0myrowkey-4的更新操作会被发送到同一个region服务器上去(假定它们没有被散列到两个region上去),1myrowkey-2和1myrowkey-5会被发送到同一台服务器上。

这种方式的缺点是,rowkey的范围必须通过代码来控制,同时对数据的访问,可能要访问多台region服务器。当然,可以通过多个线程同时访问,来实现并行化的数据读取。这种类似于只有map的MapReduce任务,可以大大增加IO的性能。

最新文章

  1. 有border和没有border是两回事
  2. LeakCanary 内存检测 工具 --超级傻瓜 不会DDMS的福音
  3. Java线程:线程的交互
  4. Java:一个简单的Java应用程序
  5. 浅谈Ddos攻击攻击与防御
  6. opencv 2.4.9+pcl 1.6+vs2010+win7 32开发环境配置
  7. 在Windows Server2008R2中导入Excel不能使用Jet 4.0的解决方法
  8. 文件TEXTBOX
  9. building hadoop2.4.1 on centos7[在centos7上面构建hadoop2.4.1]
  10. [转载]MongoDB学习 (六):查询
  11. CSS Sprites的详细使用步骤
  12. Hadoop问题:启动hadoop 2.6遇到的datanode启动不了
  13. JQuery EasyUI 表单
  14. 清华机试中手机键盘问题求解 java 和 c
  15. qml: 自定义输入框
  16. Python(十三)python的函数重载
  17. 1.1 Java 的概述
  18. 求一个数的n次幂
  19. 读书笔记(02) - 可维护性 - JavaScript高级程序设计
  20. javascript: break跳出多重循环以及退出each循环

热门文章

  1. 解决 ORA-28001: the password has expired 问题
  2. Java之聊天室系统设计一
  3. python判断指定路径是否存在
  4. WPF 回车转Tab实现跳转
  5. ubuntu 14.04 如何安装nvidia显卡驱动 [转载]
  6. nyoj——113 getline
  7. Centos7 使用Dockerfile 制作自己的Dotnetcore程序镜像
  8. Roman Numeral Converter
  9. [Eclipse]Eclipse快捷键
  10. eureka-8-Eureka 的健康检查