基本原理
简介
-
flink支持大规模计算能力,能够在多个节点上并发运行,具有高吞吐以及低延迟的特点
-
flink是有状态的和容错的,保证了其Exactly-Once语义,可以无缝的从故障中恢复
-
flink提供了多种算子,数据处理灵活多样
工作原理
-
JobClient 负责接收用户程序,解析和优化程序的执行计划,然后提交到JobManager,
-
JobManager负责协调资源及控制Job的任务执行并进行对应的状态保证和容错
-
TaskManager是运行在不同节点上的JVM进程,负责接收JobManager发送过来的task的任务
-
Task运行在TaskManager的Slot上
-
Slot是TaskManager资源粒度的划分,每个Slot都有自己独立的内存,但是共享了TaskManager的CPU,Slot的个数就代表了一个程序的最高并行度
-
flink算子说明与代码解析
Map
输入与输出一比一对应的算子,例如传入的是一个整型的集合,输出的是进行map算法计算后的整型的集合
接口声明:
public interface MapFunction<T, O> extends Function, Serializable {
O map(T var1) throws Exception;
}
由代码定义可以看出,接收的是一个T,对应输出了一个O
实现举例(将源数据中的Integer值扩大10倍)
SingleOutputStreamOperator<Integer> result = streamSource.map(new MapFunction<Integer, Integer>()
{
@Override
public Integer map(Integer item) throws Exception
{
return item \* 10;
}
});
Flite
定义判断条件,符合条件的进行过滤,这里与map不同的是,如果有被过滤掉的值,那么输出可能会比原先的值少
接口声明:
public interface FilterFunction<T> extends Function, Serializable {
boolean filter(T var1) throws Exception;
}
实现举例(去掉string为"test"的字符串)
DataStream<String> FilterRes1 = source.filter(new FilterFunction<String>() {
@Override
public boolean filter(String s) throws Exception {
if (s.equals("test")) {
return true;
}
return false;
}
});
FlatMap
输入与输出为一对多的形式(可以做到替代map和filter的操作,但是map与filter可以让代码更为清晰简洁)
代码interface
public interface FlatMapFunction<T, O> extends Function, Serializable {
void flatMap(T var1, Collector<O> var2) throws Exception;
}
由代码interface可以看出,输入的是T,计算后,输出O的一个Collecto
代码实现示例(收集大于等于0的数据)
streamSource.flatMap(new FlatMapFunction<Integer, Integer>() {
@Override
public void flatMap(Integer item, Collector<Integer> out) throws Exception {
if (item < 0) {
item = -item;
}
o