高基数字段的Hive查询性能

3

我在Hive中有一张单独但非常庞大的表,几乎总是使用主键列(例如employee_id)进行查询。该表将非常庞大,每天插入数百万行数据,我想使用这个字段上的分区快速查询。我阅读了这篇文章,并知道分区仅适用于低基数字段,那么如何实现我的目标,即使用employee_id列快速查询?

我知道高基数的id列应该用作桶,但它对单个表的查询性能没有帮助,对吗?

我认为如果我可以使用类似hash(employee_id)的分区,它会对我非常有帮助。这可行吗?我在Hive文档中没有看到这样的内容。

总之,我想要快速查询结果:

select * from employee where employee_id=XXX

假设employee表有数十亿条记录,其中主键列为employee_id,传统的按年、月、日等分区并不能起到帮助作用。
提前感谢。

你可以使用唯一ID的前缀来减少基数。 - OneCricketeer
你能解释一下吗?你是指作为一个分区吗? - Mehmet Ali Karabulut
2个回答

3
使用具有布隆过滤器的ORC:
    CREATE TABLE employee (
      employee_id bigint,
      name STRING
    ) STORED AS ORC 
    TBLPROPERTIES ("orc.bloom.filter.columns"="employee_id")
    ;

启用PPD与向量化,使用CBO和Tez:
    SET hive.optimize.ppd=true;
    SET hive.optimize.ppd.storage=true;
    SET hive.vectorized.execution.enabled=true;
    SET hive.vectorized.execution.reduce.enabled = true;
    SET hive.cbo.enable=true;
    set hive.stats.autogather=true;
    set hive.compute.query.using.stats=true;
    set hive.stats.fetch.partition.stats=true;
    set hive.execution.engine=tez;
    set hive.stats.fetch.column.stats=true;
    set hive.map.aggr=true;
    SET hive.tez.auto.reducer.parallelism=true; 

参考:https://community.cloudera.com/t5/Community-Articles/Optimizing-Hive-queries-for-ORC-formatted-tables/ta-p/248164

本文将介绍如何优化Hive查询ORC格式的表。ORC是一种高效的列式存储格式,可减少数据I/O并提高查询性能。以下是一些优化技巧:
1. 使用分区和桶:使用分区和桶可以减少查询数据量,提高查询速度。
2. 避免使用SELECT *:只选择需要的列,避免不必要的数据读取。
3. 使用压缩:使用压缩可以减少磁盘空间和网络带宽的使用,并提高查询性能。
4. 调整ORC文件大小:根据查询模式和硬件资源调整ORC文件大小,以达到最佳查询性能。
5. 使用向量化查询:启用向量化查询可以进一步提高查询性能。
通过实施这些优化技巧,您可以显著提高Hive查询ORC格式表的性能。
  1. Tune proper parallelism on mappers and reducers:

    --example for mappers:

     set tez.grouping.max-size=67108864;
     set tez.grouping.min-size=32000000;
    

    --example settings for reducers:

     set hive.exec.reducers.bytes.per.reducer=67108864; --decrease this to increase the number of reducers
    

更改这些数字以实现最佳性能。


谢谢你的回答。我会尝试这个方法并测试性能。再次感谢。 - Mehmet Ali Karabulut
另一个要添加的表属性是'orc.compress'='SNAPPY' - Gabe
很遗憾,不是这样的。我们停止使用Hive了,转而使用HBase表格来通过主键索引快速访问,并在其上添加了Phoenix层以通过为现有表创建视图来获得SQL的便利性。 - Mehmet Ali Karabulut
1
关于第2步中每个命令的描述,请参见以下链接:https://community.cloudera.com/t5/Community-Articles/Optimizing-Hive-queries-for-ORC-formatted-tables/ta-p/248164 - user1

1

您可以尝试对Hive表进行分桶。这些桶基于高基数字段。这是哈希的概念。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接