Flink 有两种主要的任务调度器:
- 单线程调度器(single threaded scheduler):在同一个线程中执行所有任务。这种调度器简单、debug 友好,但是性能较低。
- 多线程调度器(multithreaded scheduler):将任务分配给多个线程执行,提高了程序的并发性。Flink 提供三种多线程调度器:
- 共享线程调度器(shared thread scheduler):任务共享线程池中的线程,线程数固定。
- 私有线程调度器(owning thread scheduler):每个 task 都拥有独立的线程。
- 弹性调度器(elastic scheduler):可以动态调整线程池大小,任务需要等待空闲线程。
这些调度器的主要区别在于:
- 线程模型:单线程 vs 多线程
- 线程分配方式:共享 vs 独占 vs 弹性
- 性能:单线程 < 共享线程 < 弹性调度器 < 独占线程
- 资源消耗:单线程 < 共享线程 < 弹性调度器 < 独占线程
我们可以通过 StreamExecutionEnvironment 的 setScheduler() 方法设置 Flink 程序使用的调度器。
例如:
- 单线程调度器:
env.setScheduler(new SingleThreadScheduler());
- 共享线程调度器:
env.setScheduler(new SharedThreadScheduler());
- 私有线程调度器:
env.setScheduler(new OwnThreadScheduler());
- 弹性调度器:
ThreadPoolExecutorScheduler scheduler = new ThreadPoolExecutorScheduler(min, max);
env.setScheduler(scheduler);
Flink 提供的不同调度器可以满足各种需求:
- 单线程调度器适用于 debug;
- 共享线程调度器适用于资源受限的环境;
- 私有线程调度器可以获得最高性能;
- 弹性调度器在资源利用率和性能之间达到平衡。
选择合适的调度器可以优化 Flink 程序的执行效率。