You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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配置,使用对应算法计算,最终导致两者生成的分桶文件内容不一致。

修复方案

  1. 升级Hive版本到4.0及以上,该版本已经修复了Tez引擎读取bucketing_version参数的缺陷。
  2. 若暂时无法升级版本,使用Tez引擎写入分桶表时,在会话级别手动添加配置set hive.bucketing.version=2;,即可强制Tez使用版本2的哈希算法,保证和MR引擎的分桶结果一致。

内容的提问来源于stack exchange,提问作者alwaysnoob

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 11:06:04