• hive优化到底应该怎么优化(面试必备)


    前言:这是个老生常谈的话题,也是几乎面试必问的问题,以下是个人整理的心得,各位看官可以借鉴参考一下
    主要从三个方面来说
    1.参数调优
    2.sql调优
    3.资源调优

    1.参数调优

    本地模式:当数据量较小的时候,启动分布式处理数据会比较慢,启动时间较长,不如本地模式快,用下面的参数来调整

     SET hive.exec.mode.local.auto=true; -- 默认 false 
     SET hive.exec.mode.local.auto.inputbytes.max=50000000; --输入文件的大小小于 hive.exec.mode.local.auto.inputbytes.max 配置的大小
     SET hive.exec.mode.local.auto.input.files.max=5; -- 默认 4  map任务的数量小于 hive.exec.mode.local.auto.input.files.max 配置的大小
    
    • 1
    • 2
    • 3

    jvm重用:MR查询过程中过多的小文件又会造成启动过多的Mapper Task, 每个Mapper都是一个后台线程,会占用JVM的空间

    SET mapreduce.job.jvm.numtasks=5;
    
    • 1

    严格模式

      hive.mapred.mode=nostrict
    
    • 1
    查询分区表时不限定分区列的语句;
    两表join产生了笛卡尔积的语句;
    用order by来排序,但没有指定limit的语句
    
    • 1
    • 2
    • 3

    并行执行:Hive的查询会转为stage,这些stage并不是相互依赖的,可以并行执行这些stage,使用下面的参数

       SET hive.exec.parallel=true; -- 默认false
        SET hive.exec.parallel.thread.number=16; -- 默认8
    
    • 1
    • 2

    合并小文件

      在map执行前面,先合并小文件来减少map数
        set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
      在任务结束后,合并小文件
        # 在 map-only 任务结束时合并小文件,默认true
        SET hive.merge.mapfiles = true;
        # 在 map-reduce 任务结束时合并小文件,默认false
        SET hive.merge.mapredfiles = true;
        # 合并文件的大小,默认256M
        SET hive.merge.size.per.task = 268435456;
        # 当输出文件的平均大小小于该值时,启动一个独立的map-reduce任务进行文件merge
        SET hive.merge.smallfiles.avgsize = 16777216;
    	
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    2.SQL调优

     1 count(distinct col)慎用 使用group By
       distinct会将b列所有的数据保存到内存中,形成一个类似hash的结构,速度是十分的块;但是在大数据背景下,因为b列所有的值都会形成以key值,极有可能发生OOM
       
     2.sort by 代替order  By
    
     3. mapjoin优化
      /*mapjoin(a) */ a是小表,常规的设置阈值为25m为小表,跟大表做关联,发生数据倾斜,可以这么操作
       
     4.列裁剪(避免使用select *5.  谓词下推(where之前过滤条件)
    
     6. union all 太多,也是对表拆分,比如五个表union all,可以先两两结合落表,在进行关联
    
     7. 空值单独过滤处理(因为一个空值也是key,对应的value太多了)一个表内有许多空值时会导致MapReduce过程中,空成为一个key值,对应的会有大量的value值, 而一个key的value会一起到达reduce造成内存不足
      
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    资源调优

    资金允许的情况下,扩容扩存;
    可以选用更好的引擎,比如spark ,impala;
    在表存储的时候,选择更好的存储方案,比如parquent,seq,orc;
    如果数据存储在小于块大小的小文件中,则可以使用SEQUENCE文件格式。如果要以减少存储空间并提高性能的优化方式存储数据,则可以使用ORC文件格式,而当列中嵌套的数据过多时,Parquet格式会很有用。因此,需要根据拥有的数据确定输入文件格式。

  • 相关阅读:
    4、FFmpeg命令行操作7
    Flutter笔记:绘图示例 - 一个简单的(Canvas )时钟应用
    【vue3: vuex4 状态管理库】使用&讲解
    丁鹿学堂:前端面试手写系列之promise(一)
    [附源码]java毕业设计闲置物品线上交易系统
    手机SSL证书认证失败是什么意思?
    springboot实现websocket客户端断线重连
    艾美捷MTT细胞增殖检测试剂盒结果示例&引用文献
    Shell语法详解专栏目录
    java程序设计项目案例化教程题库及答案
  • 原文地址:https://blog.csdn.net/weixin_49165958/article/details/126304318