Hive会将执行的SQL语句翻译成对应MapReduce任务,当SQL语句比较简单时,性能还是可能处于可接受的范围。但是如果涉及到非常复杂的业务逻辑,特别是通过程序的方式(一些模版语言生成)生成大量判断语句时,出现的问题就会比较多。
 

精简Hive使用的SQL

 
当前项目中如果打包的数量过多,是当前性能的最大瓶颈,在做SQL优化时,至少会存在一个这样的SQL,当打包数量上百甚至到1千后,就会产生大量的 IF/OR 语句:
 IF((
( true == true AND caid==2002158 AND rcode IN (12) AND spid IN('6rO6w') AND (dateid >= 20141225 AND dateid <= 20141227)) ),'PACKAGE_0','') PACKAGE_0,
IF((
( true == true AND caid==2002158 AND rcode IN (20) AND spid IN('6rO6x') AND (dateid >= 20141225 AND dateid <= 20141227)) ),'PACKAGE_1','') PACKAGE_1,
IF((
( true == true AND caid==2002158 AND rcode IN (124) AND spid IN('6rO6y') AND (dateid >= 20141225 AND dateid <= 20141227)) ),'PACKAGE_2','') PACKAGE_2,
IF((
( true == true AND caid==2002158 AND rcode IN (33) AND spid IN('6rO6z') AND (dateid >= 20141225 AND dateid <= 20141227)) ),'PACKAGE_3','') PACKAGE_3,
IF((
( true == true AND caid==2002158 AND rcode IN (126) AND spid IN('6rO70') AND (dateid >= 20141225 AND dateid <= 20141227)) ),'PACKAGE_4','') PACKAGE_4,
此时,执行的效率会非常低,目测在过千万级的日志量时,往往会执行天数据量级的耗时。在当前Reducer阶段中执行时的堆栈:


 
通过定时的取样,发现在Map过程中大部分的时间消耗在这种If/Or调用。
 
最终考虑将其优化成一个UDF,这样SQL就可以不用重写成多个了,经过测试发现优化效果非常好,同时只需指定两个外部文件即可。
 
split_package(caid, rcode, spid, dateid, "./524_1_1", "./Region-000000000000000000000008-top100") package_list
 
此时,应该在SQL中事先将其通过ADD FILE的方式加入资源,才能正常使用:
 
ADD FILE ./Region-000000000000000000000008-top100;
ADD FILE ./524_1_1;
我们通过这种方式,成功地将SQL语句缩短,并将执行时间由原来的1天缩减至5小时内,解决了当前发现的最大瓶颈。
 
对于其他可能导致SQL过长的问题,同样都采用该方式统一解决。
 
此外,由于数据中的每一行中都会调用到UDF,因此对于UDF函数中算法的一小步改进,都能够对整体效率起到很大的提升。
 
此外,Hive在提交任务时,会启动一个本地的JVM来对当前执行的SQL进行解析,如果SQL的长度过长时,也是一个非常耗时的过程。比如一个非常极端的例子,在我们的服务器上,有一次执行了2w行的SQL,解析时间居然消耗了50分钟左右!因此,减少SQL行数是必须可少的步骤,同时也需要保证提交任务的服务器有一定的资源,否则在提交任务时过于耗时。
 
上个步骤只不过是优化的第一个步骤,后续会继续针对性能问题进行进一步的优化,因为我们当前的系统距离产品的要求还是有一定的差距的,优化无止境……
 
 

Hive语句执行优化-简化UDF执行过程的更多相关文章

  1. oracle中sql语句的优化

    oracle中sql语句的优化 一.执行顺序及优化细则 1.表名顺序优化 (1) 基础表放下面,当两表进行关联时数据量少的表的表名放右边表或视图: Student_info   (30000条数据)D ...

  2. hive高阶1--sql和hive语句执行顺序、explain查看执行计划、group by生成MR

    hive语句执行顺序 msyql语句执行顺序 代码写的顺序: select ... from... where.... group by... having... order by.. 或者 from ...

  3. MySQL 执行优化查询

    查询执行的基础 当希望MySQL能够以更高的性能运行查询时,最好的办法就是弄清楚MySQL是如何优化和执行查询的.当向MySQL发送一个请求的时候,MySQL执行过程如图1-1所示: 图1-1 查询执 ...

  4. CCS3.3下执行优化

    最近想研究一下CCS下的程序优化,之前也了解一些,现在查阅一下资料,整理一下. 当然优化有很多种,我本次先说的是执行优化方式. 首先打开我们自己的工程.工程文件若显示为黄色的,则表示此文件默认优化选项 ...

  5. MySQL执行计划显示与执行过程不符合一例

    一 建表和现象的过程如下 CREATE TABLE t1 (id1 INT, a1 INT, b1 INT, PRIMARY KEY(id1));CREATE TABLE t3 (id3 INT UN ...

  6. Oracle 课程五之优化器和执行计划

    课程目标 完成本课程的学习后,您应该能够: •优化器的作用 •优化器的类型 •优化器的优化步骤 •扫描的基本类型 •表连接的执行计划 •其他运算方式的执行计划 •如何看执行计划顺序 •如何获取执行计划 ...

  7. 一条SQL语句在MySQL中如何执行的

    本篇文章会分析一个 sql 语句在 MySQL 中的执行流程,包括 sql 的查询在 MySQL 内部会怎么流转,sql 语句的更新是怎么完成的. 在分析之前我会先带着你看看 MySQL 的基础架构, ...

  8. mysql之优化器、执行计划、简单优化

    mysql之优化器.执行计划.简单优化 2018-12-12 15:11 烟雨楼人 阅读(794) 评论(0) 编辑 收藏 引用连接: https://blog.csdn.net/DrDanger/a ...

  9. 一条 SQL 语句在 MySQL 中如何执行的

    一 MySQL 基础架构分析 1.1 MySQL 基本架构概览 下图是 MySQL 的一个简要架构图,从下图你可以很清晰的看到用户的 SQL 语句在 MySQL 内部是如何执行的. 先简单介绍一下下图 ...

随机推荐

  1. vim+ctags用法

    vim用法     在VIM编辑器的环境下用":make"就可以编译程序,如果程序中有错误,就会显示出来.          下列命令可以快速定位,并修改错误错误 ":c ...

  2. DW数据仓库与ODS的区别

    这两天接触到ODS,开始很纳闷,有了DW(Data Warehouse)干嘛还要ODS(Operational Data Store),于是不查不知道,一查吓一跳,这里面还有这么多道道,这里总结一下, ...

  3. iOS 阶段学习第四天笔记(循环)

    iOS学习(C语言)知识点整理笔记 一.分支结构 1.分支结构分为单分支 即:if( ){ } ;多分支 即:if( ){ }else{ }  两种 2.单分支 if表达式成立则执行{ }里的语句:双 ...

  4. js函数的伪重载

    这也是今天写东西是遇到的一个问题,导致我联想起了函数重载的问题. 在javascript中是没有函数重载机制的,对于用惯了java开发的同学可能就表示吃惊了,我屮艸芔茻,函数 没有重载?那怎么搞?!! ...

  5. 类加载器:ClassLoader与Class的区别

    1.类加载器 java字节码(类)的加载是由虚拟机来完成的,虚拟机把描述类的Class文件加载到内存,并对数据进行校验.解析和初始化,最终形成能被java虚拟机直接使用的java类型,这就是虚拟机的类 ...

  6. yxy-插入formid-并发/压力(入参的变量化)

    1.抓取接口如下 2.该接口为插入数据库操作,由于前段操作频繁,就简单压测一下 接口中formId.accountId.openId为变量 formId为随机生成插入:accountId.openId ...

  7. 学校项目过程中知识点 Java 2015/9/15 晚

    ##命令行运行Java程序1.文件Java的源代码存放在扩展名为“.java”的文件中:Java源文件编译后,得到“.class”的文件2.方法命令行下编译java源代码的方法:javac  文件名. ...

  8. 前端ajax异步传值以及后端接收参数的几种方式

    原文参考 异步传值 前台往后台传值呢,有很多种方式,大家听我细细道来. 第一种呢,也是最简单的一种,通过get提交方式,将参数在链接中以问号的形式进行传递. // 前台传值方法 // 触发该方法调用a ...

  9. Hive中日期处理

    1.日期函数UNIX时间戳转日期函数:from_unixtime() 函数 格式 返回值 说明 from_unixtime from_unixtime(bigint unixtime[, string ...

  10. JQ 知识点集合

    数组与字符串间的转换 一.数组转字符串(将数组元素用某个字符连接成字符串) var a, b; a = new Array(0,1,2,3,4); b = a.join("-"); ...