Flink-1.10.0中的readTextFile解读
最近在学习Flink,研究了一些东西,在准备自定义一个简单的监听文件的source作为练手的时候,遇到了一个问题。就是应该如何在自己的source中决定哪个分区读取哪个文件?学习过spark的我们知道,source会被切分,然后每个分区读取自己分区的输入切片数据即可。那么Flink如何进行输入分片的切分的呢?我们如果自定义的source需要是一个并行的source时,又该如何实现呢?
带着这个疑问,查看了Flink-1.10.0的源代码,查看Flink的readTextFile算子是如何实现的。
首先,使用以下代码演示一个问题
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
DataStreamSource test = env.socketTextStream("localhost", 8888);
System.out.println("test source parallel:\t" + test.getParallelism()); //test的分区数量为1
test.print(); // socket的每一行元素会在不同的分区进行输出
通过上面的简单的代码展示我们可以知道:
print是一个并行的sink,即使和单并行的source一起使用也会并行的输出。
getParallelism方法可以查看DateStream的分区数量。
那么我们来查看分析一下Flink中的readTextFile的源码吧。
首先,在IDEA中一步步查看readTextFile的实现,前面的方法基本都是检查参数和补全一些默认参数,最后调用的方法为createFileInput。代码如下
private DataStreamSource createFileInput(FileInputFormat inputFormat,
TypeInformation typeInfo,
String sourceName,
FileProcessingMode monitoringMode,
long interval) {
// 检查参数
Preconditions.checkNotNull(inputFormat, "Unspecified file input format.");
Preconditions.checkNotNull(typeInfo, "Unspecified output type information.");
Preconditions.checkNotNull(sourceName, "Unspecified name for the source.");
Preconditions.checkNotNull(monitoringMode, "Unspecified monitoring mode.");
Preconditions.checkArgument(monitoringMode.equals(FileProcessingMode.PROCESS_ONCE) ||
interval >= ContinuousFileMonitoringFunction.MIN_MONITORING_INTERVAL,
"The path monitoring interval cannot be less than " +
ContinuousFileMonitoringFunction.MIN_MONITORING_INTERVAL + " ms.");
// 输入分片构建的函数类
ContinuousFileMonitoringFunction monitoringFunction =
new ContinuousFileMonitoringFunction<>(inputFormat, monitoringMode, getParallelism(), interval);
// 读取输入分片的具体实现类
ContinuousFileReaderOperator reader =
new ContinuousFileReaderOperator<>(inputFormat);
/*
* 和我们使用env.addSource一样,但是后面进跟着调用了一个transform。
* 这里就是整个解析中要重点说明的一点,monitoringFunction中只是负责构建数据切片的
* 到这一步,其实这个source的并行度还是1
*
* 调用transform方法之后,将数据切片中的内容读取出来,