java - HBase 分区域负载均衡

标签 java hadoop hbase

我有一个 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,

即拆分后,没有连续的region去同一台服务器控制同一台服务器上的负载。

最佳答案

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

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

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

关于java - HBase 分区域负载均衡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11077228/

相关文章:

时间范围查询的 Hbase rowkey 设计

hadoop - 什么是 "Hadoop"- Hadoop 的定义?

java - 如何在 Java 中创建和访问索引以进入大文件的特定位置

hadoop - 除了 hadoop 集群中设置的时间之外,如何为长时间运行的应用程序更新委托(delegate) token

java - HADOOP::java.lang.ClassNotFoundException:WordCount

hadoop - 如何为映射器输出设置Avro压缩编解码器?

hadoop - HBase(Hortonworks)访问被拒绝异常

java - 线程 "main"java.lang.NoClassDefFoundError : org/openqa/selenium/WebDriver 中出现异常

java - Mapreduce-FloatArrayWritable打印地址

java - 无法创建消息 : incorrect content-type for SOAP version. 已获取文本/xml; charset=UTF-8,但应为 application/soap+xml