【问题标题】:HBase load balancing by splitting regions通过分割区域实现 HBase 负载均衡
【发布时间】:2012-06-18 05:13:13
【问题描述】:

我有一个 5 节点的 HBase 集群,并且主要有获取顺序数据的输入请求。

为了优化存储,我在高负载区域上运行了手动区域拆分,但它并没有优化太多,因为它拆分了区域,但主要是在同一个区域服务器上。

我怎样才能以这种方式控制区域分割

r-1(k1 to k2) on server s1,
r-2(k2 to k3) on server s2,
r-3(k3 to k4) on server s3,
r-4(k4 to k5) on server s4,
r-5(k5 to k6) on server s5,
r-6(k6 to k7) on server s1,

即拆分后,没有连续的区域进入同一台服务器来控制同一台服务器上的负载。

【问题讨论】:

  • 是什么让您认为这会导致问题?默认情况下,负载均衡器每 5 分钟运行一次,并在区域周围移动/分割区域以平衡集群负载。这应该足够了。然后由 HDFS 负责集群之间的分布。
  • 感谢 Raze2dust 回复。!在同一区域服务器上具有连续区域的唯一问题是 - 在请求顺序数据时,它需要更多时间,因为它超过了 base.regionserver.handler.count 的限制并且一些请求进入等待状态。
  • 举个例子:在默认负载均衡之后,我注意到区域的分布是-S4上的r-1,S1上的r-2,S1上的r-3,S2上的r-4,r S2 上的 -5,S2 上的 r-6,S3 上的 r-7,s5 上的 r-8,.. & 现在每个区域的请求/秒数几乎相同。但是在区域 r-4 到 r-6 之间获取数据的新请求完全依赖于单个服务器 S-2。如何以没有连续区域进入同一服务器的方式控制区域分布。谢谢

标签: java hadoop hbase


【解决方案1】:

我假设服务器是指 RegionServer。区域是随机分配的区域服务器,所以如果你的集群足够大,这种情况不应该发生(或者应该很少发生)。这个想法是你不应该为此烦恼。另外,请了解 regionserver 只是数据的网关。它依赖 HDFS 来获取实际数据,而数据的来源由 HDFS 决定。

此外,即使连续的区域最终由同一个 RS 提供服务,您也应该能够使用多线程来更快地获取数据。 HBase 已经在内部为每个区域 AFAIK 运行了一个单独的线程。通常,它不会导致过多的负载。您是否看到实际上因此导致负载过大?您是否进行了任何分析以查看导致负载的原因?

所以,确实应该没有必要这样做,但在特殊情况下,您可以使用HBaseAdmin.move 方法来实现这一点。您可以使用HTable.getRegionLocations() 编写一些代码来遍历表的所有区域,根据开始键对区域进行排序并手动(using HBaseAdmin.move())确保所有连续区域都位于单独的区域服务器上。但我强烈怀疑这实际上是一个问题,我建议您在采用这种方法之前确认这一点。

【讨论】:

  • 谢谢 Raze2dust,我会试试的。是的,我在运行协处理器时看到了单个区域服务器上的负载,并且我还增加了堆大小以及 region-server-handler-count,但仍有一些请求进入等待状态。如果一些连续的区域在不同的区域服务器上,那么等待时间将会减少。当同一个请求触发这么多次(~100)时,就会发生这种情况。
猜你喜欢
  • 1970-01-01
  • 2013-11-11
  • 2013-07-23
  • 1970-01-01
  • 1970-01-01
  • 2018-10-27
  • 1970-01-01
  • 1970-01-01
  • 2015-05-25
相关资源
最近更新 更多