请教大家Flink:我在多线程里面单独创建StreamExecutionEnvironment 执行env.addSource数据查询,然后env.excute,
为啥执行env.addSource后不往下执行env.excute了。导致认为没有提交?
在 Apache Flink 中,StreamExecutionEnvironment
是线程不安全的。这意味着你不应该在一个多线程环境中共享同一个 StreamExecutionEnvironment
对象。
当你在一个多线程环境中创建多个 StreamExecutionEnvironment
实例,并分别执行它们时,Flink 会尝试为每个环境分配资源并启动一个独立的任务。然而,由于你的程序可能没有正确地管理这些环境和任务,导致某些任务无法正常执行或提交。
为了避免这个问题,请考虑以下方法:
使用单线程:如果你的作业不需要利用多线程的优势,那么你可以将所有操作放在一个单独的线程中执行。这样可以确保你只使用一个 StreamExecutionEnvironment
对象,并且可以在其上调用 execute()
方法来提交你的作业。
同步访问环境:如果你需要在多线程中执行多个作业,你需要确保对 StreamExecutionEnvironment
的访问是线程安全的。这可以通过使用锁或者并发控制机制来实现。当一个线程正在执行一个作业时,其他线程必须等待,直到该作业完成并释放了环境。
使用不同的进程或容器:如果你需要同时执行多个独立的 Flink 作业,建议使用不同的进程或者容器来隔离它们。这样可以避免资源争抢和潜在的线程安全问题。
升级到支持多环境的 Flink 版本:在一些较新的 Flink 版本中,已经提供了对多环境的支持。你可以查阅官方文档来了解如何在多线程环境下安全地使用 Flink。
建议用Flink的restful提交一个任务,先把Flink任务写好,把参数都预留出来,springboot取调flink的restful,启动一个任务。尽量不要把Flink和springboot耦合在一起,此回答整理自钉群“【③群】Apache Flink China社区”
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
实时计算Flink版是阿里云提供的全托管Serverless Flink云服务,基于 Apache Flink 构建的企业级、高性能实时大数据处理系统。提供全托管版 Flink 集群和引擎,提高作业开发运维效率。