• Hive优化


    抓取

    Hive中对于某些情况的查询可以不必使用MapReduce计算。例如SELECT,Hive可以简单读取对应的存储目录的文件信息。

    可以设置一些参数,全局查找、字段查找、limit查找等都不使用MapReduce。或者执行查询语句都执行MapReduce。

    本地模式

    在Hive处理的输入数据量很少时,Hive可以通过本地模式在单台机器上处理所有的任务,因此,对于小数据集,执行时间明显缩短。通过设置参数,开启和关闭此优化。

    表的优化

    小表、大表Join

    大小表连接使用MapReduce的Map Join,前提是小表数据能够都读入内存。

    INSERT OVERWRITE TABLE jointable
    SELECT b.id,b.time,b.uid,b.url,s.num,...
    FROM smalltable s
    LEFT ON bigtable b
    ON b.id = s.id
    

    不指定MapJoin或不符合MapJoin的条件,Hive解析器会把join操作转换成Common Join,即Reduce Join,容易发生数据倾斜。

    大表大表连接

    大表大表用ReduceJoin。有时候join超时是某些key对应数据太多,相同key发送给相同reduce端上,导致内存不够。

    1. 很多情况,这些key对应的数据是异常数据,因此我们需要在SQL语句中过滤,比如过滤掉NULL值的数据,以减少reduce端的数据,加快速度。
    2. 或者为这些NUll值分配随机数,以便均匀分布到各个reduce端,避免数据倾斜情况。

    Group By

    默认情况下,Map阶段同一Key数据分发给同一个reduce会造成数据倾斜。但是很多操作并不需要都在Reduce端完成,我们可以在Map端进行聚合操作,最后Reduce汇合最终结果就好。

    通过设置参数,以开启Map端聚合操作。

    Count(Distinct)去重统计

    数据量小的时候无所谓,数据量大的情况,由于Count Distinct操作需要用一个Reduce端来完成,会造成数据量太大,整个任务Job完成时间旧且困难。

    我们可以通过Group By再count来替代原先去重统计

    SELECT COUNT(id) FROM (
    SELECT id FROM bigtable group by id) a;
    

    MapReduce优化

    1. 合理设置Map数
    2. 小文件合并
    3. 复杂文件增加Map数
    4. 合理设置Reduce数

    推测执行

    在分布式集群环境下, 因为程序 Bug(包括 Hadoop 本身的 bug), 负载不均衡或者资源分布不均等原因,会造成同一个作业的多个任务之间运行速度不一致,有些任务的运行速度可能明显慢于其他任务(比如一个作业的某个任务进度只有 50%,而其他所有任务已经运行完毕),则这些任务会拖慢作业的整体执行进度。为了避免这种情况发生, Hadoop 采用了推测执行(Speculative Execution)机制,它根据一定的法则推测出“拖后腿”的任务,并为这样的任务启动一个备份任务,让该任务与原始任务同时处理同一份数据,并最终选用最先成功运行完成任务的计算结果作为最终结果

  • 相关阅读:
    Vue之axios基础使用
    Vue + Spring Boot 项目实战(二):使用 CLI 搭建 Vue.js 项目
    解决:'webpack-dev-server' 不是内部或外部命令,也不是可运行的程序 或批处理文件。
    CentOS root用户修改只读文件时提示加! 解决办法
    CentOS 7 源码编译安装 Redis
    CentOS安装Jdk并配置环境变量
    Vue + Spring Boot 项目实战(一):项目简介
    druid 数据源 使用属性文件的一个坑
    scala 学习笔记(07) 一等公民的函数
    linux:手动校准系统时间和硬件CMOS时间
  • 原文地址:https://www.cnblogs.com/chenshaowei/p/12499318.html
Copyright © 2020-2023  润新知