在统一FLINK Application中(一个main class)用FLINK Kafka SQL Connector 都多个Kafka TOPIC, 然后对每一个Kafka Table, 取出一些字段后, insert后续Kafka Table。
任务提交到Yarn后, 为什么每一个SQL语句都会启动一个JobManager? 甚至都一个Kafka Source Table, SINK两次的话, 每一个SINK都是一个独立的Job?
是我的用户不对吗? 请各位指教。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
在Apache Flink中,JobManager负责协调和管理作业的执行计划,而TaskManager则负责实际的数据处理任务。当你在一个Flink Application中编写多个SQL查询,并且每个查询都涉及到读取Kafka Topic数据并写入到另一个Kafka Topic时,实际上你是在定义多个数据流转换操作,这在Flink内部会被编译成一个或多个独立的执行计划(即job)。
对于你的观察,通常情况下,一个Flink Application提交后,会由一个单一的JobManager实例来管理整个应用中的所有job。如果你看到每个SQL语句或者每个sink操作似乎都启动了一个新的JobManager,这可能是因为配置或者理解上的误会。
这里有几个可能的原因和建议:
配置问题:检查你的Flink应用配置,确保没有误配置为每个查询或sink操作创建一个新的Flink集群或JobManager。通常,你应该只配置一个JobManager地址用于提交所有作业。
SQL Client模式:如果你是通过Flink SQL CLI或者以类似的方式运行这些SQL查询,每次执行SQL命令实际上可能会被视为一个独立的交互式查询,从而导致看起来像是为每个查询启动了新的JobManager。在生产部署中,应将所有SQL整合到一个脚本或应用程序中统一提交。
理解误区:可能是对日志或监控信息的误解。有时候,Flink的Web UI或日志输出可能会让人感觉每个操作都有独立的管理器,但实际上它们可能是指向同一个JobManager的不同视图或记录。
并行度与任务链:虽然不直接关联到JobManager的数量,但高并行度设置或未优化的任务链可能会导致资源分配看起来分散,影响性能感知。确保合理设置并行度,并考虑使用任务链以减少数据在task之间的传输开销。
版本特性或Bug:确认使用的Flink版本是否存在已知的此类行为。查看官方文档和社区讨论,看是否有其他用户遇到相似问题,并确认是否有相关的修复或工作绕过。
综上所述,正常情况下,一个Flink Application即使包含多个SQL转换,也应该被编排为一个或有限数量的jobs,由单个JobManager管理。如果遇到不符合预期的行为,建议详细审查应用配置、监控日志,并参考最新的Flink文档或寻求社区帮助。