news 2026/3/10 8:56:54

Flink Modules 把自定义函数“伪装成内置函数”,以及 Core/Hive/自定义模块的加载与解析顺序

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Flink Modules 把自定义函数“伪装成内置函数”,以及 Core/Hive/自定义模块的加载与解析顺序

1. Modules 能解决什么问题

你会遇到这些需求时,Module 非常合适

  • 你希望用户在 SQL 里直接用geo_distance(...)ip_to_region(...)这种函数,像用 Flink 内置函数一样
  • 你希望把 Hive 自带的一堆 UDF/UDTF 当成 Flink 内置函数用(HiveModule)
  • 你想做“统一函数能力包”:比如公司内部的一套数据治理函数、脱敏函数、维表补全函数等,一次性加载即可用
  • 你甚至希望影响临时表 connector 的创建(Module 也可以提供 source/sink factory,会影响默认 SPI 发现)

2. Module 的核心特性

2.1 没有 namespace

Module 提供的对象被视为Flink 的系统(built-in)对象,因此没有 catalog/database 的 namespace
也就是说,它们更像core里的SUBSTRINGCAST一类“全局可见”的东西。

2.2 生命周期:load / use(enable) / disable / unload

  • LOAD:把模块加载到 TableEnvironment(加载后默认启用)
  • USE MODULES:决定哪些模块启用,并且决定解析顺序
  • disable:不在USE MODULES ...里出现的已加载模块会被置为未启用(但仍然“加载着”)
  • UNLOAD:从 TableEnvironment 中移除(卸载后就不能再 use 了,除非重新 load)

2.3 解析顺序(Resolution Order)决定“同名函数用哪个”

当多个启用模块里出现同名函数时,Flink 按模块顺序解析:

  • 两个模块都启用:按USE MODULES的顺序,谁在前用谁
  • 只启用一个:只会解析到启用的那个
  • 两个都禁用:函数无法解析

这对“覆盖/替换”内置或第三方函数非常关键(比如你想让 hive 的某个函数优先于 core 或你自定义模块的实现)。

3. Module 类型:Core / Hive / 自定义

3.1 CoreModule

  • Flink 的系统内置函数都在core
  • 默认加载并启用
  • 强烈不建议禁用 core(除非你真的知道自己在做什么)

3.2 HiveModule

  • 把 Hive 内置函数提供给 Flink SQL / Table API 使用
  • 需要按 Flink Hive 文档完成依赖与版本配置
  • 很常见的用法:让 Flink SQL 更接近 Hive SQL 生态

3.3 自定义 Module

  • 你可以实现Module接口来自定义模块

  • 如果你希望在 SQL CLI 用LOAD MODULE xxx WITH (...)这种方式发现并加载,还需要实现ModuleFactory

    • ModuleFactory负责声明配置项,并根据 properties 实例化 module
    • 本质是:用 properties 让 discovery service 找到匹配的 factory,再创建 module

4. 用 SQL 管理 Modules:SHOW / LOAD / USE / UNLOAD

下面这套操作是理解模块最直接的方式(同时适用于 Table API 的executeSql以及 SQL Client)。

4.1 初始状态:只有 core

SHOWMODULES;SHOWFULLMODULES;
  • SHOW MODULES:只展示“启用中的模块”
  • SHOW FULL MODULES:展示“所有已加载模块 + 是否 used(启用)”

4.2 加载 hive 模块

LOADMODULE hiveWITH('hive-version'='...');

加载后默认启用,因此你会在SHOW MODULES里同时看到corehive

4.3 改变解析优先级(非常关键)

USEMODULES hive,core;

这意味着:如果hivecore都提供了同名函数,优先使用 hive 的版本

4.4 禁用 core(演示用,不建议)

USEMODULES hive;

此时:

  • SHOW MODULES只会显示启用的hive
  • SHOW FULL MODULES会显示core used=false(core 还在,只是禁用了)

4.5 卸载 hive

UNLOAD MODULE hive;

卸载后 hive 不再可用,且不能再USE MODULES hive(除非重新LOAD)。

补充:SQL 中 module 名是 discovery 用的简单标识符,大小写敏感

5. 用 Java API 管理 Modules(更适合平台/应用内嵌)

同样的生命周期在 Java 里对应:

  • listModules():启用的模块
  • listFullModules():已加载模块 + used
  • loadModule(name, moduleInstance)
  • useModules("hive", "core")
  • unloadModule("hive")

典型流程:

tableEnv.listModules();tableEnv.listFullModules();tableEnv.loadModule("hive",newHiveModule());tableEnv.useModules("hive","core");tableEnv.useModules("hive");// 禁用 core(演示,不建议)tableEnv.unloadModule("hive");

6. 什么时候该用 Module,什么时候不该用

适合用 Module 的场景

  • 你要做“公司级函数包”,让所有 SQL 作业像用内置函数一样调用
  • 你需要和 Hive 生态函数对齐
  • 你想用模块顺序解决“同名函数冲突”,并可控地覆盖默认实现

不太适合的场景

  • 只给某一个作业加一两个函数:直接注册临时函数/系统函数更轻量
  • 你希望函数有 namespace(按库隔离):那更像 Catalog 的职责,而不是 Module

如果你准备把这块写成 CSDN 博客,我可以继续帮你把这一节扩成更“落地”的结构:

  • “Module vs Catalog Function vs Temporary Function” 三者边界与选型
  • “自定义 Module + ModuleFactory” 的最小可运行骨架(包含 properties 配置项)
  • “函数同名冲突” 的真实案例(比如 hive 与 core 某些函数差异)以及排查思路
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/8 23:56:42

清华镜像站同步PyPI索引周期说明

清华镜像站同步PyPI索引周期说明 在人工智能项目开发中,一个常见的痛点是:明明代码写好了,却因为 pip install 卡在 5% 而迟迟无法运行。尤其在国内,访问 PyPI、GitHub 或 Docker Hub 等境外资源时,网络延迟高、连接频…

作者头像 李华
网站建设 2026/3/9 23:36:20

清华源替换Anaconda默认通道提高conda安装成功率

清华源加速conda:打造高效稳定的AI开发环境 在人工智能项目开发中,最让人沮丧的场景之一莫过于:刚准备好大展身手,却卡在了第一步——conda install tensorflow 卡住不动,几分钟后抛出“Solving environment: failed”…

作者头像 李华
网站建设 2026/3/7 6:54:46

git tag标记TensorFlow模型重要版本节点

使用 git tag 精准标记 TensorFlow 模型的关键版本节点 在机器学习项目的实际开发中,一个模型从实验阶段走向生产部署,往往要经历数十甚至上百次迭代。我们常听到这样的问题:“线上正在跑的这个模型,到底是基于哪次训练的结果&am…

作者头像 李华
网站建设 2026/3/6 13:57:19

飞算JavaAI代码生成黑科技曝光:如何10分钟完成一天工作量?

第一章:飞算JavaAI代码生成黑科技曝光:如何10分钟完成一天工作量?在Java开发领域,编码效率一直是开发者关注的核心议题。飞算JavaAI的出现彻底颠覆了传统开发模式,通过深度学习与大规模代码训练,实现从需求…

作者头像 李华
网站建设 2026/3/9 0:29:59

还在用ByteBuffer?是时候升级到Java Foreign Memory API了!

第一章:Shell脚本的基本语法和命令Shell脚本是Linux/Unix系统中自动化任务的核心工具,通过编写可执行的文本文件,用户能够组合命令、控制流程并处理数据。其语法简洁,适合系统管理、日志分析、批量处理等场景。变量定义与使用 She…

作者头像 李华