gpt4 book ai didi

hadoop - 加盐时添加 RegionServers

转载 作者:可可西里 更新时间:2023-11-01 14:52:53 26 4
gpt4 key购买 nike

我阅读了关于加盐以及如何在顺序键的情况下将其用于负载平衡的内容。基本上,salt 应该将顺序行分发到不同的区域服务器。

我也读过这个article这解释了如何在加盐的表上运行 MR 作业。

因此,它建议将盐生成为:

StringUtils.leftPad(Integer.toString(Math.abs(keyCore.hashCode() % numberOfRegions)), 3, "0") + "|" + logicalKey

所以您基本上采用原始 key 的哈希值并进行模除法以获得盐分。

您还需要指定基于 salt 的预拆分,以便每个区域包含具有相同 salt 的行。

这一切似乎都合情合理。我的问题是,当您添加更多区域服务器时会发生什么

预计您还会增加区域数量,因此您必须更改拆分策略,以便新区域遵循“one-salt-for-all-rows-in-region”规则。您还需要通过增加的 numberOfRegions 执行模除法。

所有这一切意味着,当我试图获取在区域数量较少时添加的行时,我可能会搞乱查询。例如,一开始您可以除以模 10(10 个区域),然后您可以除以模 50(现在是 50 个区域)。

谁能解释一下这个加盐/预 split 的完整过程?

最佳答案

Salt 用于避免单个区域的热点。在您的情况下, numberOfRegions 被视为涉及使用顺序键进行批量写入的区域数量。此数字不必与集群中的区域总数一致。例如,如果 10 个区域可以处理您的写入量,则您应该在公式中使用等于 10 的 numberOfRegions,或者 20 以防将来您建议将写入次数加倍。而且您不需要对区域中的所有行都遵循一种盐的规则。您需要找到足以处理您的写入量的区域数量。

此外,现在您不需要像博客文章中提到的那样编写自定义输入表格式。您可以为单个 map reduce 作业指定多个扫描。在这种情况下,数据局部性将自动处理。每次扫描都会产生几个输入分割,每个区域对应一次扫描中的数据。请参阅下面的示例

 List<Scan> scans = new ArrayList<>();
for(int i = 0; i < numberOfRegions; i++){
Scan scan = new Scan();
scan.setBatch(500);
scan.setAttribute(Scan.SCAN_ATTRIBUTES_TABLE_NAME, YOUR_TABLE_NAME);
String regionSalt = StringUtils.leftPad(Integer.toString(i), 3, "0");
scan.setStartRow( Bytes.toBytes(regionSalt + "|" + scanStart));
scan.setStartRow( Bytes.toBytes(regionSalt + "|" + scanStop);
scans.add(scan);
}

TableMapReduceUtil.initTableMapperJob(
scans,
YourMapper.class,
Text.class,
Text.class,
job);

关于hadoop - 加盐时添加 RegionServers,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34352657/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com