使用Tez执行Count(*)返回空结果但MapReduce正常的问题排查
Hive Tez引擎COUNT(*)查询返回空结果,MapReduce引擎正常的问题
问题详情
- 环境:Docker部署的Hadoop+Hive集群,Parquet格式外部表由PyArrow生成,表结构与Hive定义完全匹配
- 异常表现:执行查询语句
SELECT COUNT(*) FROM market_data WHERE ric = 'WINc1' AND year = 2024 AND month = 1 AND day = 2时,Tez引擎返回空结果集;切换为MapReduce引擎后返回正确计数 - 关键线索:日志中
RECORDS_OUT_OPERATOR_SEL_9: 11171207(该数值为正确行数),说明Tez已完成数据统计,但最终结果未正常返回 - 版本信息:Hive 4.0.0、Hadoop 3.4.1、Tez 0.10.3
执行日志
jdbc:hive2://localhost:10000/default> SELECT COUNT(*) FROM market_data WHERE ric = 'WINc1' AND year = 2024 AND month = 1 AND day = 2; INFO : File System Counters: INFO : FILE_BYTES_READ: 108 INFO : FILE_BYTES_WRITTEN: 228 INFO : FILE_READ_OPS: 0 INFO : FILE_LARGE_READ_OPS: 0 INFO : FILE_WRITE_OPS: 0 INFO : HDFS_BYTES_READ: 1440097729 INFO : HDFS_BYTES_WRITTEN: 0 INFO : HDFS_READ_OPS: 1096 INFO : HDFS_LARGE_READ_OPS: 0 INFO : HDFS_WRITE_OPS: 0 INFO : org.apache.tez.common.counters.TaskCounter: INFO : SPILLED_RECORDS: 0 INFO : NUM_SHUFFLED_INPUTS: 0 INFO : NUM_FAILED_SHUFFLE_INPUTS: 0 INFO : GC_TIME_MILLIS: 520 INFO : CPU_MILLISECONDS: 44910 INFO : WALL_CLOCK_MILLISECONDS: 120244 INFO : PHYSICAL_MEMORY_BYTES: 16314269696 INFO : VIRTUAL_MEMORY_BYTES: 70690332672 INFO : COMMITTED_HEAP_BYTES: 16314269696 INFO : INPUT_RECORDS_PROCESSED: 255910 INFO : INPUT_SPLIT_LENGTH_BYTES: 1440098825 INFO : OUTPUT_RECORDS: 12 INFO : APPROXIMATE_INPUT_RECORDS: 12 INFO : OUTPUT_LARGE_RECORDS: 0 INFO : OUTPUT_BYTES: 54 INFO : OUTPUT_BYTES_WITH_OVERHEAD: 150 INFO : OUTPUT_BYTES_PHYSICAL: 486 INFO : ADDITIONAL_SPILLS_BYTES_WRITTEN: 0 INFO : ADDITIONAL_SPILLS_BYTES_READ: 0 INFO : ADDITIONAL_SPILL_COUNT: 0 INFO : SHUFFLE_BYTES: 0 INFO : SHUFFLE_BYTES_DECOMPRESSED: 0 INFO : SHUFFLE_BYTES_TO_MEM: 0 INFO : SHUFFLE_BYTES_TO_DISK: 0 INFO : SHUFFLE_BYTES_DISK_DIRECT: 0 INFO : SHUFFLE_PHASE_TIME: 3220 INFO : FIRST_EVENT_RECEIVED: 36 INFO : LAST_EVENT_RECEIVED: 3220 INFO : DATA_BYTES_VIA_EVENT: 198 INFO : HIVE: INFO : CREATED_FILES: 1 INFO : DESERIALIZE_ERRORS: 0 INFO : RECORDS_IN_Map_1: 261916407 INFO : RECORDS_OUT_0: 1 INFO : RECORDS_OUT_INTERMEDIATE_Map_1: 18 INFO : RECORDS_OUT_INTERMEDIATE_Reducer_2: 0 INFO : RECORDS_OUT_OPERATOR_FIL_8: 11171207 INFO : RECORDS_OUT_OPERATOR_FS_13: 1 INFO : RECORDS_OUT_OPERATOR_GBY_10: 12 INFO : RECORDS_OUT_OPERATOR_GBY_12: 1 INFO : RECORDS_OUT_OPERATOR_MAP_0: 0 INFO : RECORDS_OUT_OPERATOR_RS_11: 18 INFO : RECORDS_OUT_OPERATOR_SEL_9: 11171207 INFO : RECORDS_OUT_OPERATOR_TS_0: 261916407 INFO : org.apache.hadoop.hive.ql.exec.tez.HiveInputCounters: INFO : GROUPED_INPUT_SPLITS_Map_1: 12 INFO : INPUT_DIRECTORIES_Map_1: 22 INFO : INPUT_FILES_Map_1: 274 INFO : RAW_INPUT_SPLITS_Map_1: 274 INFO : Completed executing command(queryId=hive_20250730142019_de067ec2-e26a-4085-8bde-0b98eb7e80fd); Time taken: 27.824 seconds +------+ | _c0 | +------+ +------+ No rows selected (27.926 seconds)
排查与解决方法
1. 版本兼容性调整
Tez 0.10.3与Hive 4.0.0存在已知兼容性问题,建议升级Tez至0.11.0及以上版本(Hive 4.x官方推荐适配版本),重新部署后测试查询。
2. 修复Parquet文件解析问题
- 检查PyArrow生成的Parquet文件字段类型,确保
year/month/day等数值型字段与Hive表定义完全一致(如Hive定义为int,PyArrow不能用smallint) - 用Hive的
INSERT INTO语句生成少量Parquet测试数据,对比PyArrow生成文件的查询结果,定位是否为文件格式差异导致
3. 调整Tez执行参数
临时关闭可能导致结果丢失的优化开关,测试查询:
set hive.tez.auto.reducer.parallelism=false; set hive.tez.execution.mode=batch; set tez.am.resource.memory.mb=4096; set tez.task.resource.memory.mb=4096; set hive.tez.container.size=4096;
若临时生效,可将参数写入Hive配置文件hive-site.xml持久化。
4. 排查Tez Shuffle过程异常
从日志中RECORDS_OUT_INTERMEDIATE_Reducer_2: 0可知,Reducer未接收到Map阶段的中间数据:
- 检查Tez Shuffle管理器配置,确保
tez.shuffle.manager=org.apache.tez.dag.api.TezShuffleManager - 查看Tez Container的详细日志(YARN日志目录下),定位Shuffle阶段是否存在数据传输异常
5. 优化Hive Parquet读取配置
set hive.parquet.use.summary.metadata=false; set hive.vectorized.execution.enabled=true; set hive.exec.dynamic.partition.mode=nonstrict;
关闭Parquet元数据摘要读取,启用向量执行模式,避免元数据解析错误导致结果丢失。
内容的提问来源于stack exchange,提问作者Pedro Novaes
相关产品推荐
相关产品推荐

