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执行与用户自定义函数(hive-exec-udf)》 在大数据处理领域,Apache Hive作为一款基于Hadoop的数据仓库工具,扮演着重要角色。它提供了类SQL的查询语言(HQL)来操作分布式存储的数据,极大地简化了大...
- Hive提供了监控工具,可以查看查询执行的资源消耗、时间等信息,帮助优化查询性能。 - 日志系统有助于排查问题,了解Hive运行情况。 总结起来,`apache-hive-1.2.2-bin.tar.gz`是一个包含了Hive 1.2.2版本的...
Hive是Apache软件基金会的一个开源项目,旨在为数据密集型应用提供简化的数据仓储、查询和分析功能。 在“apache-hive-1.2.1-bin.tar.gz”这个压缩包中,包含了Apache Hive 1.2.1版本的所有必要组件和文件。这个...
Apache Hive 是一个基于 Hadoop 的数据仓库工具,它允许用SQL(HQL,Hive Query Language)语句进行数据查询、分析和汇总,极大地简化了大数据处理的复杂性。在Hive 0.13.0 版本中,它提供了更多增强的功能和性能...
Hive提供了一个接口,允许用户通过类似SQL的语言HQL(Hive Query Language)来查询和管理数据,简化了大数据分析的工作。 二、Hive架构 Hive的架构包括客户端、元数据存储、驱动器和执行器四个主要部分。客户端用于...
Hive的执行原理与优化部分主要讲述了Hive的技术架构,包括Hive的核心组件、Hive的底层存储、Hive程序的执行过程以及元数据存储。同时涉及了MapReduce的执行过程、Shuffle原理和性能优化策略。 Hive的执行过程主要...
2. **执行过程**: - **查询解析**:Hive客户端提交查询,驱动器解析SQL语句,生成逻辑执行计划。 - **优化**:逻辑执行计划经过优化,生成物理执行计划。 - **任务分配**:物理执行计划被分解为多个Map-Reduce...
1. **Hive架构**:Hive的核心组件包括元数据存储、HQL解析器、编译器、优化器以及执行器。元数据存储通常在MySQL或Derby数据库中,记录表结构等信息;HQL解析器将用户的查询语句转化为抽象语法树;编译器则将这个树...
6. **Hive的存储过程(UDF, UDAF, UDTF)**:用户定义的函数(UDF)、用户定义的聚合函数(UDAF)和用户定义的表函数(UDTF)扩展了Hive的功能,允许用户自定义处理逻辑。 7. **Hive与MapReduce的关系**:Hive查询会...
Hive是Apache软件基金会的一个开源项目,它是一个基于Hadoop的数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供SQL查询功能,使得用户可以使用SQL语句进行大数据处理,极大地简化了大数据分析的工作...
总的来说,Hive是一个强大的大数据分析工具,它简化了在Hadoop上的数据查询和分析过程,为大数据分析提供了便利。通过理解其原理、掌握SQL语法、优化技巧和解决数据倾斜问题,可以在大数据环境中高效地进行数据分析...
- 解析Hive语句,构建表、字段和分区等对象。 - 元数据的存储模式影响元数据的管理和访问。 通过这本书的学习,读者不仅可以理解Hive的基本概念,还能深入掌握其工作流程和架构。尤其是Hive的元数据库部分,它是...
6. **Hive的三种自定义函数(UDF、UDTF、UDAF)** - **UDF**:一对一函数,用于基本的数据转换。 - **UDTF**:一对多函数,会产生多行输出。 - **UDAF**:多对一函数,用于聚合操作,如COUNT、SUM。 7. **Hive的...
Hive 提供了一个数据层,使得非编程背景的用户也能方便地进行数据分析工作,极大地简化了对海量数据的操作。 Hive 的主要特点包括: 1. **数据仓库**:Hive 主要用于离线批处理,而非实时查询。它将结构化的数据...
Hive是一个构建在Hadoop之上的...通过Hive可以方便地对大规模数据进行处理,并通过SQL语言简化数据查询和分析过程。随着大数据技术的发展和进步,Hive也不断进行功能上的优化和扩展,以更好地满足大数据分析的需求。
总的来说,Java与Hive的结合为大数据处理提供了丰富的可能性,不仅简化了开发过程,还增强了处理复杂逻辑的能力。通过上述示例,我们可以更好地理解和应用Hive语句,从而在大数据分析中游刃有余。在实际项目中,可以...
- **驱动器**:Driver负责解析、编译、优化和执行SQL语句,将其转化为MapReduce任务。 5. **Hive与数据库的比较** - **查询语言**:虽然都使用SQL语句,但HQL是针对大数据环境定制的。 - **数据存储**:Hive数据...