lsource是程序的数据源输入,你可以通过StreamExecutionEnvironment.addSource(sourceFunction)来为你的程序添加一个source。
lflink提供了大量的已经实现好的source方法,你也可以自定义source
•通过实现sourceFunction接口来自定义无并行度的source,
•或者你也可以通过实现ParallelSourceFunction 接口 or 继承RichParallelSourceFunction 来自定义有并行度的source。
l基于文件
•readTextFile(path)
•读取文本文件,文件遵循TextInputFormat 读取规则,逐行读取并返回。
l基于socket
•socketTextStream
从socker中读取数据,元素可以通过一个分隔符切开。
l基于集合
•fromCollection(Collection)
•通过java 的collection集合创建一个数据流,集合中的所有元素必须是相同类型的。
l自定义输入
•addSource 可以实现读取第三方数据源的数据
•系统内置提供了一批connectors,连接器会提供对应的source支持【kafka】
source容错性分析
Source | 语义保证 | 备注 |
kafka | exactly once(仅一次) | 建议使用0.10及以上 |
Collections | exactly once |
|
Files | exactly once |
|
Socktes | at most once |
|
自己实现一个单并行度的source
/**
* @author zhangqi
* @date 2019/6/11 下午7:39
* 模拟产生1开始的数字
*/
public class MyNoParalleSource implements SourceFunction<Long> {
private Long count = 0L;
private boolean isRunning = true;
/**
* 主要的方法,启动一个source,大部分情况下都要在这个run方法中实现一个循环,这样可以循环产生数据
* @param sourceContext
* @throws Exception
*/
@Override
public void run(SourceContext sourceContext) throws Exception {
while (isRunning){
sourceContext.collect(count++);
Thread.sleep(1000L);
}
}
/**
* 取消一个cancel的时候回调用的方法,相当于一个钩子方法
*/
@Override
public void cancel() {
isRunning= false;
}
}
public class StreamingDemoWithSelfDefineSource {
public static void main(String[] args) throws Exception {
StreamExecutionEnvironment streamExecutionEnvironment = StreamExecutionEnvironment.getExecutionEnvironment();
DataStream<Long> dataStreamSource = streamExecutionEnvironment.addSource(new MyNoParalleSource());
DataStream<Long> env2 = dataStreamSource.map(t->{
System.out.println("接收到的数据:"+t);
return t;
}).timeWindowAll(Time.seconds(2)).sum(0);
env2.print();
streamExecutionEnvironment.execute();
}
}
以上例子不能设置多并行度,否则会报错
实现一个多并行度只需要把SourceFunction改成ParallelSourceFunction
Kafka的source放在后面讲