热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

hive优化_hive优化

篇首语:本文由编程笔记#小编为大家整理,主要介绍了hive优化相关的知识,希望对你有一定的参考价值。集群资源QA集群

篇首语:本文由编程笔记#小编为大家整理,主要介绍了hive优化相关的知识,希望对你有一定的参考价值。



集群资源

QA集群

                           


队列资源

hive优化

使用的是 solution队列。资源如上图所示,在$KYLIN_HOME/conf/kylin_job_conf.xml配置文件中,看到给map和reduce分配的内存大小都是1GB


数据量















































表名

行数

重复行数

是否分区表

类型

customer_address_text

94000

0

维度表

customer_address_text_add 

6094000

0

维度表

customer_text

188003

0

维度表

customer_text_add1

6188000

0

维度表

store_sales_reduce_text

60639378

52000001

事实表



测试整体思路

针对维表的大小分开进行2类测试,一类大的维度表,一类小的维度表,在对2类各做了内存修改的测试,分别为1G,2G,4G。因为在观测中发现,在cube构建第一步完成过程中,stage1和stage2 这2个stage 消耗时间长,所以着重记录了这2个步骤的时间。测试数据会在下面的截图体现出来。


基准测试

1.配置文件项








     

         dfs.replication

         2

         Block replication

     

 

     

         hive.exec.compress.output

         true

         enable compress

     

 

     

         hive.auto.convert.join

         false

         Enables the optimization about converting common  join into mapjoin

     

 

     

         hive.auto.convert.join.noconditionaltask

         true

         enable map-side join

     

 

     

         hive.auto.convert.join.noconditionaltask.size

         100000000

         enable map-side join

     

 

     

         mapreduce.job.split.metainfo.maxsize

         -1

         The maximum permissible size of the split metainfo  file.

            The JobTracker won't attempt to  read split metainfo files bigger than

            the configured value. No limits  if set to -1.

         

     

 

     

         hive.stats.autogather

         true

         Collect statistics for newly created intermediate  table

     

 

     

         hive.merge.mapfiles

         false

         Disable Hive's auto merge

     

 

     

         hive.merge.mapredfiles

         false

         Disable Hive's auto merge

     

 


Skew Join测试

基准测试的配置文件中添加入以下参数








   

         hive.groupby.skewindata

         true

     

   

         hive.optimize.skewjoin

         true

     

   

         hive.skewjoin.key

         100000

     

 

 


人工设置reducer个数测试

基准测试的配置文件中添加入以下参数








         hive.exec.reducers.max

         200

     

     

        mapred.reduce.tasks

        200

     

     

         hive.exec.reducers.bytes.per.reducer

         1000000000

     

     

         hive.groupby.mapaggr.checkinterval

         10000

     

这里会进行2次测试,一次不设置mapred.reduce.tasks 一次设置 mapred.reduce.tasks


mapjoin测试








     

         dfs.replication

         2

         Block replication

     

 

     

         hive.exec.compress.output

         true

         enable compress

     

 

   

         hive.auto.convert.join

         false

         Enables the optimization about converting common  join into mapjoin

   

 

     

         hive.auto.convert.join.noconditionaltask

         true

         enable map-side join

     

 

     

         hive.auto.convert.join.noconditionaltask.size

         100000000

         enable map-side join

     

 

     

         mapreduce.job.split.metainfo.maxsize

         -1

         The maximum permissible size of the split metainfo  file.

            The JobTracker won't attempt to  read split metainfo files bigger than

            the configured value. No limits  if set to -1.

         

     

 

     

         hive.stats.autogather

         true

         Collect statistics for newly created intermediate  table

     

 

     

         hive.merge.mapfiles

         false

         Disable Hive's auto merge

     

 

     

         hive.merge.mapredfiles

         false

         Disable Hive's auto merge

     

 

补充说明:在较大维表类的mapjoin测试中,发现也产生了reduce过程,需加大 hive.auto.convert.join.noconditionaltask.size 参数值,该参数在kylin_hive_conf.xml文件中,并且在kylin_hive_conf.xml要加大mapreduce.map.java.opts参数值,一般需要加到内存参数值的70%-80%,(-Xmx640m-XX:MaxDirectMemorySize=256M -XX:OnOutOfMemoryError='kill -9 %p) 括号表示参数值,高亮部分替换即可。

如何生成大维度表

说明:上述测试中,维度表较小,并不能明显体现出修改参数带来的效果,所以,接下来的三组测试中维度表都是6百万的数据量,大小各在400MB左右



  1. 在hive上执行show create table table_name,获取建表语句,转换成mysql的见表语句


  2. 在mysql上建立表,更具hive上原有所对应的表设置自增列,指定具体值自增









  3. 3.      CREATE TABLE `customer_text`(

    4.      `c_customer_sk` bigint  UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,

    5.      `c_customer_id` varchar(20),

    6.      `c_current_cdemo_sk` bigint,

    7.      `c_current_hdemo_sk` bigint,

    8.      `c_current_addr_sk` bigint,

    9.      `c_first_shipto_date_sk`  bigint,

    10.    `c_first_sales_date_sk`  bigint,

    11.    `c_salutation` varchar(20),

    12.    `c_first_name` varchar(20),

    13.    `c_last_name` varchar(20),

    14.    `c_preferred_cust_flag`  varchar(20),

    15.    `c_birth_day` int,

    16.    `c_birth_month` int,

    17.    `c_birth_year` int,

    18.    `c_birth_country`  varchar(20),

    19.    `c_login` varchar(20),

    20.    `c_email_address`  varchar(20),

    21.    `c_last_review_date`  varchar(20))

    22.    AUTO_INCREMENT=200000


比如建立个customer_text表

3.写存储过程往表里插入重复数据








delimiter $$$

CREATE PROCEDURE search_one ()

BEGIN

 

DECLARE i INT DEFAULT 0 ;

SET i = 0 ; START TRANSACTION ;

WHILE i <1000000 DO

       INSERT  INTO customer_text (

              c_customer_id,

              c_current_cdemo_sk,

              c_current_hdemo_sk,

              c_current_addr_sk,

              c_first_shipto_date_sk,

              c_first_sales_date_sk,

              c_salutation,

              c_first_name,

              c_last_name,

              c_preferred_cust_flag,

              c_birth_day,

              c_birth_month,

              c_birth_year,

              c_birth_country,

              c_login,

              c_email_address,

              c_last_review_date

       )

VALUES

       (

              "aaa",

              1,

              1,

              1,

              1,

              1,

              "aaa",

              "aaa",

              "aaa",

              "aaa",

              1,

              1,

              1,

              "aaa",

              "aaa",

              "aaa",

              "aaa"

       )  ;

SET i = i + 1 ;

END

WHILE ; COMMIT ;

END$$$

 

delimiter ; CALL search_one () ;

导出为csv文件,load到hive中


图表对比

大维度表测试



小维度表测试



结论     



  1. 维度表小于300M时,开启mapjoin,会提升cube构建第一步效率。


  2. 维度表超过300M, 在发生数据倾斜时候,设置skewjoin相关参数是最优解决方案。


  3. 发生数据倾斜,加大资源会导致并发数降低,虽然可以减少时间,但不是最优方案。


  4. 设置过多或者说不合理的reduce 数量,对构建效率会起到负作用。



参数使用说明

hive.exec.reducers.max

这个参数控制一个job会有多少个reducer来处理,依据的是输入文件的总大小。默认1GB

mapred.reduce.tasks

这个参数指定整个application执行的过程中会有多少个reduce执行

如果不指定mapred.reduce.tasks hive会自动计算需要多少个reducer

reduce的个数设置对执行效率有很大的影响:

1、如果reduce太少:  如果数据量很大,会导致这个reduce异常的慢,从而导致这个任务不能结束,也有可能会OOM

2、如果reduce太多:  产生的小文件太多,合并起来代价太高,namenode的内存占用也会增大

hive.groupby.mapaggr.checkinterval

这个是group的键对应的记录条数超过这个值则会进行分拆,值根据具体数据量设置

hive.groupby.skewindata

如果是group by过程出现倾斜应该设置为true

hive.skewjoin.key

这个是join的键对应的记录条数超过这个值则会进行分拆,值根据具体数据量设置

hive.optimize.skewjoin

如果是join 过程出现倾斜应该设置为true

hive.auto.convert.join

如果使用mapjoin,应该设置为true

以上参数对该两类测试的影响

hive.auto.convert.join的开启在小维表时候效率明显,把2个小维表加载到内存和事实表join,避免了reduce操作,节省时间。hive.exec.reducers.maxmapred.reduce.tasks参数的设置增加了reduce数量,但同时由于设置数量过大,导致效率并没有明显变化,hive.skewjoin.keyhive.optimize.skewjoin这两个参数在同类对比中测试效果中,表现突出。效率上得到很大提升。


知识点

通过hive.groupby.skewindata=true控制生成两个MR Job,第一个MR Job Map的输出结果随机分配到reduce做次预汇总,减少某些key值条数过多某些key条数过小造成的数据倾斜问题。

reduce数量由以下三个参数决定,

mapred.reduce.tasks(强制指定reduce的任务数量)

hive.exec.reducers.bytes.per.reducer(每个reduce任务处理的数据量,默认为1000000000=1G)

hive.exec.reducers.max(每个任务最大的reduce数,默认为999)

计算reducer公式N=min( hive.exec.reducers.max ,总输入数据量/ hive.exec.reducers.bytes.per.reducer )

个人测试心得:



  1. 1.     估算数据量输入大小,设置合适的reduce数量,如果重复记录多开启hive.optimize.skewjoin参数,设置hive.skewjoin.key大小。


  2. 2.     维度表小,且与事实表中关联的key不存在重复数据,应当开启mapjoin模式。


  3. 3.     依据数据量的大小,相应增加内存资源。


 



推荐阅读
  • Hadoop之Yarn
    目录1Hadoop1.x和Hadoop2.x架构区别2Yarn概述3Yarn基本架构4Yarn工作机制5作业提交全过程6资源调度器7任务的推测执行1Hadoop1.x和Hadoo ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • 从批量eml文件中提取附件的Python代码实现方法
    本文介绍了使用Python代码从批量eml文件中提取附件的实现方法,包括获取eml附件信息、递归文件夹下所有文件、创建目的文件夹等步骤。通过该方法可以方便地提取eml文件中的附件,并保存到指定的文件夹中。 ... [详细]
  • 对于开源的东东,尤其是刚出来不久,我认为最好的学习方式就是能够看源代码和doc,測试它的样例为了方便查看源代码,关联导入源代 ... [详细]
  • MapReduce 切片机制源码分析
     总体来说大概有以下2个大的步骤1.连接集群(yarnrunner或者是localjobrunner)2.submitter.submitJobInternal()在该方法中会创建 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • HDFS2.x新特性
    一、集群间数据拷贝scp实现两个远程主机之间的文件复制scp-rhello.txtroothadoop103:useratguiguhello.txt推pushscp-rr ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • 突破MIUI14限制,自定义胶囊图标、大图标样式,支持任意APP
    本文介绍了如何突破MIUI14的限制,实现自定义胶囊图标和大图标样式,并支持任意APP。需要一定的动手能力和主题设计师账号权限或者会主题pojie。详细步骤包括应用包名获取、素材制作和封包获取等。 ... [详细]
  • 超级简单加解密工具的方案和功能
    本文介绍了一个超级简单的加解密工具的方案和功能。该工具可以读取文件头,并根据特定长度进行加密,加密后将加密部分写入源文件。同时,该工具也支持解密操作。加密和解密过程是可逆的。本文还提到了一些相关的功能和使用方法,并给出了Python代码示例。 ... [详细]
  • MySQL多表数据库操作方法及子查询详解
    本文详细介绍了MySQL数据库的多表操作方法,包括增删改和单表查询,同时还解释了子查询的概念和用法。文章通过示例和步骤说明了如何进行数据的插入、删除和更新操作,以及如何执行单表查询和使用聚合函数进行统计。对于需要对MySQL数据库进行操作的读者来说,本文是一个非常实用的参考资料。 ... [详细]
author-avatar
久福网_382
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有