`

Hive 优化

    博客分类:
  • hive
 
阅读更多

Hive中跑MapReduce Job出现OOM问题分析及解决

https://blog.csdn.net/oopsoom/article/details/41356251

 

======================================================================================================================================================================================================

 

hive优化1

 

======================================================================================================================================================================================================

 

1.聚合优化

set hive.map.aggr=true;

处罚map阶段顶级聚合过程,这个设置需要更多的内存。

 

2.本地模式

set hive.exec.mode.local.auto=true;

hive会尝试用本地模式执行操作

 

3.join优化

 a.少MapReduce

    select a.ymd,a.price_close,b.price_close,c.price_close

    from stocks a

    join stocks b on a.ymd=b.ymd

    join stocks c on a.ymd=c.ymd

    where a.symbol = 'AAPL' and b.symbol = 'IBM' and c.symbol = 'GE';

on 后面都有相同的a.ymd 可以放一个mapreduce ,在一个mapreduce中连接三张表。

 

b.小表放前面,大表放后面。

    hive会假定最后一个表是最大的表,将前面的表缓存起来。

    当然,也可以智能指定,如:

   select  /*+STREAMTABLE(s) */ s.ymd,s.symbol,s.price_close,d.dividend

   from stock s join dividends d on s.ymd=d.ymd and s.symbol=d.symbol where s.symbol='appl' ;

 

4.LEFT OUTER JOIN优化

 

左连接时,左表中出现的JOIN字段都保留,右表没有连接上的都为空。对于带WHERE条件的JOIN语句,例如:

 

SELECT a.val, b.val FROM a LEFT OUTER JOIN b ON(a.key=b.key)

 

WHERE a.ds='2009-07-07' AND b.ds='2009-07-07'

 

执行顺序是,首先完成2表JOIN,然后再通过WHERE条件进行过滤,这样在JOIN过程中可能会输出大量结果,再对这些结果进行过滤,比较耗时。可以进行优化,将WHERE条件放在ON后,例如:

 

SELECT a.val, b.val FROM a LEFT OUTER JOIN b

 

ON(a.key=b.key AND b.ds='2009-07-07'AND a.ds='2009-07-07')

 

这样,在JOIN的过程中,就对不满足条件的记录进行了预先过滤,可能会有更好的表现。

 

5.Map Side JOIN

 

Map Side JOIN优化的出发点是,Map任务输出后,不需要将数据拷贝到Reducer节点,降低的数据在网络节点之间传输的开销。

多表连接,如果只有一个表比较大,其他表都很小,则JOIN操作会转换成一个只包含Map的Job,例如:

 

SELECT /*+ MAPJOIN(b) */ a.key, a.value FROM a JOIN b ON a.key = b.key

 

对于表a数据的每一个Map,都能够完全读取表b的数据。这里,表a与b不允许执行FULL OUTER JOIN、RIGHT OUTER JOIN。

 

6.并行执行

 

hive的查询会转变成一个或者多个阶段,这样的阶段可以是mapreduce阶段,抽样阶段,合并阶段,limit阶段

或者是hive执行中可能需要的其他阶段。默认情况下,hive只会执行一个阶段,不过某些特定的job会执行多个阶段,而这些阶段有些事没有互相依赖的,这些没有依赖的是可以并行执行的,缩短时间。

 

开发并发执行  set hive.exec.parallel=true;

 

7.jvm重用

?JVM重用是是hadoop调优参数的内容,其对hadoop的性能有非常大的影响,特别对于很难避免小文件的场景或者是task特别多的场景,这类场景大多数执行时间很短,hadoop默认配置通常是使用派生JVM来执行map和reduce任务的,这是jvm启动可能造成很大的开销,尤其是执行的job包含成百上千task任务的情况。JVM重用可以使得JVM实例在同一个job中重新使用了N次。

参数设置  set mapred.job.reuse.jvm.num.tasks=10;

缺点;

开启jvm将会一直占用使用的task插槽,以便进行重用,知道任务完成后才能释放。如果某个不平衡的job中有几个reduce task要比其他的reduce task消耗的时间多的多的话,那么保留的插槽就会一直空闲着却无法被其他的job使用,直到所有的task都结束了才会释放。

 

 

 

 

======================================================================================================================================================================================================

 

hive优化2

 

======================================================================================================================================================================================================

 

1.脚本参数设置

 

1.1 简单列查询不启用mapreduce

 

set hive.fetch.task.conversion=more;

 

 

开启了Fetch任务,所以对于简单的列查询不在启用MapReduce job!

 

例如:SELECT id, money FROM m limit 10;

 

1.2 是否显示表的列名

 

set hive.cli.print.header=true;

 

 

是否显示表的列名。

 

例如:

 

hive> set hive.cli.print.header=true;

hive> select * from t04;

OK

id      name

Time taken: 0.136 seconds

hive> set hive.cli.print.header=false;

hive> select * from t04;

OK

Time taken: 0.08 seconds

 

1.3 设置最大rudece个数

 

set hive.exec.reducers.max=88;

 

最大的reduce的个数为88.

 

1.4 hive输出是否进行压缩

 

 set hive.exec.compress.output=false;

 

 最终结果不压缩

 

 

 

 set hive.exec.compress.intermediate=true;

 

中间结果压缩,决定查询的中间 map/reduce job (中间 stage)的输出是否为压缩格式。

 

 

1.5 合并小文件

 

Set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;

 

在执行之前进行小文件合并

 

set mapred.max.split.size=256000000;

 

合并文件最大为256M

 

set mapred.min.split.size.per.node=1;(设置大小不合理)

 

 

set mapred.min.split.size.per.rack=1;(设置大小不合理)

 

 

例如:

 

set mapred.max.split.size=1000;

 

set mapred.min.split.size.per.node=300;

 

 

set mapred.min.split.size.per.rack=100;

 

 

输入目录下五个文件,rack1下三个文件,长度为2050,1499,10, rack2下两个文件,长度为1010,80. 另外blockSize为500.

 

 

经过第一步, 生成五个split: 1000,1000,1000,499,1000. 剩下的碎片为rack1下:50,10; rack2下10:80

 

 

由于两个rack下的碎片和都不超过100, 所以经过第二步, split和碎片都没有变化.

 

 

第三步,合并四个碎片成一个split, 长度为150.

 

 

1.6 MapJoin机制

 

 set hive.ignore.mapjoin.hint=true;

 

 set hive.auto.convert.join = true;

 

 set hive.smalltable.filesize=1000000000;(设置大小不合理)

 

 

开启mapjoin优化机制

 

1.7队列job名

 

set mapred.queue.name=oia;

 

set mapred.job.queue.name=oia;

 

Set mapred.job.name=oia_${pt_month}_${v_proc_name};

 

 

2.其他参数

 

2.1 本地模式

 

set hive.exec.mode.local.auto=true;

 

Hive会自动选择是否用本地模式

 

 

0.7版本后Hive开始支持任务执行选择本地模式(local mode)。大多数的Hadoop job是需要hadoop提供的完整的可扩展性来处理大数据的。不过,有时hive的输入数据量是非常小的。在这种情况下,为查询出发执行任务的时间消耗可能会比实际job的执行时间要多的多。对于大多数这种情况,hive可以通过本地模式在单台机器上处理所有的任务。对于小数据集,执行时间会明显被缩短。

 

 

如此一来,对数据量比较小的操作,就可以在本地执行,这样要比提交任务到集群执行效率要快很多。

 

2.2 数据倾斜

 

Set hive.groupby.skewindata = true;

 

有数据倾斜的时候进行负载均衡

 

 

2.3 并行执行

 

hive的查询会转变成一个或者多个阶段,这样的阶段可以是mapreduce阶段,抽样阶段,合并阶段,limit阶段

 

或者是hive执行中可能需要的其他阶段。默认情况下,hive只会执行一个阶段,不过某些特定的job会执行多个阶段,而这些阶段有些事没有互相依赖的,这些没有依赖的是可以并行执行的,缩短时间。

 

 

开发并发执行  set hive.exec.parallel=true;

 

 

2.4 jvm重用

 

?JVM重用是是hadoop调优参数的内容,其对hadoop的性能有非常大的影响,特别对于很难避免小文件的场景或者是task特别多的场景,这类场景大多数执行时间很短,hadoop默认配置通常是使用派生JVM来执行map和reduce任务的,这是jvm启动可能造成很大的开销,尤其是执行的job包含成百上千task任务的情况。JVM重用可以使得JVM实例在同一个job中重新使用了N次。

 

参数设置  set mapred.job.reuse.jvm.num.tasks=10;

 

缺点:

 

开启jvm将会一直占用使用的task插槽,以便进行重用,知道任务完成后才能释放。如果某个不平衡的job中有几个reduce task要比其他的reduce task消耗的时间多的多的话,那么保留的插槽就会一直空闲着却无法被其他的job使用,直到所有的task都结束了才会释放。

 

 

 

 

3.join优化

 

3.1 执行计划

 

EXPLAIN SELECT SUM(Number) FROM onecol

 

 

可以看一个sql的执行计划,怎么样解析执行的情况。

 

 

3.2 表顺序

 

小表放前面,大表放后面,hive会假定后面的一张表是大表,将前面的缓存起来。

 

 

3.3 LEFT OUTER JOIN优化

 

 

左连接时,左表中出现的JOIN字段都保留,右表没有连接上的都为空。对于带WHERE条件的JOIN语句,例如:

 

 

 

SELECT a.val, b.val FROM a LEFT OUTER JOIN b ON(a.key=b.key)

 

WHERE a.ds='2009-07-07' AND b.ds='2009-07-07'

 

执行顺序是,首先完成2表JOIN,然后再通过WHERE条件进行过滤,这样在JOIN过程中可能会输出大量结果,再对这些结果进行过滤,比较耗时。可以进行优化,将WHERE条件放在ON后,例如:

 

 

SELECT a.val, b.val FROM a LEFT OUTER JOIN b

 

ON(a.key=b.key AND b.ds='2009-07-07'AND a.ds='2009-07-07')

 

这样,在JOIN的过程中,就对不满足条件的记录进行了预先过滤,可能会有更好的表现。

 

 

 

======================================================================================================================================================================================================

 

常用优化参数

 

======================================================================================================================================================================================================

 

set hive.fetch.task.conversion=more;

 

set hive.cli.print.header=true;

 

set hive.exec.reducers.max=88;

 

set hive.exec.compress.output=false;

 

set hive.exec.compress.intermediate=true;

 

set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;

 

set mapred.max.split.size=128000000;

 

set mapred.min.split.size.per.node=128000000;

 

set mapred.min.split.size.per.rack=128000000;

 

set hive.ignore.mapjoin.hint=true;

 

set hive.auto.convert.join = true;

 

set hive.smalltable.filesize=25000000;

 

--set mapred.queue.name=oia;

 

--set mapred.job.queue.name=oia;

 

--set mapred.job.name=oia_${pt_month}_${v_proc_name};

 

set hive.exec.mode.local.auto=true;

 

set hive.groupby.skewindata = true;

 

set hive.exec.parallel=true;

 

set mapred.job.reuse.jvm.num.tasks=10;

 

 

 

set hive.fetch.task.conversion=more;

set hive.cli.print.header=true;

set hive.exec.reducers.max=88;

set hive.exec.compress.output=false;

set hive.exec.compress.intermediate=true;

set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;

set mapred.max.split.size=128000000;

set mapred.min.split.size.per.node=128000000;

set mapred.min.split.size.per.rack=128000000;

set hive.ignore.mapjoin.hint=true;

set hive.auto.convert.join = true;

set hive.smalltable.filesize=25000000;

set hive.exec.mode.local.auto=true;

set hive.groupby.skewindata = true;

set hive.exec.parallel=true;

set mapred.job.reuse.jvm.num.tasks=10;

 

hive统计parquet表报错

https://blog.csdn.net/lhxsir/article/details/83789102

parquet列式存储格式,所以优先统计某一列:

SELECT count(salesorder_id) FROM tt_sales_order;

 

 

 

 

分享到:
评论

相关推荐

    hive优化总结

    hive优化总结 Hive优化总结是Hive性能优化的总结,涉及HIVE的参数设置、HQL语言的写法、JOIN操作的优化、MapReduce操作的优化、列裁剪、分区裁剪等多个方面。 1. 配置文件优化 Hive的配置文件hive-site.xml是Hive...

    HIVE优化实战分享

    HIVE优化实战分享 大数据存储方案 很好的参考文档

    hive优化案例

    作为企业Hadoop应用的核心产品,Hive承载着FaceBook、淘宝等大佬 95%... 拥有1万多个Hive作业的大电商如何进行Hive优化的?本系列课结合企业实战和场景从作业架构层面、Hql(Hive sql)语法层面、Hive参数层面依次讲述。

    Hive优化.docx

    - **利用Hive对UNION ALL的优化**:Hive优化非嵌套的UNION ALL查询,但嵌套查询不受此优化影响。 5. **Hadoop通用关联实现**: - **关联通过二次排序实现**:关联列作为分区键,关联列和其他列组合形成排序的组键...

    Hive优化案例、Hive数据处理模式、Hive常见问题与优化、Hive实践

    Hive优化案例、Hive数据处理模式、Hive常见问题与优化、Hive实践 Hive是一种基于Hadoop的数据仓库工具,用于对大规模数据进行处理和分析。在大数据时代,Hive的应用非常广泛,本文将从Hive优化案例、Hive数据处理...

    工作总结hive优化

    ### 工作总结:Hive优化 在大数据处理领域,Hive作为一种常用的数据仓库工具,其性能优化一直是数据工程师关注的重点。本文将基于提供的“hive优化”文档内容,深入探讨Hive优化的关键策略与实践技巧。 #### 核心...

    Hive思维导图之Hive优化

    Hive思维导图之Hive优化

    Hive优化方法整理

    Hive 优化方法整理 Hive 优化方法整理是 Hive 数据处理过程中的重要步骤,涉及到 Hive 的类 SQL 语句本身进行调优、参数调优、Hadoop 的 HDFS 参数调优和 Map/Reduce 调优等多个方面。 Hive 类 SQL 语句优化 1. ...

    hive优化经典.pdf

    在处理Hive优化的讨论中,关键因素之一是控制Hive任务中的Map数量,这直接影响作业的效率和资源消耗。在Hive中,一个作业是通过分析input目录下的数据文件来创建一个或多个Map任务的,而影响Map数量的主要因素包括...

    Hive优化以及执行原理

    一、Hive优化 1. **元数据优化**:Hive依赖于元数据服务(如MySQL或Derby)来存储表结构和分区信息。确保元数据服务器的性能稳定,可以减少查询解析时间。 2. **分区策略**:通过为大表创建合适的分区,可以显著...

    hive优化.docx

    Hive优化方法 Hive是一个基于Hadoop的数据仓库工具,用于存储和处理大规模数据。然而,在Hive开发过程中,常见的性能问题之一是数据倾斜问题。数据倾斜是指在数据处理时,某些key值或某些记录出现了异常高的频率,...

    Hive 优化以及执行原理

    1. **表分区**:分区是Hive优化的基础,通过将大表划分为小的逻辑部分,可以显著提高查询速度。合理的分区策略应基于查询中常用的过滤条件,例如日期、地区等。 2. ** bucketing 和 sorting**:通过bucketing,数据...

    hive优化(ppt)

    因此,进行Hive优化变得尤为重要,本文将深入探讨Hive优化中的几个关键知识点,包括分区裁剪、列裁剪、多表关联、多表插入以及左半连接等策略,并探讨如何通过改变存储格式和启用压缩来进一步提升性能。 ### 分区...

    hive 优化思维导图

    hive 优化在面试以及工作中经常使用,我整理了一份思维导图供大家学习。

    大数据开发+hive优化方法大全+hql优化

    【大数据开发+hive优化方法大全+hql优化】 在大数据处理领域,Hive 是一个非常重要的工具,它提供了基于 SQL 的查询语言(HQL)来处理大规模数据集。针对Hive的性能优化,可以从多个方面进行,包括SQL语句优化、...

    Hive优化.xmind

    Hive优化.xmind

    hive优化 PDF 下载

    **Hive 优化详解** Hive 是一个基于 Hadoop 的数据仓库工具,它允许用户使用 SQL 类似的查询语言(HQL)来访问存储在分布式文件系统中的大规模数据集。Hive 的主要优势在于其易用性和对大数据处理的高可扩展性。...

    hive 面试宝典 spark hive优化

    hive 面试宝典,hive常见问题,hive优化非常详细

    Hive优化(思维导图)

    Hive优化(思维导图)

Global site tag (gtag.js) - Google Analytics