应用场景
公司的经营分析使用的数据仓库是基于开源CDH5.12.6自带的Hive(1.1.6版本)实现的。数据仓库的开发平台使用的是数澜科技的数栖平台(4.8.4版本)。该技术组合在团队发展早期,人员不足的背景下,起到了一定的积极作用。随着数据规模快速增加、团队成员壮大、技术发展,该技术组合出现了如下问题:
- Hive版本过旧,性能略有不足。开发人员每次运行Hive SQL验证数据逻辑,需要等待较长时间。
- 升级迁移到高版本Hive需要适配数栖平台,升级(数栖平台也要升级)及迁移成本(1W+表及工作流)较高
- 数栖平台不支持Presto或者Trino数据开发(以下内容,都用Trino指代Presto或者Trino)
在不考虑高成本升级数栖平台与Hive的方案下,为了解决开发人员验数等待时长问题。引入了快速查询引擎Trino。使用Trino过程中存在如下问题:
- 数栖平台中的HiveSQL无法直接在DBeaver 执行Trino SQL。
- 数栖平台的代码有平台变量、Hive SQL部分函数与Trino SQL(ANSI标准)不兼容。开发人员只能在Trino上验证部分没有SQL不兼容的代码,不能根本性覆盖95%以上的验数场景。
为了解决以上问题,考虑通过某种方案,实现数栖平台上执行的Hive SQL直接在Trino上执行。通过研究分析有一下思路:
- 方案1: 开发一个转换程序,直接将Hive SQL转换为兼容的Trino SQL。
- 方案2: 在Trino中通过UDF实现Hive中特有的函数。
- 方案3: 研发或者引入执行代理引擎,支持直接运行Hive SQL/Trino SQL,实现执行引擎无感知,自动路由并翻译SQL到后端执行引擎。
方案一:转换Hive SQL为Trino SQL
将hive SQL转换为Trino SQL有三种思路:
- 思路1-文本替换:梳理Trino中不支持的Hive特有函数清单并分类,通过正则表达式匹配Hive特有函数,并按Trino语法改写。如果遇到不能改写的Hive函数,则自定义UDF。
- 思路2-SQL解析:利用SQL parser解析Hive SQL语法,将Hive特有函数识别并按Trino语法改写。如果遇到不能改写的Hive函数,则自定义UDF。
- 思路3-SQL解析并自动生成Trino SQL:读取Hive SQL,按Hive SQL AST语法解析,并按Trino语法生成Trino SQL。
其中,思路1、思路2中描述方法,比较繁琐且功能定制化,自定义UDF要求也较高。思路3是一种通用的Hive SQL翻译、转换思路。通过调研,Linkedin的开源项目https://github.com/linkedin/coral实现了类似功能,可以参考该思路实现转换,测试Hive SQL转换的支持情况。
方案二:Trino UDF实现Hive函数
通过在Trino中实现UDF支持Hive特有函数的方案,需要做以下工作:
- 工作1: 梳理Trino中不支持的Hive特有函数清单并分类,或者整理工作中用到的Trino不支持的Hive特有函数。
- 工作2: 根据不支持的Hive特有函数清单,规划Trino中UDF的框架。
- 工作3: 编码、测试并加载UDF到Trino集群。
对于团队现状,该方案有以下问题:
- 工作量较大,与团队核心工作任务(数仓建模、业务提数)有较大偏差。
- 工作难度较大,团队成员大部分是SQL开发工程师。而UDF开发要求java能力和编程及算法能力。
基于该思路,检索了Github。发现了以下工程:https://github.com/qubole/presto-udfs。该工程在Presto中实现了Hive的:日期-时间函数、数据函数、字符串处理函数,可以验证方法的支持情况。
方案三:代理执行引擎
代理执行引擎的总体思路:** 提供统一的执行SQL的执行引擎代理,代理自动识别SQL语法,并按SQL语法自动路由到相应的执行引擎。也可以根据配置选择,自动翻译为指定执行引擎的SQL代码**。
代理执行引擎实现难度较大,如果不是做平台的企业较难有成本和耐心支撑这样的工作。
OPPO有介绍类似的工作:https://zhuanlan.zhihu.com/p/96155124。
这篇文章(http://www.jackywoo.cn/transform-presto-sql-to-hive-dialect/)中也提到类似的思路。
当然也有一种互联网企业,如美团、网易、唯品会、滴滴等实现了类似的代理执行引擎。有兴趣的朋友,可以参考学习。
总结
本文简单分析了工作中Hive SQL转Trino SQL的应用场景,并根据个人的理解,提出了三种实现方案。通过初步的调研分析,计划基于LinkedIn的coral以及第三方库https://github.com/qubole/presto-udfs验证Hive SQL转Trino SQL的效果。后续文章将陆续分享验证结果。敬请期待哦。
对于文中任何疑问,欢迎加微信讨论DawSongZhao:
参考文献
- https://prestodb.io/docs/0.208/migration/from-hive.html
- https://docs.qubole.com/en/latest/admin-guide/engine-admin/presto-admin/migrate-from-hive.html
- https://github.com/linkedin/coral
- https://github.com/pPanda-beta/presto-utils/tree/master/prestosql-hive-converter
- https://github.com/prestodb/presto/issues/13287
- https://engineering.linkedin.com/blog/2020/coral
- https://engineering.linkedin.com/blog/2017/11/dali-views–functions-as-a-service-for-big-data
- https://engineering.linkedin.com/blog/2018/11/using-translatable-portable-UDFs
- https://blog.csdn.net/weixin_44112790/article/details/119840317
- https://prestodb.io/docs/0.208/migration/from-hive.html
- https://docs.qubole.com/en/latest/admin-guide/engine-admin/presto-admin/migrate-from-hive.html
- https://github.com/qubole/presto-udfs
- http://www.jackywoo.cn/transform-presto-sql-to-hive-dialect/
- https://zhuanlan.zhihu.com/p/96155124