前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >数据湖填坑指南:OLAP引擎openlookeng查询Hudi MOR表数据不准确问题定位解决

数据湖填坑指南:OLAP引擎openlookeng查询Hudi MOR表数据不准确问题定位解决

作者头像
用户9421738
发布2024-11-15 10:51:40
发布2024-11-15 10:51:40
12200
代码可运行
举报
文章被收录于专栏:大数据从业者
运行总次数:0
代码可运行

背景

本文主要记录某医院客户使用OLAP引擎openlookeng查询Hudi MOR表,遇到查询数据不准确问题的排查、分析、解决方法。openlookeng也称为hetu,属于Presto衍生出来的同类产品,演进关系如下:

2013年Facebook开源MPP架构OLAP引擎Presto。2019年基于Presto衍生出同类产品Prestosql。2021年因为商标纠纷,Prestosql更名为trino。2021年基于trino衍生出同类产品hetu(也称为openlookeng)。其中,trino项目的tag记录可以清晰看出演进历程。

问题现象

现象描述:Hudi mor分区表没有任何写入操作,使用hetu查询mor rt表,发现数据量不准确。经过详细沟通反馈,多次select count结果一直在几个特定数值之间来回变动,其中存在正确的数值。

经过多次debug发现,每次查询时候BackgroundHiveSplitLoader.java获取到的文件列表是变动的,理论上说,表没有数据写入,读取时候的文件targetSplits应该是固定的。

代码语言:javascript
代码运行次数:0
复制
// The input should be in TextInputFormat.
TextInputFormat targetInputFormat = new TextInputFormat();
// the splits must be generated using the file system for the target path
// get the configuration for the target path -- it may be a different hdfs instance
FileSystem targetFilesystem = hdfsEnvironment.getFileSystem(hdfsContext, targetPath);
jobConf.setInputFormat(TextInputFormat.class);
targetInputFormat.configure(jobConf);
FileInputFormat.setInputPaths(jobConf, targetPath);
InputSplit[] targetSplits = targetInputFormat.getSplits(jobConf, 0);

如上所示,targetPath是固定值,而每次得到的targetSplits是动态的。那么,说明jobConf被动态修改了。继续查看代码可以发现jobConf是BackgroundHiveSplitLoader类变量,而上述代码所在的loadPartition方法,在多分区表的场景,每个分区被单个线程执行。

至此,真相了,多线程并发修改同一个jobConf造成的!

解决方案

多个线程调用loadPartition方法,该方法内使用新的线程内可见的localJobConf,如下:

代码语言:javascript
代码运行次数:0
复制
// For hudi mor rt table, multiple partitions and threads need to avoid modifying a JobConf at the same time,
// which can cause incorrect split partition paths.
JobConf localJobConf = new JobConf(jobConf);
InputFormat<?, ?> inputFormat = getInputFormat(configuration, schema, false, localJobConf);

详细完整的修改内容见我的commit,地址如下:

代码语言:javascript
代码运行次数:0
复制
https://github.com/felixzh2020/hetu-core/commit/50131f2f4c78cd506867a96855e6396f7b43685d

效果验证

可以从我的github分支拉取已经修改的代码,如下:

代码语言:javascript
代码运行次数:0
复制
git clone -b apache/1.10.0forhudi0.14.1  https://github.com/felixzh2020/hetu-core.git

部署好Java和Maven环境,进行源码编译,如下:

代码语言:javascript
代码运行次数:0
复制
mvn clean package -DskipTests -Dair.check.skip-all=true -Dmaven.gitcommit.skip=true -Ddep.hudi.version=0.14.1 -T 1C

编译打包输出的安装包路径为:hetu-server/target/hetu-server-1.10.0.tar.gz。如果已经部署了hetu,可以只替换presto-hive-1.10.0.jar,重启即可!

可以通过Web前端界面进行验证测试,如下:

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-11-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 大数据从业者 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景
  • 问题现象
  • 解决方案
  • 效果验证
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档