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. APUE学习笔记——7main()函数启动与退出

    程序的启动与退出过程 先上图,了解进程运行的机制.     内核首先调用exec,运行C启动进程,C启动进程会调用main()函数.     其他所有函数都是由main函数直接或间接调用的.     ...

  2. Datesheet 参数手册

    1 明白P/N每一个字是代表什么含义... 这很重要! EP6095-01-381 (CL10C010CBNNNC=CL10C010CB8NNNC ?)----8 代表Ni plating in te ...

  3. 用JAMES实现自己的邮件服务器

    简介 James 是一个企业级的邮件服务器,它完全实现了smtp 和 pops 以及nntp 协议.同时,james服务器又是一个邮件应用程序平台.James的核心是Mailet API,而james ...

  4. git clone 提示输入git@xxx的密码

    如下: suse:~/ecox # git clone git@vcs.in.ww-it.cn:ecox/ecox.git 正克隆到 'ecox'... git@vcs.in.ww-it.cn's p ...

  5. 【转】DirectUI 资源提取器

    转自 http://www.cnblogs.com/Alberl/p/3378413.html   二.DirectUI 资源提取器     由于不能用传统工具,那么怎么办呢?可能有很多网友都知道QQ ...

  6. [译]HIPAA要求的SSL/TLS等级

    原文链接:https://luxsci.com/blog/level-ssl-tls-required-hipaa.html 原文发表时间:2015.1.13 本博文仅仅是上述原文的翻译,仅供研究参考 ...

  7. C:源文件编译过程

    可以大致概括为3个阶段: 源文件 → 汇编代码(文本) 汇编代码 → 机器语言(二进制) 各个目标文件的处理 详细过程: 预编译处理 Pre-processing(*.c/ *.cpp → *.i) ...

  8. getPropertyValue (实现 js框架中 css 的最终调用的函数)

    ,取得元素最终计算出的css 样式 var a = document.getElementById("content");    alert("style "+ ...

  9. 每天一个linux命令(磁盘):【转载】du 命令

    Linux du命令也是查看使用空间的,但是与df命令不同的是Linux du命令是对文件和目录磁盘使用的空间的查看,还是和df命令有一些区别的. 1.命令格式: du [选项][文件] 2.命令功能 ...

  10. BZOJ3325 [Scoi2013]密码【Manacher】【构造】【贪心】

    Description Fish是一条生活在海里的鱼.有一天他很无聊,就到处去寻宝.他找到了位于海底深处的宫殿,但是一扇带有密码锁的大门却阻止了他的前进.通过翻阅古籍,Fish 得知了这个密码的相关信 ...