Trino兼容Hive SQL方案探索

在这里插入图片描述

应用场景

公司的经营分析使用的数据仓库是基于开源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
Trino是一种用于分布式数据处理的开源框架,支持访问各种数据源。Hive是Hadoop生态系统中的一种数据仓库和分析工具,用于处理大规模结构化数据。在使用Trino访问Hive时,可能会需要添加一些自定义的jar包,以便在查询中使用自定义的函数或者数据类型。 要在Trino中访问Hive并添加jar包,通常需要按照以下步骤进行操作: 1. 首先需要启动Trino集群,并且确保能够成功连接到Hive。可以通过修改Trino的配置文件来指定Hive的连接参数。 2. 接下来,需要将自定义的jar包上传到Trino的文件系统中。可以使用Trino提供的命令行工具或者API来上传jar包,例如: ```shell trino-client upload my.jar ``` 3. 上传完成后,需要在Trino中添加自定义jar包的路径。可以通过修改Trino的配置文件或者执行SQL语句来添加路径,例如: ```sql SET session hive.customize-hive-session=true; SET session hive.customize-hive.session-config=my_config.xml; ``` 其中,my_config.xml是自定义的Hive配置文件,需要包含自定义jar包的路径等信息。 4. 最后,可以在Trino中通过SQL语句来使用自定义的函数或者数据类型。例如: ```sql SELECT my_function(col1, col2) FROM my_table; ``` 其中,my_function就是自定义的函数名,col1和col2是需要传递给函数的参数。如果自定义的函数或者数据类型没有成功加载,可能会出现错误提示。 总之,在Trino访问Hive并添加jar包时,需要确保掌握基本的TrinoHive使用方法,并遵循适当的操作流程,才能确保成功完成任务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值