Hive调优

1. 数据压缩.


        解释:
            1. 默认是不压缩的, 我们可以采用 GZip, Lzo, Zlib, Snappy 等这些压缩协议.
            2. 压缩协议好与不好我们主要看的是3个维度: 压缩比, 压缩速度(写), 解压速度(读取)
            3. 好处: 节省空间, 可以存储更多的文件, 提高磁盘利用率.    弊端: 解压和压缩的时候, 需要消耗一些额外的资源(CPU, 内存, 磁盘) 和 时间.
            4. 实际开发中, 推荐使用: snappy协议.
        细节:
            1. Hive的文件压缩, 其实本质上还是对MR的压缩, 分为: Map端压缩 和 Reduce端压缩.
            2. Map端压缩的目的是: 降低shuffle 和 Reduce端拉取数据的数量, 减少io(数据传输), 提高效率.
            3. Reduce端压缩目的是: reduce是把数据写到目的地文件的(即: HDFS上), 它的压缩是为了 节省空间, 可以存储更多的文件, 提高磁盘利用率.

    2. 数据存储.        指的是Hive中数据的存储方式, 主要有两种方式:


        方式1: 行存储.
            TextFile: 默认的.
            SequenceFile:
        方式2: 列存储.
            Orc:   FaceBook公司推的.
            Parquet: Twitter 和 Cloudera公司联合推出的.
        实际开发中, 如果你也不清楚用谁, 建议使用: Snappy + Orc, 因为它们更 均衡一点.

    3. Fetch抓取.


        这个设置不用你做, hive默认是开启的, 它的本质是: 能不把HiveSQL转成MR任务执行, 就不转换.
        细节: 即, 哪些HiveSQL不会转成MR任务呢?
            1. select * from 表名.
            2. select 列1,列2... from 表名
            3. select * from 表名 limit 起始索引, 数据条数;

    4. 本地模式.


        目的: 如果非得把HiveSQL转成MR任务执行, 能在本地执行, 就不要交给yarn集群运行.

    5. join优化, 指的是: join在哪个时间段执行, 例如: Map段, Reduce段.


        情况1: 小表 join 大表, 如果表的文件大小小于等于 25000000, 则是小表, 否则是大表.
        情况2: 大表 join 大表, 主要是做空值(null)的处理, 是把空值数据给过滤掉, 还是替换成其它的值.
        情况3: 分桶表, join查询的时候, on关联条件大多数会写id, 如果是分桶表, 且符合条件(分桶的偶数倍), 可以用 分桶字段作为join字段.
            select * from A inner join B on A.分桶字段 = B.分桶字段;       前提是: A的分桶个数 是 B的分桶个数的偶数倍, 或者 B的分桶个数 是 A的分桶个数的偶数呗.

    6. group by 数据倾斜问题处理.


        如何解决它?  手动开启负载均衡, 它的底层会开启两个MR任务, 第1个MR负责随机打散数据.  第2个MR: 会将第1个MR的ReduceTask当做MapTask, 来 拉取, 合并, 处理数据, 获取最终结果.

    7. MapReduce的并行度, 即: 我们开几个MapTask任务, 开几个ReduceTask任务.


        MapTask任务的个数 = Block数据块的个数.
            小文件过多:  我们可以对小文件做局部合并.
            文件过大,或者体量大: 增大Block块的大小(hadoop1.X: 64MB, Hadoop2.X开始: 128MB),  假设Block块的个数 从 100 => 50, 那我们MapTask的个数也就从 100 => 50
        ReduceTask任务的个数 = 手动设置(一般是和分区的个数相关)
            回想咱们之前讲解分桶查询的时候, 如果有几个桶, 我们要先设置ReduceTask的个数, 即:  set mapreduce.job.reduces = 3;
            细节: 每个任务最大的 reduce 数,默认为 1009,  每个Reduce任务能处理的最大数据量是 256MB.

    8. 执行计划, explain, 它可以查看 HiveSQL的执行计划, 即: 具体的执行流程.


        explain + HiveSQL语句即可.

    9. 并行执行机制.


        如果大任务拆分成小任务之后, 小任务之间的依赖度比较低, 可以让它们同时执行(并行执行), 可以提高效率.

    10. Hive的严格模式


        你一定要把这个 严格模式 和 DQL动态分区中的那个 严格模式区分开.
        这里的严格模式, 写法是: set hive.mapred.mode = strict, 目的是: 禁用某些效率低的SQL语句,
            要求:
                1. 如果是分区表,没有where进行分区裁剪 禁止执行
                2、order by语句必须 + limit限制

        我们之前学的动态分区的严格模式, 写法是: set hive.exec.dynamic.partition.mode = nonstrict;, 目的是: 在我们往分区表中添加数据的时候, 可以不指定静态分区, 因为严格模式要求: 动态分区的时候, 必须手动指定至少1个静态分区.
        partition(year)   动态分区,     partition(year='2022')  静态分区.

    11. 推测执行机制


        MR程序是可以多任务执行的, 当某个任务执行太慢的时候, 影响整体MR程序执行的进度, 如果开启了推测执行机制, 此时MR程序会再开一个任务, 和那个慢的任务做同样的事儿, 谁先执行完, 用谁的结果.
        例如: MR程序有: MapTask1, MapTask2, MapTask3, 此时MapTask2执行的很慢, Hive会开启一个新的MapTask, 例如: MapTask5, 它和MapTask2做的事儿是一样的,  谁先执行完, 用谁的结果.
        实际开发中, 推测执行一般是 关闭的.

    总结: (以下的话仅代表我的个人观点), 很多的大数据软件的调优都可以总结为如下的4点:
        1. 改硬件.
        2. 增大某些设置.             例如: Block块, MapTask数, Reduce数量等...
        3. 禁用(或调小)某些设置.      例如: 推测执行等.
        4. 减少IO传输.              例如: 数据压缩, 数据存储, join优化.
        上述的4点是辅助你理解的, 并不是回答面试题的"标准"答案.
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值