我们目前使用的是 flink 1.9.1 执行 SQL 任务,主要使用了以下几种接口:
sqlQuery sqlUpdate: 执行表的创建、查找和写入
toAppendStream/toRetractStream:将表转换为流后,通过 DataStream.addSink(new
RichSinkFunction )写入
- registerDataStream:将流注册为表,下一步使用 sqlQuery/sqlUpdate 读写该表
最后通过 env.execute() 或者 tableEnv.execute() 执行:通过 RichSinkFunction.invoke 或者
sqlUpdate(DML) 更新到存储,这两种输出形式都可能多次调用。
看到文档里,这部分接口 [1][2] 的行为有些变化,实际使用1.11后,有几处困惑想请教:
- 如果预期混用 SQL/DataStream 的接口,我目前按照3里的介绍,使用 sqlUpdate,然后通过 tEnv.execute()
来输出。具体的,程序设置两个输出,分别是 RichSinkFunction.invoke 以及 sqlUpdate,观察到只有 sqlUpdate
更新了数据,RichSinkFunction 没有执行。如果希望同时输出的话,是必须将 RichSinkFunction.invoke
的部分也都实现为 StreamTableSink 么,是否有其他成本较低的迁移方式?如果按照 1.11 区分 env/tableEnv
的思路,这种情况怎么实现更加合理?
- 对于这种情况,env.getExecutionPlan 获取的只是调用 DataStream 接口的 DAG 图,如果要获取 Table
操作流程的 DAG,应该通过 tableEnv 的哪个接口获取?
1.
https://ci.apache.org/projects/flink/flink-docs-release-1.11/release-notes/flink-1.11.html#corrected-execution-behavior-of-tableenvironmentexecute-and-streamtableenvironmentexecute-flink-16363
2.
https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=134745878
3.
https://ci.apache.org/projects/flink/flink-docs-release-1.11/dev/table/common.html#translate-and-execute-a-queryc*来自志愿者整理的flink邮件归档
通过 Table 操作流程的 DAG 现在不再会缓存到底层的 exec env 中,为了避免 transformations
污染,所以是拿不到的,但是内部代码我们仍然是先拼接 StreamGraph 然后直接通过 exec env 提交。*来自志愿者整理的flink邮件归档
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。