一个完整的例子
此示例将有关人员的记录流作为输入,并将其过滤为仅包括成年人。
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.api.common.functions.FilterFunction;
public class Example {
public static void main(String[] args) throws Exception {
final StreamExecutionEnvironment env =
StreamExecutionEnvironment.getExecutionEnvironment();
DataStream<Person> flintstones = env.fromElements(
new Person("Fred", 35),
new Person("Wilma", 35),
new Person("Pebbles", 2));
DataStream<Person> adults = flintstones.filter(new FilterFunction<Person>() {
@Override
public boolean filter(Person person) throws Exception {
return person.age >= 18;
}
});
adults.print();
env.execute();
}
public static class Person {
public String name;
public Integer age;
public Person() {}
public Person(String name, Integer age) {
this.name = name;
this.age = age;
}
public String toString() {
return this.name.toString() + ": age " + this.age.toString();
}
}
}
Stream execution environment
Flink运行时架构主要包括四个不同的组件,它们会在运行流处理应用程序时协同工作:
- 作业管理器(JobManager,管理job的执行,一个job一个jobManager)
- 任务管理器(TaskManager)
- 资源管理器(ResourceManager,flink集群自己的,不要和yarn的RM混淆;用于申请资源,如果flink部署在yarn上,会向yarn的RM申请资源,standalone模式下自己分配资源)
4) 分发器(Dispatcher,当job提交的时候,用于给job分配jobManager,有的模式没有该组件)。
因为Flink是用Java和Scala实现的,所以所有组件都会运行在Java虚拟机上。每个组件的职责如下:
1.作业管理器(JobManager)
(1) 1对1
- 一个JobManager控制一个应用程序执行的主进程.
- 也就是说,每个应用程序(application,ExecutionEnvironment)都会被不同的JobManager所控制执行。
(2) 接收应用程序
应用程序包括:两图+资源
作业图(JobGraph)、逻辑数据流图(logical dataflow graph)+ 打包了所有的类、库和其它资源的JAR包。
JobManager会把JobGraph转换成“执行图”(ExecutionGraph)。
(3) 向资源管理器(ResourceManager)请求资源
资源 = 任务管理器(TaskManager)中的插槽(slot)。
(4) JobManager到了足够的资源将执行图分发到真正运行它们的TaskManager上。
(5) 责所有需要中央协调的操作,比如说检查点(checkpoints)的协调。
2.资源管理器(ResourceManager)
(1)管理任务执行需要的插槽(slot)
插槽是Flink中定义的计算资源的单元。
(2)多种类
Flink提供了多种类的资源管理器,为了适用于将flink部署在各种资源管理框架上,比如YARN、Mesos、K8s,以及standalone部署。(flink的ResourceManager需要向资源管理框架申请资源,因此需要符合通信协议,比如yarn,mesos这些框架里面通信协议是不同的)
(3)请外援
当JobManager申请插槽资源时,ResourceManager会将有空闲插槽的TaskManager分配给JobManager。如果ResourceManager没有足够的插槽来满足JobManager的请求,它还可以向资源提供平台发起会话,以提供启动TaskManager进程的容器。
(4)释放计算资源
ResourceManager还负责终止空闲的TaskManager
3. 任务管理器(TaskManager)
- Flink中的工作进程。通常在Flink中会有多个TaskManager运行,每一个TaskManager都包含了一定数量的插槽(slots)。
- 插槽的数量限制了TaskManager能够执行的任务数量。
- 启动之后,TaskManager会向资源管理器注册它的插槽;
- 收到资源管理器的指令后,TaskManager就会将一个或者多个插槽提供给JobManager调用。JobManager就可以向插槽分配任务(tasks)来执行了。在执行过程中,一个TaskManager可以跟其它运行同一应用程序的TaskManager交换数据。
4.分发器(Dispatcher)
- 当一个应用被提交执行时,分发器就会启动并将应用移交给一个JobManager。
- 可以跨job运行,它为应用提交提供了REST接口。由于是REST接口,所以Dispatcher可以作为集群的一个HTTP接入点,这样就能够不受防火墙阻挡。
- Dispatcher也会启动一个Web UI,用来方便地展示和监控作业执行的信息。
- Dispatcher在架构中可能并不是必需的,这取决于应用提交运行的方式。(standalone 和 yarn session模式有,pro-job没有此组件)