一、数据源
1、内置数据源
- 基于文件
- 基于socket
- 基于collection
2、自定义数据源
- 实现SourceFuncition (非并行)
- 实现ParalleSourceFuncition
- 实现RichParalleSourceFuncition (如需打开/关闭数据源,打开/关闭连接)
3、自定义数据源例子
public class SimpleSourceFunction implements ParallelSourceFunction<Long> {
private long num = 0L;
private volatile boolean isRunning = true;
@Override
public void run(SourceContext<Long> sourceContext) throws Exception{
while (isRunning){
sourceContext.collect(num);
num ++;
Thread.sleep(10000);
}
}
@Override
public void cancel(){
isRunning = false;
}
}
二、转换算子
三、DataSink
1、常用的sink
2、自定义sink
- 实现SinkFunction接口
- 继承RichSinkFunction
四、流式迭代运算(Iterations)
1、简单的理解迭代
- 当前运算的输出作为下一运算的输入
- 不断反复进行某个运算知道满足某个条件退出
2、流式迭代计算
- 没有最大迭代次数
- 需要通过split/filter转换操作指定流的那些部分反馈给那些算子,哪些部分数据被转发到下游DataStream
3、基本套路
- 基于输入流构建IterativeStream(迭代头)
- 定义迭代逻辑(map func等)
- 定义反馈流逻辑(从迭代过的流中过滤出符合条件的元素组成部分流反馈给迭代头进行重复计算的逻辑)
- 调用IterativeStream的closeWith的方法可以关闭一个迭代
- 定义终止迭代的逻辑(符合条件的元素将被下发给下游而不用于进行下一次迭代)
流式迭代计算例子:
package org.myorg.quickstart;
import org.apache.flink.api.common.functions.FilterFunction;
import org.apache.flink.api.common.functions.MapFunction;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.datastream.IterativeStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
// 输入一组数据对其分别减10,直达为0
public class IterativeStreamJob {
public static void main(String[] args) throws Exception {
final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
DataStream<Long> input = env.generateSequence(0,100);
// 基于输入流构建IterativeStream
IterativeStream<Long> itStream = input.iterate();
// 定义迭代逻辑(map func等)
DataStream<Long> minusOneStream = itStream.map(new MapFunction<Long, Long>(){
@Override
public Long map(Long value) throws Exception {
return value -10;
}
});
// 定义反馈流逻辑
DataStream<Long> feedBackStream = minusOneStream.filter(new FilterFunction<Long>() {
@Override
public boolean filter(Long value) throws Exception {
return value > 0;
}
});
// 调用IterativeStream的closeWith的方法可以关闭一个迭代
itStream.closeWith(feedBackStream);
// 定义终止迭代的逻辑
DataStream<Long> outputStream = minusOneStream.filter(new FilterFunction<Long>() {
@Override
public boolean filter(Long value) throws Exception {
return value<=0;
}
});
outputStream.print();
env.execute("IterativeStreamJob");
}
}
五、Execution 参数
1、默认情况下,流中的元素并不会一个一个的在网络中传输(这会导致不必要的网络流量消耗),而是缓存起来,缓存的time大小可以在Flink的配置文件、ExecutionEnvironment、设置某个算子上进行配置(默认100ms)
- 好处:提高吞吐
- 坏处:增加延时
六、调试
1、Flink 提供以下一些方法可以进行调试
- 本地执行环境
- Collection Data Sources
- Iterator Data Sink ( Iterator<T> output = DataStreamUtils.collect(outputStream);)
集合数据源--模拟数据源 (程序测试成功后,将source 和sink 替换为真正的source 和 sink)
final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.fromElements(1,2,3,4);
env.fromCollection(Collection);
env.fromCollection(Iterator, Class);
env.generateSequence(1,100);