Hive—调优策略(架构优化,参数优化)

Hive—调优策略

  1. 影响hive效率的情况有:数据量过大、数据倾斜、数据冗余、job或I/O过多、MapReduce分配不合理等
  2. 对Hive的调优既包含对HiveQL语句本身的优化,也包含Hive配置项和MR方面的调整;
  3. Hive调优策略可以分为架构优化,参数优化和SQL优化

Hive—架构优化

优化执行引擎

  1. Hive支持多种执行引擎,分别是 MapReduce、Tez、Spark、Flink。可以通过hive-site.xml文件中的hive.execution.engine属性控制。
  2. Tez是一个构建于YARN之上的支持复杂的DAG(有向无环图)任务的数据处理框架。
  3. Tez由Hontonworks开源,将MapReduce的过程拆分成若干个子过程,同时可以把多个mapreduce任务组合成一个较大的DAG任务,减少了MapReduce之间的文件存储,同时合理组合其子过程从而大幅提升MR作业的性能。

在这里插入图片描述

分区表

  1. 对于一张比较大的表,将其设计成分区表可以提升查询的性能,对于一个特定分区的查询,只会加载对应分区路径的文件数据,所以执行速度会比较快。
  2. 影响查询性能的重要因素是分区字段,所以尽量避免层级较深的分区,因为这样会造成太多的子文件夹。
  3. 常见的分区字段可以是:
    1. 日期或时间。如year、month、day或者hour,当表中存在时间或者日期字段时
    2. 地理位置。如国家、省份、城市等
    3. 业务逻辑。如部门、销售区域、客户等等

分桶表

  1. 分桶表的组织方式是将HDFS上的文件分割成多个文件。
  2. 分桶可以加快数据采样,也可以提升join的性能(join的字段是分桶字段),因为分桶可以确保某个key对应的数据在一个特定的桶内(文件),通过分桶字段可以大幅度提升join的性能。
  3. 通常情况下,分桶字段可以选择经常用在过滤操作或者join操作的字段。

文件格式

  1. 在HiveQL的create table语句中,可以使用 stored as … 指定表的存储格式。
  2. Hive表支持的存储格式有TextFile、SequenceFile、RCFile、ORC、Parquet等。
  3. 存储格式一般需要根据业务进行选择,绝大多数表都采用TextFile、ORC、Parquet存储格式之一。
  4. TextFile是最简单的存储格式,它是纯文本记录,也是Hive的默认格式。其磁盘开销大,查询效率低,更多的是作为跳板来使用。
  5. RCFile、ORC、Parquet等格式的表都不能由文件直接导入数据,必须由TextFile来做中转。
  6. Parquet和ORC都是Apache旗下的开源列式存储格式。列式存储比起传统的行式存储更适合批量OLAP查询,并且也支持更好的压缩和编码。
  7. Parquet格式支持Impala查询引擎,并且对update、delete和事务性操作需求很低。

Hive—参数优化

本地模式

  1. 当Hive处理的数据量较小时,启动分布式去处理数据会有点浪费,因为可能启动的时间比数据处理的时间还要长。

  2. Hive支持将作业动态地转为本地模式,需要使用下面的配置:

    SET hive.exec.mode.local.auto=true; -- 默认 false
    SET hive.exec.mode.local.auto.inputbytes.max=50000000;
    SET hive.exec.mode.local.auto.input.files.max=4; -- 默认 4
    
  3. 一个作业只要满足下面的条件,会启用本地模式

    1. 输入文件的大小小于 hive.exec.mode.local.auto.inputbytes.max 配置的大小
    2. map任务的数量小于 hive.exec.mode.local.auto.input.files.max 配置的大小
    3. reduce任务的数量是1或者0

严格模式

  1. 严格模式,就是强制不允许用户执行3种有风险的HiveQL语句,一旦执行会直接失败。这3种语句是:
    1. 查询分区表时不限定分区列的语句;
    2. 两表join产生了笛卡尔积的语句;
    3. 用order by来排序,但没有指定limit的语句。
  2. 要开启严格模式,需要将参数 hive.mapred.mode 设为strict(默认值)。
  3. 严格模式的设置参数可以不在参数文件中定义,在执行SQL之前设置(set hive.mapred.mode=nostrict )

JVM重用

  1. 默认情况下,Hadoop会为为一个map或者reduce启动一个JVM,这样可以并行执行map和reduce。当map或者reduce是那种仅运行几秒钟的轻量级作业时,JVM启动进程所耗费的时间会比作业执行的时间还要长。Hadoop可以重用JVM,通过共享JVM以串行而非并行的方式运行map或者reduce。

  2. JVM的重用适用于同一个作业的map和reduce,对于不同作业的task不能够共享JVM。如果要开启JVM重用,需要配置一个作业最大task数量,默认值为1,如果设置为-1,则表示不限制:

    # 代表同一个MR job中顺序执行的5个task重复使用一个JVM,减少启动和关闭的开销
    SET mapreduce.job.jvm.numtasks=5;
    
  3. JVM重用的缺点:开启JVM重用将一直占用使用到的task插槽,以便进行重用,直到任务完成后才能释放。如果某个“不平衡的”job中有某几个reduce task执行的时间要比其他Reduce task消耗的时间多的多的话,那么保留的插槽就会一直空闲着却无法被其他的job使用,直到所有的task都结束了才会释放。

并行执行

  1. Hive的查询通常会被转换成一系列的stage,这些stage之间并不是一直相互依赖的,可以并行执行这些stage,通过下面的方式进行配置:

    SET hive.exec.parallel=true; -- 默认false
    SET hive.exec.parallel.thread.number=16; -- 默认8
    
  2. 并行执行可以增加集群资源的利用率,如果集群的资源使用率已经很高了,那么并行执行的效果不会很明显。

推测执行

  1. 在分布式集群环境下,因为程序Bug、负载不均衡、资源分布不均等原因,会造成同一个作业的多个任务之间运行速度不一致,有些任务的运行速度可能明显慢于其他任务(比如一个作业的某个任务进度只有50%,而其他所有任务已经运行完毕),则这些任务会拖慢作业的整体执行进度。

  2. 为了避免这种情况发生,Hadoop采用了推测执行机制,它根据一定的规则推测出“拖后腿”的任务,并为这样的任务启动一个备份任务,让该任务与原始任务同时处理同一份数据,并最终选用最先成功运行完成任务的计算结果作为最终结果。

    set mapreduce.map.speculative=true
    set mapreduce.reduce.speculative=true
    set hive.mapred.reduce.tasks.speculative.execution=true
    

合并小文件

  1. 在map执行前合并小文件,减少map数

    # 默认参数
    set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
    
  2. 在Map-Reduce的任务结束时合并小文件

    # 在 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;
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值