• hive的优化整理



    1)MapJoin
    如果不指定MapJoin或者不符合MapJoin的条件,那么Hive解析器会将Join操作转换成Common Join,即:在Reduce阶段完成join。容易发生数据倾斜。可以用MapJoin把小表全部加载到内存在map端进行join,避免reducer处理。

    2)行列过滤
    列处理:在SELECT中,只拿需要的列,如果有,尽量使用分区过滤,少用SELECT *。
    行处理:在分区剪裁中,当使用外关联时,如果将副表的过滤条件写在Where后面,那么就会先全表关联,之后再过滤。

    3)采用分桶技术

    4)采用分区技术

    5)合理设置Map数
    (1)通常情况下,作业会通过input的目录产生一个或者多个map任务。
    主要的决定因素有:input的文件总个数,input的文件大小,集群设置的文件块大小。

    (2)是不是map数越多越好?
    答案是否定的。如果一个任务有很多小文件(远远小于块大小128m),则每个小文件也会被当做一个块,用一个map任务来完成,而一个map任务启动和初始化的时间远远大于逻辑处理的时间,就会造成很大的资源浪费。而且,同时可执行的map数是受限的。

    (3)是不是保证每个map处理接近128m的文件块,就高枕无忧了?
    答案也是不一定。比如有一个127m的文件,正常会用一个map去完成,但这个文件只有一个或者两个小字段,却有几千万的记录,如果map处理的逻辑比较复杂,用一个map任务去做,肯定也比较耗时。

    针对上面的问题2和3,我们需要采取两种方式来解决:即减少map数和增加map数;

    6)小文件进行合并
    在Map执行前合并小文件,减少Map数:CombineHiveInputFormat具有对小文件进行合并的功能(系统默认的格式)。HiveInputFormat没有对小文件合并功能。

    7)合理设置Reduce数
    Reduce个数并不是越多越好
    (1)过多的启动和初始化Reduce也会消耗时间和资源;
    (2)另外,有多少个Reduce,就会有多少个输出文件,如果生成了很多个小文件,那么如果这些小文件作为下一个任务的输入,则也会出现小文件过多的问题;
    在设置Reduce个数的时候也需要考虑这两个原则:处理大数据量利用合适的Reduce数;使单个Reduce任务处理数据量大小要合适;

    8)常用参数
    // 输出合并小文件
    SET hive.merge.mapfiles = true; -- 默认true,在map-only任务结束时合并小文件

    SET hive.merge.mapredfiles = true; -- 默认false,在map-reduce任务结束时合并小文件

    SET hive.merge.size.per.task = 268435456; -- 默认256M

    SET hive.merge.smallfiles.avgsize = 16777216; -- 当输出文件的平均大小小于该值时,启动一个独立的map-reduce任务进行文件merge

    9)JVM重用

    10)推测执行

    11)严格模式

    通过设置属性hive.mapred.mode值为默认是非严格模式nonstrict 。开启严格模式需要修改hive.mapred.mode值为strict,开启严格模式可以禁止3种类型的查询

    (1)对于分区表,除非where语句中含有分区字段过滤条件来限制范围,否则不允许执行。
    (2)对于使用了order by语句的查询,要求必须使用limit语句
    (3)限制笛卡尔积的查询。

    <property>

        <name>hive.mapred.mode</name>

        <value>strict</value>

        <description>

          The mode in which the Hive operations are being performed.

          In strict mode, some risky queries are not allowed to run. They include:

            Cartesian Product.

            No partition being picked up for a query.

            Comparing bigints and strings.

            Comparing bigints and doubles.

            Orderby without limit.

    </description>

    </property>

    12)并行执行
    set hive.exec.parallel=true; //打开任务并行执行
    set hive.exec.parallel.thread.number=16; //同一个sql允许最大并行度,默认为8。

    13)压缩

  • 相关阅读:
    Java里的时间类以及函数
    递归方法理解快速排序算法
    Java操作读取写入文本TXT及XML文件内容
    java控制Office套件API(POI加JXL)网上摘录留工作备查
    通过直接预分区的方式建表
    自用JavaMail实现
    阿里巴巴java开发手册学习记录,php版
    PHP 常用的header头部定义汇总
    这里有123个黑客必备的Python工具!
    PHP/JS中获取当前页面的完整URL
  • 原文地址:https://www.cnblogs.com/yumengfei/p/11900747.html
Copyright © 2020-2023  润新知