Hive 我们如何确定蜂箱表的桶总数

Hive 我们如何确定蜂箱表的桶总数,hive,numbers,formula,buckets,Hive,Numbers,Formula,Buckets,我对hadoop有点陌生。据我所知,bucket是配置单元表中固定数量的分区,配置单元使用的reducer数量与创建表时定义的bucket总数相同。有谁能告诉我如何计算蜂箱表中的桶总数吗。是否有计算铲斗总数的公式?来自文档 通常,铲斗编号由表达式确定 哈希函数(bucketing列)mod num_buckets。(有一个 '0x7FFFFFFF也在那里,但这并不重要)。这个 hash_函数取决于bucketing列的类型。对于int, 这很简单,hash_int(i)==i。例如,如果use

我对hadoop有点陌生。据我所知,bucket是配置单元表中固定数量的分区,配置单元使用的reducer数量与创建表时定义的bucket总数相同。有谁能告诉我如何计算蜂箱表中的桶总数吗。是否有计算铲斗总数的公式?

来自文档

通常,铲斗编号由表达式确定 哈希函数(bucketing列)mod num_buckets。(有一个 '0x7FFFFFFF也在那里,但这并不重要)。这个 hash_函数取决于bucketing列的类型。对于int, 这很简单,hash_int(i)==i。例如,如果user_id是int,则 共有10个存储桶,我们希望所有的用户id都以0结尾 在bucket 1中,所有以1结尾的用户id都在bucket 2中,以此类推。 对于其他数据类型,这有点棘手。特别是 BIGINT与BIGINT不同。以及字符串或 复杂数据类型将是从该值派生的某个数字, 但没有任何人类能识别的东西。例如,如果用户_id是 字符串,则bucket 1中的用户_id可能不会以0结尾。在里面 一般来说,基于散列分布行会给您一个偶数 铲斗中的分配


如果您想知道在
CLUSTER BY
子句中应该选择多少个bucket,我认为最好选择一个数字,使bucket的大小等于或略低于您的HDFS块大小

这将有助于避免HDF将内存分配给大部分为空的文件

同时选择一个2的幂的数字

您可以检查HDFS块大小:


最佳存储桶数为(B*HashTableSize of Table)/节点的总内存,B=1.01, HDFS块大小:128 MB

现在,除以2300/128=17.96

现在,请记住铲斗的数量始终是2的幂

所以我们需要找到n,使得2^n>17.96

n=5

所以,我将使用桶的数量作为2^5=32


希望它能帮助你们中的一些人。

得到了一个公式#bucket=(x*平均分区大小)/JVM(内存可用)来(Hadoop)tasknode;其中x(>1)为“保守因素”。但不清楚。需要一个明确的公式,谢谢。但我的问题是,我们如何确定蜂箱桌的桶总数。谢谢。但我的问题是,我们如何确定蜂箱桌子的桶总数。对于ex-CREATE EXTERNAL TABLE SALES\u EXT\u BUCKET(store\u id字符串、order\u no字符串、order\u Date字符串),按(order\u no)聚集到4个BUCKET中,以“\t”结尾的行格式分隔字段存储为textfile;那么在这里,我们如何确定桶的总数为4。我知道桶的总数总是2的幂。这有什么公式吗?如果是的话,那么感谢您所看到的任何输入,以获得上述公式。简言之,这实际上取决于您的用例以及您希望在稍后阶段查询的方式。有一个可能对您有所帮助的实际例子。快乐学习你能详细说明你的答案吗?假设我们有1TB的数据,那么我们可以分配多少存储桶?请给我解释一下。@vijayraj34不幸的是,这要看情况而定。您可以从检查块大小开始,请参见。从那里你可以天真地尝试
num_bucket=1TB/块大小
。进一步考虑每个基准的内存需求可能有好处(例如,如果它们大于块大小?),但不能完全确定。还有一个问题,如何选择bucketing列?如果我们的列基数值是2呢?如果它不是正确的选择,那么我们应该考虑什么样的基数值?@ VijayaRj34,它归结为哈希函数。阅读更多:
配置单元如何在存储桶之间分配行?通常,bucket编号由表达式hash_函数(bucketing_列)mod num_bucket….确定
hdfs getconf -confKey dfs.blocksize