Hive在腾讯数据仓库TDW中的应用
Hive是Apache基金会下的一个在Hadoop上构建数据仓库的开源软件,它支持通过类SQL的HQL语言操作结构化数据。Hive的主要功 能是将类SQL的HQL语言翻译成MapReduce代码并在Hadoop上运行。Hive的出现使使用Hadoop做大数据分析变得更简单,节省了数据 分析人员编译和调试MapReduce代码的繁琐工作。目前,Hive在国内互联网公司应用很多。TDW作为一个数据仓库产品,对外主要提供SQL语言接 口。TDW中的SQL解析,主要是基于Hive实现的,在TDW中,Hive作为TDW的查询引擎(Query Engine,简称QE)而存在。如下图所示:
用户通过TDW集成开发环境(IDE)或者PL Client提交SQL给Hive、Hive经过Parser做词法、语法分析后,经过SemanticAnalyzer做语义分析并生成查询计划,这些 查询计划以一个无环有向图(DAG)来表示,图中的每个节点是一个MapReduce任务。最后通过Executor将这个DAG中的MapReduce 任务按照依赖顺序提交给Hadoop执行。Hive具有一些很好的特性,使得在用它构建TDW时,获得了巨大的方便和成功:
- Hive实现了基本的SQL功能。这使得使用Hive可以很快搭建一个数据仓库,并且可以做基本的数据分析。
- Hive具有良好的扩展性。Hive支持UDF、UDAF,可以扩充SQL函数。另外,Hive支持自定义序列化和反序列化的格式,也就是自定义SerDe,可以方便的进行存储格式的扩展。
- Hive代码具有良好的结构。Hive中代码中,词法、语法分析,语义分析,查询优化,查询执行,元数据,类型系统等结构清晰,便于进行原理分析,方便进行二次开发。
利用Hive的这些特性,构建TDW获得了一定程度的成功。然而,构建TDW时所基于的Hive-0.4.1版本本身存在一些问题,在技术上不够成熟,这些问题严重制约了TDW的运营和推广。这些问题表现在:
- 数据仓库功能不完善。缺乏权限管理、过程语言、list/range分区功能、窗口函数、多维分析等功能等——这些功能对于一个数据仓库产品,是 不可或缺的;并且,腾讯多数业务在其他数据仓库上大量使用这些功能。要推动业务从其他数据仓库转向基于Hive的TDW,这些功能是必须完善的。
- 使用门槛高。用户界面简陋,运行调试麻烦,问题定位困难,查询计划不直观。Hive比起Hadoop直接写MR任务,虽然已经有很大进步,但是对 比其他成熟的数据仓库产品,Hive在易用性上的考虑明显不足。用户需要在命令行下进行操作,如果SQL运行失败,常常需要通过Hive日志,甚至是 MapReduce的后台日志进行问题定位。在查询计划的显示上,Hive的explain结果较为复杂,若通过查询计划来调优SQL,则需要操作者具有 较多的Hadoop知识。总体来讲,Hive的使用门槛较高,影响数据分析业务的开发效率。
- 性能差。Hive-0.4.1版本的Hive在查询优化上较为简单,有很多SQL翻译的MR执行效率很低,或者不合理。性能差,不仅浪费了机器资源,也相对影响了产品的口碑。
- 不够稳定。Hive-0.4.1版本的Hive在生产环境中经常会出现卡死、元数据损坏、进程异常退出等问题。在实际运营过程中,腾讯遇到Hive大量上述问题,造成服务中断、报表延迟、计算错误等,严重影响了TDW的服务质量。
基于以上这些问题,对Hive-0.4.1版本的Hive进行了大量的优化和改造,这些优化和改造主要包括:功能扩充、易用性提升、性能优化、稳定性优化。通过这些优化,最终使基于Hive的TDW成为腾讯内部广泛使用的一个易用、高效、稳定的大数据处理平台。
TDW对Hive的优化
A: 功能扩充
开源Hive的功能简单,甚至可以说比较简陋,缺乏数据仓库应该具备的很多功能,在TDW研发和应用阶段,功能的缺失曾经使TDW不断受到业务的挑 战,这些挑战一度影响到TDW的应用推广进度和口碑,因此,腾讯对HIVE进行了大量的功能扩充。在功能扩充上,腾讯以业务使用TDW的需求为主,为 TDW实现了大量Oracle特性。这些特性一方面使TDW功能更强大,另一方面,为TDW的应用推广、业务迁移做出了巨大贡献,主要是使业务从 Oracle数据仓库转向TDW变得简单。在功能上,腾讯实现的几个主要特性有:
1.基于角色的权限管理
腾讯参考MySQL和Oracle的权限管理功能和语法形式,为Hive扩充了基于角色的权限管理功能。这项工作主要分三个方面:
- 为Hive增加了一些与权限相关的元数据表用来存放角色、权限相关的元数据信息
- 增加了相关的SQL语法,包括create role、grant、revoke等命令,这些命令能够实现将权限相关的信息记录在元数据中。
- 对原有的Hive SQL解析流程进行改变,在SQL解析时增加相关的权限检查。解析时可根据元数据中的权限信息,判断用户是否有执行此SQL,访问此库、表的权限,以达到权限控制的目的。
通过以上三个方面的功能扩充,腾讯完善了TDW权限管理,提高用户数据存入TDW的安全性,同时方便了TDW管理员的日常工作。
2.兼容MySQL的分区功能
为了满足用户的需求,腾讯也实现了MySQL的分区功能。TDW的分区表建表语法与MySQL类似,并且支持list、range两种分区类型,还 支持子分区功能。这部分修改主要是修改Hive的文法,使它支持MySQL的建分区语法;增加分区相关的元数据表;修改查询优化部分代码,使TDW支持 list、range等分区优化;增加add partition、drop partition、truncate partition等命令。
3.窗口函数
窗口函数又称分析函数,在数据分析中经常使用。TDW在Hive上开发了用户自定义窗口函数(UDWF)框架和窗口函数算子。通过这个开发,TDW 实现了常见的窗口函数,如lag、lead、row_number、rank等。UDWF框架,参考了Hive原有的UDAF设计,使一个窗口 partition的数据可以在同一个reduce内被处理,窗口函数算子中,进行具体的窗口函数计算。
4.过程语言
TDW使用Python语言作为过程语言框架,使用户可以用Python控制SQL的执行逻辑。除此之外,TDW还提供了一些公共库,如打点日志库 等,方便用户进行过程语言的开发。除此之外,为了方便用户将一些Oracle的PL/SQL转换成TDW的Python过程语言,腾讯与中科院合作研发了 一个将PL/SQL翻译成TDW Python SQL的转换工具,可以减小业务迁移的手工工作量,提高迁移效率。
5.多维分析功能
TDW的一些用户原有的业务使用了较多的cube、rollup功能,为了能让业务顺利高效的迁移到TDW,TDW支持了多维分析功能。TDW的多 维分析功能实现比较简单,通过对语法分析后产生的抽象语法树(AST)进行变换,将cube、rollup变换成group by+union all。
其他功能如公用表达式(CTE)、update/delete、入库数据校验等功能,TDW已经实现,这里不再赘述。目前,TDW在功能上较为成熟,Oracle的常用功能在TDW一般都有对应的功能,用户对TDW的目前表现也十分满意。
B: 易用性提升
开源的Hive在易用性上,考虑欠妥——没有Windows下的开发环境;HQL语言虽然与SQL语言很接近,却不一致,语法比较怪异;从其他数据 库语言转向HQL门槛较高。这些易用性方面的问题严重影响了TDW业务迁移和开发的效率。为此,腾讯在易用性上对Hive进行了如下的改造:
1.TDW集成开发环境
腾讯为TDW开发了Windows下的集成开发环境(TDW IDE),用户可以在它上面进行过程语言的编辑和调试、SQL的编辑和调试。它支持很多现代集成开发环境都有的易用性特性,比如语法高亮、自动补全、用法提示、进度显示、代码格式化、图形化显示查询计划等。
TDW IDE也是基于开源软件进行开发,腾讯使用Eclipse提供基本的IDE功能,使用PyDev提供TDW Python过程语言的编辑和调试环境,使用Jython提供Python与Java的粘合、SQL的编辑和调试功能,借鉴了Eclipse上的开源 SQL插件QuantumDB的实现原理。
2.改善SQL语法细节,使它更标准、更易用
腾讯希望TDW的SQL更符合标准,或者更通用,降低用户的学习成本。为此,腾讯为TDW实现了exists、not like、insert values、select expression without from、show create table、comment on等SQL功能。这些功能都需要对Hive语法分析、语义分析、优化器等方便进行改造实现。
3.提供SQL/MED功能,使TDW方便与PostgreSQL互联互通
随着TDW应用的不断广泛,TDW与外部数据的交互也越来越多。一些用户希望在TDW中能够实时访问保存在PostgreSQL中的数据配置信息或 者维度表信息。腾讯借鉴了PostgreSQL的外表功能,实现了TDW的SQL/MED功能。用户可以在TDW中建PostgreSQL的外表,然后在 TDW中像访问普通表一样对这些外表进行访问,包括进行TDW中的表与外表的关联。这部分主要是修改TDW建表语法,使在建表使可以提供相关的外表信息, 然后将这些信息保存在元数据中。当在TDW中访问这些外表时,会先去相应的数据库中读取数据,再进行TDW的SQL操作。
通过这些改造,TDW易用性显著提高,业务的迁移和开发也顺利了。目前TDW IDE在公司内的用户数已经接近1500人,他们每天使用TDW IDE进行数据开发工作,数据提取工作等,它已经成为TDW用户的必备工具。
C: 性能和稳定性优化
开源的Hive在性能和稳定性上面,也有很多问题。随着TDW业务的不断增多,这些问题日益凸显,迫使腾讯必须在性能和稳定性上优化Hive。
在性能上面,Hive原本支持的文本格式,效率比较低,腾讯自己研发了二进制的存储格式,不但读写效率增加,而且直至lzo压缩。而且内部有自己的 索引,使它随机读性能很好。腾讯还为Hive扩充按行split、orderby+limit等优化技术,使它的SQL性能更好。除了这些腾讯原创的 Hive优化,腾讯也会将Hive社区的优化补丁打到TDW中。比如腾讯今年的SQL MR并行优化,就是来自社区的补丁,在生产环境的效果不错(如下图和表格所示)。
在计算性能方面,腾讯还引入了估值优化,来提升系统的计算效率。腾讯引入了HyperLogLog算法,来代替准确的count distinct,对于那些不需要计算准确值得业务(如计算uv、App独立用户数等),可以用来提升计算效率,降低计算成本,下表示各类基数估值算法与 它的内存使用量,精度的比较,来自这篇论文:HyperLogLog: the analysis of a near-optimal cardinality estimation algorithm。
在稳定性方面,开源的Hive有很多潜在问题。TDW对Hive的应用,其规模之大、复杂度之高,在业内是很少见的,因此很多开源的Bug,也只有 腾讯才能遇到。这些bug有的使Hive异常退出、有的使它无法响应、有的式它元数据遭破坏,这些都会影响TDW的正常服务,使TDW不稳定。为了使 Hive稳定运行,腾讯做了大量的稳定性工作,包括:Hive Server容灾与负载均衡、大结果集获取接口优化、元数据接口优化、内存泄漏检测、服务过载保护(最大连接数限制、SQL长度限制等)、非线程安全容器 (多线程访问static HashMap)梳理等。通过这些工作,使TDW的不会因为Hive的问题而停止服务,服务质量得到保证。
TDW在稳定性方面的一个很大增强是元数据方面。腾讯重构了Hive的元数据模块。社区的Hive使用一层ORM(使用JDO接 口,datanucleus的实现)来简化元数据的访问API,并且提供灵活的元数据存储配置。但是这带来了性能和稳定性上的问题。先实际运营中,腾讯发 现ORM层在扩展性、性能、数据的一致性、出现问题时定位的方便性上,都有问题。在TDW运营初期,元数据量比较小,问题不是那么突出。但是当TDW元数 据到达一定规模时,腾讯经常遇到元数据访问接口卡住,或者将表的元数据写脏,或者多个Hive Server的元数据不一致等等。一旦出现元数据问题,修复起来都非常麻烦,需要手工操作元数据DB,风险很大。对业务造成的影响也很大。腾讯最终选择对 Hive的元数据进行重构,将ORM层去掉,使用JDBC直接访问元数据DB,效率和透明性大大提升;同时腾讯将元数据分散化,引入global database和segment database。Global database中存放用户、权限、segment路由信息等,segement database中存放具体的表的元数据信息。通过这种架构,使TDW的元数据可以线性扩展和负载均衡,消除了之前的元数据单点问题。新的元数据架构如图 所示。
Hive优化的未来方向
经过过去约三年多时间的Hive优化,TDW已经成为腾讯内部易用、高效、稳定的大数据处理平台。但是对于Hive的优化工作,腾讯不会停止。随着TDW在腾讯的普及,以及腾讯数据分析业务的不断增长,腾讯未来需要在三方面进行长期的优化工作:
- 查询计划优化:TDW的查询计划仍然有优化空间。目前TDW的查询优化算法主要是基于规则的,未来腾讯将引入基于代价的查询优化算法。这个优化方向难度比较大,但是腾讯会持续去优化。
- 数据安全:随着TDW内数据的增多,业务和用户越来越关心数据的安全,腾讯要对比TDW与传统DB在安全机制和功能上的差距,为用户提供更多安全特性。
- 数据管理功能:TDW核心功能已经基本具备,但是数据管理功能还有欠缺,比如元数据管理、数据生命周期管理、成本管理等,都需要不断优化。
参考链接:
- http://code.csdn.net/news/2819976