flink读取不到文件_Flink-1.10.0中的readTextFile解读

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方法之后,将数据切片中的内容读取出来,

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值