`
书音棋
  • 浏览: 145375 次
  • 性别: Icon_minigender_1
  • 来自: 哈尔滨
社区版块
存档分类
最新评论

【转】hive优化

阅读更多

1.当hive执行join内存溢出时,可以修改hive的配置文件hive-site.xml,增大内存,如下: mapred.child.java.opts -Xmx 1024m

2.hive默认建表时的路径也可以在hive-site.xml里配置,如下: hive.metastore.warehouse.dir value >/user/hive/warehouse description >location of default database for the warehouse

3.执行join操作的时候,尽量把小表放前面,大表放前面可能会因为内存溢出而出错

4.对分区表进行操作需要对分区进行过滤(如:ds=$yday)。 特别是在JOIN操作的时候,分区过滤(如:ds=$yday)需要放到 ON语句 或子查询 里面。不能放到ON后面的WHERE里,这样会扫描所有表,最后才判断分区。也就是说程序会先执行JOIN操作,才会执行最后的WHERE操作。

5.在JOIN操作中,后面被连续JOIN且同一字段,只会执行一个mapreduce操作。 SELECT * FROM a LEFT OUTER JOIN b ON a.t=b.t LEFT OUTER JOIN c ON a.t=c.t; 推荐的 SELECT * FROM a LEFT OUTER JOIN b ON a.t=b.t LEFT OUTER JOIN c ON b.t=c.t; 效率低下的

6.当一个大表和一个很小的表进行JOIN操作的时候,使用MAPJOIN操作,这样会把小表读入内存进行JOIN,只需要一个map操作JOIN 就完成了 select /*+ mapjoin(a)*/ a.c1,b.c2,b.c3 from a join b on a.c4=b.c4;

7.通过设置hive.merge.mapfiles可以关闭hive对于扫描表的优化,但有时候会提高效率。默认值为true。可以视情况设置:只含有SELECT的语句 或 MAPJOIN 推荐使用

8.ALTER TABLE a SET SERDEPROPERTIES('serialization.null.format' = ''); 可以使结果表不出现\N字符串,而用空串代替

列裁剪(Column Pruning)

在读数据的时候,只读取查询中需要用到的列,而忽略其他列。例如,对于查询:

SELECT a,b FROM T WHERE e < 10; 

其中,T 包含 5 个列 (a,b,c,d,e),列 c,d 将会被忽略,只会读取a, b, e 列

这个选项默认为真: hive.optimize.cp = true

分区裁剪(Partition Pruning)

在查询的过程中减少不必要的分区。例如,对于下列查询:

SELECT * FROM (SELECT c1, COUNT(1)   FROM T GROUP BY c1) subq   WHERE subq.prtn = 100;  SELECT * FROM T1 JOIN   (SELECT * FROM T2) subq ON (T1.c1=subq.c2)   WHERE subq.prtn = 100; 

会在子查询中就考虑 subq.prtn = 100 条件,从而减少读入的分区数目。

此选项默认为真:hive.optimize.pruner=true

Join

在使用写有 Join 操作的查询语句时有一条原则:应该将条目少的表/子查询放在 Join 操作符的左边。原因是在 Join 操作的 Reduce 阶段,位于 Join 操作符左边的表的内容会被加载进内存,将条目少的表放在左边,可以有效减少发生 OOM 错误的几率。

对于一条语句中有多个 Join 的情况,如果 Join 的条件相同,比如查询:

INSERT OVERWRITE TABLE pv_users   SELECT pv.pageid, u.age FROM page_view p   JOIN user u ON (pv.userid = u.userid)   JOIN newuser x ON (u.userid = x.userid); 
  • 如果 Join 的 key 相同,不管有多少个表,都会则会合并为一个 Map-Reduce
  • 一个 Map-Reduce 任务,而不是 ‘n’ 个
  • 在做 OUTER JOIN 的时候也是一样

如果 Join 的条件不相同,比如:

  INSERT OVERWRITE TABLE pv_users     SELECT pv.pageid, u.age FROM page_view p     JOIN user u ON (pv.userid = u.userid)     JOIN newuser x on (u.age = x.age); 

Map-Reduce 的任务数目和 Join 操作的数目是对应的,上述查询和以下查询是等价的:

  INSERT OVERWRITE TABLE tmptable     SELECT * FROM page_view p JOIN user u     ON (pv.userid = u.userid);    INSERT OVERWRITE TABLE pv_users     SELECT x.pageid, x.age FROM tmptable x     JOIN newuser y ON (x.age = y.age); 

Map Join

Join 操作在 Map 阶段完成,不再需要Reduce,前提条件是需要的数据在 Map 的过程中可以访问到。比如查询:

  INSERT OVERWRITE TABLE pv_users     SELECT /*+ MAPJOIN(pv) */ pv.pageid, u.age     FROM page_view pv       JOIN user u ON (pv.userid = u.userid); 

可以在 Map 阶段完成 Join,如图所示:

相关的参数为:

  • hive.join.emit.interval = 1000 How many rows in the right-most join operand Hive should buffer before emitting the join result.
  • hive.mapjoin.size.key = 10000
  • hive.mapjoin.cache.numrows = 10000

Group By

  • Map 端部分聚合:
    • 并不是所有的聚合操作都需要在 Reduce 端完成,很多聚合操作都可以先在 Map 端进行部分聚合,最后在 Reduce 端得出最终结果。
    • 基于 Hash
    • 参数包括:
      • hive.map.aggr = true 是否在 Map 端进行聚合,默认为 True
      • hive.groupby.mapaggr.checkinterval = 100000 在 Map 端进行聚合操作的条目数目
  • 有数据倾斜的时候进行负载均衡
    • hive.groupby.skewindata = false
    • 当选项设定为 true,生成的查询计划会有两个 MR Job。第一个 MR Job 中,Map 的输出结果集合会随机分布到 Reduce 中,每个 Reduce 做部分聚合操作,并输出结果,这样处理的结果是相同的 Group By Key 有可能被分发到不同的 Reduce 中,从而达到负载均衡的目的;第二个 MR Job 再根据预处理的数据结果按照 Group By Key 分布到 Reduce 中(这个过程可以保证相同的 Group By Key 被分布到同一个 Reduce 中),最后完成最终的聚合操作。

合并小文件

文件数目过多,会给 HDFS 带来压力,并且会影响处理效率,可以通过合并 Map 和 Reduce 的结果文件来消除这样的影响:

  • hive.merge.mapfiles = true 是否和并 Map 输出文件,默认为 True
  • hive.merge.mapredfiles = false 是否合并 Reduce 输出文件,默认为 False
  • hive.merge.size.per.task = 256*1000*1000 合并文件的大小
分享到:
评论

相关推荐

    Hive思维导图之Hive优化

    Hive思维导图之Hive优化

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

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

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

    hive参数优化总结

    Hive 参数优化总结 Hive 是一个基于 Hadoop 的数据仓库工具,用于对大规模数据进行查询、分析和处理。为了提高 Hive 的性能和效率,参数优化是非常重要的一步。本文档将总结 Hive 参数优化的相关知识点,并对 Hive ...

    Hive优化.xmind

    Hive优化.xmind

    hive 优化思维导图

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

    hive优化经典.pdf

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

    hive优化建议.docx

    然而,随着数据量的不断增长,Hive 的性能优化变得至关重要。本篇文章将深入探讨针对Hive进行优化的一些关键策略。 首先,我们来关注一个常见的问题——慎用 `count(distinct(columnA))` 函数。在处理大数据集时,...

    Hive 优化以及执行原理

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

    Hive优化以及执行原理

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

    hive优化.docx

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

    hive优化(ppt)

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

    Hive性能优化总结

    ### Hive性能优化总结 #### 一、Hadoop与Hive计算框架特性引发的问题 Hadoop作为大数据处理平台,其核心优势在于能够高效处理大规模数据集。然而,在具体的应用场景中,尤其是在Hive作为数据仓库使用时,仍存在...

Global site tag (gtag.js) - Google Analytics