• hive的join优化


    1.分析数据倾斜情况:
    可以使用EXPLAIN命令获取Join操作的执行计划,并观察输出中的数据倾斜情况。比如下面的查询语句

    EXPLAIN SELECT * FROM Table_A JOIN Table_B ON Table_A.key = Table_B.key;
    
    • 1

    输出的执行计划中,可以通过STAGE PLANS部分中的Reducer和PARTITIONED BY部分来查看Reduce阶段的分区数和分区键。如果存在分区数分布不均的情况,则需要进行数据倾斜处理。

    2.数据倾斜处理:
    针对存在数据倾斜的键值,可以使用DISTRIBUTED BY语句对Join键进行预分区。例如,对于Join键为key的表,可以使用以下语句进行预分区:

    SELECT /*+ MAPJOIN(b) */ *
    FROM Table_A a JOIN (SELECT key, value FROM Table_B DISTRIBUTE BY key) b
    ON a.key = b.key;
    
    • 1
    • 2
    • 3

    上述语句将Table_B表按照key字段进行预分区,并使用MapJoin加速Join操作。

    3.设置Join策略:

    根据表的大小和数据分布情况,选择合适的Join策略。例如,对于小表,可以使用MapJoin,启用自动MapJoin:SET hive.auto.convert.join=true;,设置小表的最大大小:SET hive.mapjoin.smalltable.filesize=xxxx;。对于大表,可以使用SortMergeJoin,启用优化:SET hive.optimize.sortmergejoin=true;

    4.增加并行度
    启用并行执行:SET hive.exec.parallel=true;。根据集群资源和数据规模,调整并行线程数:SET hive.exec.parallel.thread.number=xxxx;

    5.使用Map端Join和Reduce端Join
    对于小表,可以使用Map端Join。启用Map端Join:SET hive.auto.convert.join.noconditionaltask=true;,确保小表可以完全加载到内存中。对于大表,可以使用Reduce端Join。例如,以下查询语句使用Reduce端Join实现两个大表的Join

    SELECT /*+ MAPJOIN(b) */ *
    FROM Table_A a JOIN (SELECT key, value FROM Table_B DISTRIBUTE BY key SORT BY key) b
    ON a.key = b.key;
    
    • 1
    • 2
    • 3

    6.预先过滤不必要的数据:
    在Join操作之前,使用WHERE子句或子查询等方式过滤掉不必要的数据。例如,以下查询语句使用子查询过滤了Table_B表中value为10的记录:

    SELECT a.*, b.*
    FROM Table_A a JOIN (SELECT * FROM Table_B WHERE value <> 10) b
    ON a.key = b.key;
    
    • 1
    • 2
    • 3

    7.使用分区表优化Join:
    如果表已根据Join键进行了分区,直接对分区进行Join操作,以减少需要比较的数据量。例如,以下查询语句使用分区表优化了Join操作:

    SELECT /*+ MAPJOIN(b) */ *
    FROM Table_A a JOIN (SELECT key, value FROM Table_B WHERE day='20220101') b
    ON a.key = b.key AND a.day = '20220101';
    
    • 1
    • 2
    • 3

    在此语句中,Table_B表已根据key字段分区,并且使用WHERE子句过滤出day='20220101’的记录。在Join操作时,仅需要比较Table_A表和Table_B表中day='20220101’的记录。

    8.调整Hive配置参数:
    根据具体场景和集群配置,调整一些Hive的配置参数来优化性能,如hive.tez.container.size、hive.vectorized.execution.enabled等。例如,以下语句将Tez任务的内存容器大小设置为2GB:

    SET hive.tez.container.size=2048;
    
    • 1

    9.使用索引:
    对于频繁用作Join条件的列,可以在表上创建索引,加快Join操作的速度。例如,以下语句在Table_B表上创建了key字段的索引:

    CREATE INDEX idx_table_b_key ON TABLE Table_B(key);
    
    • 1

    10.使用压缩:
    对于大型表,可以考虑使用压缩格式,如Snappy或Gzip,减少磁盘IO和网络传输。例如,以下语句将Table_A表使用Snappy格式进行压缩:

    ALTER TABLE Table_A SET FILEFORMAT RCFILE;
    SET hive.exec.compress.output=true;
    SET mapreduce.output.fileoutputformat.compress.type=BLOCK;
    SET mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.SnappyCodec;
    
    • 1
    • 2
    • 3
    • 4
  • 相关阅读:
    【js学习】闭包理解
    IOS OpenGL ES GPUImage 图像Lanczos重取样模糊效果 GPUImageLanczosResamplingFilter
    金蝶系统组织架构封存sql使用
    elasticSearch的索引库文档的增删改查
    Java 【异常】
    通用任务批次程序模板
    面试官:做过性能优化?我:任务切片!
    Java+JSP+MySQL基于SSM的学生宿舍管理系统的设计与实现-计算机毕业设计
    Oracle中用户自定义函数(五)
    利用Socks5代理IP加强跨界电商爬虫的网络安全
  • 原文地址:https://blog.csdn.net/MyNameIsWangYi/article/details/132980249