大数据-浅谈hive优化

本文探讨了Hive的优化策略,包括fetch抓取、本地模式、表优化如大小表join、MapJoin、group by等,以及MR优化、并行执行、严格模式、JVM重用和推测执行等,旨在提升大数据处理效率。
摘要由CSDN通过智能技术生成

fetch抓取
  • hive在某些情况下可以不必使用MapReduce计算,例如select * from table1;这种情况下,hive可以简单的读取table1对应的存储目录下的文件,然后输出查询结果到控制台.
  • 在hive-default.xml文件里配置,默认是more,在全局查找,字段查找,limit查找等都不走MapReduce
本地模式
  • 大多数的hadoop job是需要hadoop提供完整的可扩展性来处理大数据的,不过,有时hive的输入数据量是非常小的,在这种情况下,为查询触发执行任务消耗的时间可能比实际job执行的时间要多得多,对于这种情况,hive可以通过本地模式在单台机器上处理所有的事务,对于小数据集来说,执行时间可以明显缩短.
  • 通过设置 hive.exec.mode.local.auto=true,让hive在适当的时候自动启动这个优化
  • hive.exec.mode.local.auto.inputbytes.max ,设置本地模式的最大输入数据量,当数据量小于这个值时会采用本地模式
  • hive.exec.mode.local.auto.input.files.max,设置本地模式的最大输入文件个数,当输入文件个数小于这个值时会采用本地模式
表优化
大小表join
  • 将key相对分散,数据量小的表放在join左边,这样就可以减少内存溢出错误发生的概率,可以使用map join 将小的维度表先进内存,在map端完成reduce.在新版hive中对大小表进行了优化
大表join大表
  • 空key过滤
    有时join超时是因为某些key对应的数据太多,而相同key对应的数据都会发送到相同的reducer上,从而导致内存不够,此时我们应该仔细分析这些异常的key,很多情况下,这些key对应的数据是异常数据,我们需要在SQL语句中进行过滤
  • 空key转换
    某些key为空,但是对应的数据不是异常数据,此时可以为key为空的字段赋一个随机值,使得数据均匀分布在不同的reduce
  • Map join
    如果不指定MapJoin或者不符合MapJoin的条件,那么hive解析器会将Join操作转换成Common Join,即: 在Reduce 阶段完成join,容易发生数据倾斜.可以用MapJoin把小表全部加载到内存,在map端进行join,避免reduce处理
    开启MapJoin功能: hive.auto.convert.join = true
  • group by
    默认情况下,map阶段同一key数据分发给一个reduce,当一个key数据过大时就倾斜了.并不是所有的聚合操作都需要在reduce端完成,很多聚合操作都可以先在map端进行部分聚合,最后在reduce端得出最终结果.
    开启map端聚合: hive.map.aggr=true;
    在map端聚合操作的条目数目: hive.groupby.mapaggr.checkinterval
    有数据倾斜时进行负载均衡: hive.groupby.skewindata
    当开启该功能时,生成的查询计划会有两个MR job,第一个job中,map的输出结果会随机分布到reduce中,每个reduce做部分聚合操作,并输出结果,这样的话相同的key可能会被分发到不同的reduce中,从而达到负载均衡的目的;第二个job再根据预处理的数据结果按照key分布到reduce中,保证相同的key被分布到同一个reduce中,最后完成最终的聚合操作
  • 去重统计
    使用count(distinct )的时候,数据量大的时候,由于count distinct 操作需要用一个reduce task来完成,这一个reduce需要处理的数据量太大,就会导致整个job很难完成,一般count distinct 使用先group by 再count 的方式替换.
  • 笛卡尔积
    尽量避免笛卡尔积,join的时候加入on条件,不要添加无效的on条件
  • 行列过滤
    列: 在select的时候,不要使用*,老老实实的写自己需要的列字段
    行: 在分区裁剪中,当使用外关联的时候,如果将副表的过滤条件写在where后面,那么就会先全表关联,之后再过滤,保险起见就用子查询
  • 动态分区调整
    hive里有个动态分区机制,根据指定分区字段的值,将数据分区.
    开启动态分区功能: hive.exec.dynamic.partition=true
    设置为非严格模式: hive.exec.max.dynamic.partition=nonstrict
    设置动态分区最大数: hive.exec.max.dynamic.partitions=10000
MR优化
  • 合理设置map数
    决定map个数的有input的文件总个数,input的文件大小,集群设置的文件块大小.
    当一个任务有很多小文件的时候,每个小文件都被当做一个块,用一个map任务来完成,而一个map任务的启动和初始化的时间远远大于逻辑处理时间,就会造成很大的资源浪费,这时候就需要减少map数.
    当一个128MB的标准块文件被一个map处理的时候,如果这个文件字段少条数多,而且处理逻辑复杂,用一个map任务去做,那也很浪费时间,所以这时候需要增加map数

  • 小文件合并
    在map执行前合并小文件,减少map数: CombineHiveInputFormat 具有对小文件合并的功能,hiveInputFormat没有对小文件合并功能.
    hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat

  • 合理设置reduce数
    ① 设置每个reduce处理的数据量: hive.exec.reducers.bytes.per.reducer
    ② 每个任务最大的reduce数: hive.exec.reducers.max
    ③ reduce数: Num = min(参数②,输入数据量/参数①)
    或者在hadoop的文件中直接配置:
    mapreduce.job.reduces

    reduce 的个数决定了输出文件的个数,如果reduce个数过多,那么就会生成多个小文件,这些小文件要是作为下一个任务的输入则会出现小文件过多的问题,在设置reduce个数的时候, 要利用合适的reduce个数使每个reduce处理的数据大小合适.

并行执行
  • hive会将一个查询转化成一个或者多个阶段,例如mapreduce阶段,抽样阶段,合并阶段,limit阶段等.某个job可能包含好多阶段,而这些阶段可能并非完全依赖,有些阶段可以并行执行,这样就缩短了整个job的执行时间.
  • 打开任务并行执行: hive.exec.parallel=true
  • 允许最大并行度: hive.exec.parallel.thread.number
严格模式
  • hive提供了一个严格模式,防止用户执行那些可能意想不到的不好影响的查询.
  • 设置参数: hive.mapred.mode=strict
  • 开启严格模式后会禁止三种类型的查询
    ① 对于分区表,除非where语句中含有分区字段过滤条件,否则不允许执行.
    ② 对于使用了order by语句的查询,要求必须使用limit语句,因为order by为了执行排序会将所有的结果数据发送到同一个reducer中进行处理,强制要求用户增加limit语句防止reducer执行时间过长
    ③ 限制笛卡尔积的查询.
JVM重用
  • JVM重用是hadoop调优参数的内容,其对hive的性能具有非常大的影响,特别是对于很难避免小文件的场景或task特别多的场景,这类场景大多数执行时间都很短
  • hadoop的默认配置通常是使用派生JVM来执行map和reduce任务,这时JVM的穹顶过程可能会造成想当大的开销,尤其是执行job包含有成百上千的task的任务的情况.JVM重用可以使得JVM实例在同一个job中重新使用N次,N的值可以在mapred-site.xml文件中进行配置. mapreduce.job.jvm.numtasks
  • 开启JVM重用将一直占用使用到的task插槽,以便进行重用,直到任务完成后才能释放,如果某个不平衡的job中某几个reduce task执行时间要比其他的reduce task消耗的时间多的多的话,那么保留的插槽就会一直空闲着无法被其他的job使用,直到所有的task都结束了才会释放
推测执行
  • 在分布式环境下,由于负载不均衡或者资源分配不均匀等原因,会造成同一个作业的多个任务之间运行速度不一致,有些任务的运行速度可能明显慢于其他任务,则这些任务会拖慢作业的整体执行进度.
  • Hadoop为了解决这个问题,采用了推测执行(Speculative Execution)机制,根据一定的法则推测出执行慢的任务,并为这样的任务启动一个备份任务,让该任务和原始任务一起处理同一份数据,并最终选择最先成功运行完成任务的计算结果作为最终结果.
  • 在mapred-site.xml 文件中配置: mapreduce.map.speculative mapreduce.reduce.speculative
  • hive本身也提供了配置: hive.reduce.tasks.speculative.execution
执行计划(explain)
  • 语法: explain [extended | dependency | authorized] query

  • extended 格式分三个部分,ABSTRACT SYNTAX TREE(AST) 抽象语法树,用于快速理清一段代码的逻辑;STAGE DEPENDENCIES,描述最终生成的作业数;STAGE PLANS,用户描述程序的执行逻辑;PATH,用于描述输入的分区信息.

  • dependency 格式的解释计划用于描述整个SQL需要依赖的输入数据,分为俩部分input_partitions,input_tables,主要用于排错和理清程序依赖表的输入

  • authorized 格式的解释计划这个语句用来表达用户对哪些inputs有读操作,对哪些outputs有写操作

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值