Hive3.1.2分桶版本2下Tez与MR的分桶哈希算法是否存在差异
Hive 3.1.2版本bucketing_version=2下MR与Tez分桶结果不一致问题解答
问题背景
我使用Hive 3.1.2版本,尝试创建bucketing_version=2的分桶表。完成分桶创建后通过hdfs dfs -cat命令查看分桶文件,发现哈希结果存在差异。请问Tez和MR的哈希算法是否不同?在bucketing_version=2的场景下二者结果理应一致吗?以下是测试方法及结果:
1. 创建分桶表与数据表
CREATE EXTERNAL TABLE `bucket_test`( `id` int COMMENT ' ', `name` string COMMENT ' ', `age` int COMMENT ' ', `phone` string COMMENT ' ') CLUSTERED BY (id, name, age) SORTED BY(phone) INTO 2 Buckets ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe' STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' TBLPROPERTIES ( 'bucketing_version'='2', 'orc.compress'='ZLIB'); CREATE TABLE data_table (id int, name string, age int, phone string) row format delimited fields terminated by ',';
2. 向DATA_TABLE插入测试数据
INSERT INTO TABLE data_table select stack ( 20 ,1, 'a', 11, '111' ,1,'a',11,'222' ,3,'b',14,'333' ,3,'b',13,'444' ,5,'c',18,'555' ,5,'c',18,'666' ,5,'c',21,'777' ,8,'d',23,'888' ,9,'d',24,'999' ,10,'d',26,'1110' ,11,'d',27,'1112' ,12,'e',28,'1113' ,13,'f',28,'1114' ,14,'g',30,'1115' ,15,'q',31,'1116' ,16,'w',32,'1117' ,17,'e',33,'1118' ,18,'r',34,'1119' ,19,'t',36,'1120' ,20,'y',36,'1130')
3. 使用MR引擎生成桶数据
set hive.enforce.bucketing = true; set hive.execution.engine = mr; set mapreduce.job.queuename=root.test; Insert overwrite table bucket_test select * from data_table ;
4. 查看MR生成的分桶内容
# bucket0 : 6行 [root@test~]# hdfs dfs -cat /user/hive/warehouse/bucket_test/000000_0 10d261110 11d271112 18r341119 3b13444 5c18555 5c18666 # bucket1 : 14行 [root@test~]# hdfs dfs -cat /user/hive/warehouse/bucket_test/000001_0 1a11111 12e281113 13f281114 14g301115 15q311116 16w321117 17e331118 19t361120 20y361130 1a11222 3b14333 5c21777 8d23888 9d24999
5. 使用Tez引擎生成桶数据
set hive.enforce.bucketing = true; set hive.execution.engine = tez; set tez.queue.name=root.test; Insert overwrite table bucket_test select * from data_table ;
6. 查看Tez生成的分桶内容
# bucket0 : 11行 [root@test~]# hdfs dfs -cat /user/hive/warehouse/bucket_test/000000_0 1a11111 10d261110 11d271112 13f281114 16w321117 17e331118 18r341119 20y361130 1a11222 5c18555 5c18666 # bucket1 : 9行 [root@test~]# hdfs dfs -cat /user/hive/warehouse/bucket_test/000001_0 12e281113 14g301115 15q311116 19t361120 3b14333 3b13444 5c21777 8d23888 9d24999
问题解答
核心结论
bucketing_version=2的设计目标就是统一Hive不同计算引擎的分桶哈希逻辑,正常情况下MR和Tez的分桶结果应该完全一致。- 你遇到的结果差异是Hive 3.1.2版本的已知Bug导致,并非两种引擎的哈希算法设计不同。
原因说明
Hive 3.1.2版本中,Tez引擎执行分桶写入逻辑时存在参数读取缺陷:无法正确读取表属性中配置的bucketing_version值,会默认使用版本1的哈希算法计算分桶路由;而MR引擎可以正确识别表级的bucketing_version=2配置,使用对应算法计算,最终导致两者生成的分桶文件内容不一致。
修复方案
- 升级Hive版本到4.0及以上,该版本已经修复了Tez引擎读取
bucketing_version参数的缺陷。 - 若暂时无法升级版本,使用Tez引擎写入分桶表时,在会话级别手动添加配置
set hive.bucketing.version=2;,即可强制Tez使用版本2的哈希算法,保证和MR引擎的分桶结果一致。
内容的提问来源于stack exchange,提问作者alwaysnoob
相关产品推荐
相关产品推荐

