Hive 和 Parquet 这两兄弟搭在一起干活,效率能拉满到什么程度,很大程度上取决于你怎么调教它们。数据量一大,跑个查询慢得像老牛拉车,那种感觉谁都懂。其实,很多性能瓶颈并不是硬件不行,而是配置没到位、写法欠考虑。下面直接说干货,看看哪些手段最管用。

Hive Parquet性能调优技巧
- SQL语句优化:别动不动就全表扫描,那是给集群上压力。能用分区就用分区,能上桶表就上桶表,数据扫描量一下子就能降下来。另外,用
UNION ALL的时候,考虑一下动态分区——相当于复用中间结果,避免重复去翻同一块数据。 - 数据格式优化:既然选了Parquet,那就别浪费它的列式存储和压缩能力。ORC也行,两个都是好选项。关键在于压缩算法的选择和存储单位的配置。
- 配置参数优化:
- 压缩方面,设
parquet.compression为snappy——速度与压缩比的平衡点,实战中最常用。 - 文件存储和读取的效率,一般靠调整
parquet.block.size和parquet.page.size来拿捏。块大小设得合适,HDFS块对齐就能让I/O少走弯路。
- 压缩方面,设
- 并行执行:一个光杆任务跑再快也有限,并行才是真理。打开
hive.exec.parallel,再把hive.exec.parallel.thread.number调到合适的值,让多个阶段并起来跑。 - 数据倾斜处理:有些场景下,某些Key的值特别多,导致一个Reducer累死别的闲死。把
hive.groupby.skewindata设为true,Hive会自动生成两个MR任务来做负载均衡——虽然多了一步,但整体快了不是一点。 - 使用EXPLAIN命令:别凭感觉瞎猜,跑个EXPLAIN看一眼查询计划,瓶颈在哪一目了然。这招比什么都实在。
其他优化建议
- 别死磕MapReduce,现在Tez和Spark才是主流执行引擎。换一个执行引擎,查询速度能肉眼可见地提升。
- 数据加载阶段就下功夫:过滤、转换都提前做,进了Hive的数据已经削掉了一大半,后面自然反赌。
说到底,Hive和Parquet的组合潜力很大,关键看你怎么把配置和写法拧成一股绳。把上面这些技巧逐个试一遍,查询效率的提升会很可观。
