反向域名row key,自动拆分,负载均衡
reverse domain name row key, automatic splitting, and load balancing
我正在设计一个 HBase 模式,其中的行键以反向域名开头。例如,com.example.www
。虽然以 .com
结尾的域比 .org
或 .edu
多得多,但我认为我不必自己管理拆分,我可以依靠 HBase 的自动拆分来跨区域分布行。也就是说,区域会因为变得太大而分裂。
与 org.
相比,我应该得到更多具有以 com.
开头的键的区域,但我认为没关系,“com.
区域”应该结束分布在我的区域服务器上,对吗?
这里的负载均衡有问题吗?在 Lars 的 2011 HBase Schema Design video 中(link 直接转到感兴趣的部分),他讨论了在密钥开头也有反向域的模式设计。该视频说使用了反向域的 MD5 哈希 "for load balancing reasons"。
我可能遗漏了一些东西...如果 some.website.com
和 another.website.org
一样有可能出现在我的输入中,这是否意味着每一行都有可能命中一个区域(甚至一个区域服务器)与另一个?
HBase 通常会在达到 hbase.hregion.max.filesize 时将一个区域一分为二(取决于拆分策略)。您可以依靠自动拆分,但由于行键的性质(很多 "com" 域与少数 "org" 域),您将以奇数和词汇不均匀的拆分点结束。
这可能不是您的确切情况,但请考虑以下潜在问题:
- 从只有 1 个区域的空 table 开始,您按顺序插入 1.45 亿个域,从 com.. 开始到 org. 结束。
- 在8000万大关(虚构com.nnnn.www),region在"com.f*"处自动拆分为2,产生2个4000万个region,继续向region 2[=41=写入行]
- 在 1.2 亿标记处(虚构的 com.yyyy.www),第二个区域达到最大文件大小并在 "com.p*" 处拆分为 2 4000 万个区域并继续将行写入区域 3。
- 作业以 150M 域结束,不再执行拆分。
在这种情况下,区域 1 和区域 2 将各存储 4000 万行,但区域 3 将存储 6500 万行(它会以 8000 万行拆分,但它可能永远不会达到这个数量)。此外,由于您将始终写入最后一个区域(即使启用了批处理),该作业比同时向多个区域发出批量写入要慢得多。
另一个问题,假设您意识到您还需要添加 .us 域 (10M)。鉴于此设计,他们将转到区域 3,将托管的行数增加到 75M。
确保键在区域之间均匀分布的常用方法是在行键前加上键的 md5 的几个字符(在本例中为域名)。在 HBase 中,行键的第一个字节决定了将托管它的区域。
只需在 md5 的前面加上几个字符就足以防止尽可能多的热点(一个区域写入过多)并获得良好的自动拆分,但通常建议预拆分 tables 以确保更好的拆分。
如果您将 md5 的 2 个字符添加到您的行键中,您可以使用 15 个分割点预分割 table:“10”、“20”、“30”...直到 "e0".这将创建 16 个区域,如果它们中的任何一个需要自动拆分,它将在它们的中点完成。即:当从 "a0" 开始并在 "af" 结束的区域到达 hbase.hregion.max.filesize 时,它将被拆分为大约 "a8" 并且每个区域将存储 [=54] 的一半=] 桶.
这是一个示例,说明如果您有 16 个带有 2 个字符前缀行键的预拆分区域,哪些区域将托管每一行:
- Region 1 ---------
0b|com.example4.www
- Region 2 ---------
1b|org.example.www
10|com.example.www
- Region 5 ---------
56|com.example3.www
- Region 10 ---------
96|org.example5.www
- Region 11 ---------
af|com.example5.www
- Region 14 ---------
d5|org.example3.www
db|com.example2.www
de|org.example2.www
- Region 16 ---------
fb|org.example4.www
给定更多的域,它最终会变得更加均匀,几乎所有区域都会存储相同数量的域。
在大多数情况下,有 8-16 个预拆分区域就足够了,但如果不够,您可以选择 32 甚至 64 个预拆分区域,直到最多 256 个(这将是“01”、“02”、“03”...“9f”、"a0"、"a1" ...直到 "fe")
我正在设计一个 HBase 模式,其中的行键以反向域名开头。例如,com.example.www
。虽然以 .com
结尾的域比 .org
或 .edu
多得多,但我认为我不必自己管理拆分,我可以依靠 HBase 的自动拆分来跨区域分布行。也就是说,区域会因为变得太大而分裂。
与 org.
相比,我应该得到更多具有以 com.
开头的键的区域,但我认为没关系,“com.
区域”应该结束分布在我的区域服务器上,对吗?
这里的负载均衡有问题吗?在 Lars 的 2011 HBase Schema Design video 中(link 直接转到感兴趣的部分),他讨论了在密钥开头也有反向域的模式设计。该视频说使用了反向域的 MD5 哈希 "for load balancing reasons"。
我可能遗漏了一些东西...如果 some.website.com
和 another.website.org
一样有可能出现在我的输入中,这是否意味着每一行都有可能命中一个区域(甚至一个区域服务器)与另一个?
HBase 通常会在达到 hbase.hregion.max.filesize 时将一个区域一分为二(取决于拆分策略)。您可以依靠自动拆分,但由于行键的性质(很多 "com" 域与少数 "org" 域),您将以奇数和词汇不均匀的拆分点结束。
这可能不是您的确切情况,但请考虑以下潜在问题:
- 从只有 1 个区域的空 table 开始,您按顺序插入 1.45 亿个域,从 com.. 开始到 org. 结束。
- 在8000万大关(虚构com.nnnn.www),region在"com.f*"处自动拆分为2,产生2个4000万个region,继续向region 2[=41=写入行]
- 在 1.2 亿标记处(虚构的 com.yyyy.www),第二个区域达到最大文件大小并在 "com.p*" 处拆分为 2 4000 万个区域并继续将行写入区域 3。
- 作业以 150M 域结束,不再执行拆分。
在这种情况下,区域 1 和区域 2 将各存储 4000 万行,但区域 3 将存储 6500 万行(它会以 8000 万行拆分,但它可能永远不会达到这个数量)。此外,由于您将始终写入最后一个区域(即使启用了批处理),该作业比同时向多个区域发出批量写入要慢得多。
另一个问题,假设您意识到您还需要添加 .us 域 (10M)。鉴于此设计,他们将转到区域 3,将托管的行数增加到 75M。
确保键在区域之间均匀分布的常用方法是在行键前加上键的 md5 的几个字符(在本例中为域名)。在 HBase 中,行键的第一个字节决定了将托管它的区域。
只需在 md5 的前面加上几个字符就足以防止尽可能多的热点(一个区域写入过多)并获得良好的自动拆分,但通常建议预拆分 tables 以确保更好的拆分。
如果您将 md5 的 2 个字符添加到您的行键中,您可以使用 15 个分割点预分割 table:“10”、“20”、“30”...直到 "e0".这将创建 16 个区域,如果它们中的任何一个需要自动拆分,它将在它们的中点完成。即:当从 "a0" 开始并在 "af" 结束的区域到达 hbase.hregion.max.filesize 时,它将被拆分为大约 "a8" 并且每个区域将存储 [=54] 的一半=] 桶.
这是一个示例,说明如果您有 16 个带有 2 个字符前缀行键的预拆分区域,哪些区域将托管每一行:
- Region 1 ---------
0b|com.example4.www
- Region 2 ---------
1b|org.example.www
10|com.example.www
- Region 5 ---------
56|com.example3.www
- Region 10 ---------
96|org.example5.www
- Region 11 ---------
af|com.example5.www
- Region 14 ---------
d5|org.example3.www
db|com.example2.www
de|org.example2.www
- Region 16 ---------
fb|org.example4.www
给定更多的域,它最终会变得更加均匀,几乎所有区域都会存储相同数量的域。
在大多数情况下,有 8-16 个预拆分区域就足够了,但如果不够,您可以选择 32 甚至 64 个预拆分区域,直到最多 256 个(这将是“01”、“02”、“03”...“9f”、"a0"、"a1" ...直到 "fe")