Flink在流式计算中,必须要根据数据源来生成相应的DataStream(本文章只针对StreamExecutionEnvironment流式计算,不考虑Flink的批处理),而基于文件的源中有三种获取源的方法:
//逐行读取文本文件,即符合规范的文件,并将其作为字符串返回。
readTextFile(path)- TextInputFormat
// -根据指定的文件输入格式读取(一次)文件。
readFile(fileInputFormat, path)
//这个在代码块外说
readFile(fileInputFormat, path, watchType, interval, pathFilter, typeInfo)
readFile(fileInputFormat, path, watchType, interval, pathFilter, typeInfo)方法是前两个内部调用的方法。它根据参数给定的path读取文件fileInputFormat。根据提供的内容watchType,此源可以定期(每intervalms)监视路径中的新数据(FileProcessingMode.PROCESS_CONTINUOUSLY),或处理一次路径中当前的数据并退出(FileProcessingMode.PROCESS_ONCE)。使用pathFilter,用户可以进一步从文件中排除文件。
当在参数中实现FileInputFormat时,因为它是一个抽象类,所以需要你通过匿名内部类的方式构造一个他的子类来实现FileInputFormat未实现的方法,具体需要重新实现的方法见如下代码块
@Override
public InputSplitAssigner getInputSplitAssigner(InputSplit[] inputSplits) {
return null;
}
@Override
public void open(InputSplit inputSplit) throws IOException {
}
@Override
public boolean reachedEnd() throws IOException {
return false;
}
@Override
public Object nextRecord(Object o) throws IOException {
return null;
}
找了很多中文资料,发现没有对InputFormat接口解释的文章,所以我自己去读的官方api
从以上示例可以得出如下结论:
所有输入格式化的类(例如FileInputformat,BinaryInputFormat等)的最上层接口都是InputFormat,只不过是有一些高级的,明确输入内容的高级类把InputFormat的接口实现了而已。
下面对InpuFormat接口的抽象方法进行说明(直接上官方文档)
配置此输入格式。由于输入格式是通用实例化的,因此是无参数的,因此此方法是输入格式基于配置值设置其基本字段的地方。
始终优先在新实例化的输入格式上调用此方法。
参数:
parameters -具有所有参数的配置(注意:不是Flink配置,而是TaskConfig)。
从此格式描述的输入中获取基本统计信息。如果输入格式不知道如何创建这些统计信息,则它可能返回null。此方法有选择地获取统计信息的缓存版本。输入格式可以检查它们并决定是否直接返回它们而无需花费精力重新收集统计信息。
调用此方法时,保证可以配置其输入格式。
参数:
cachedStatistics-缓存的统计信息。可能为空。
返回值:
输入的基本统计信息;如果不可用,则为null。
抛出:
IOException
创建可以并行处理的输入的不同拆分。
调用此方法时,保证可以配置其输入格式。
指定者:
createInputSplits 在界面中 InputSplitSource
参数:
minNumSplits-所需的最小分割数。如果创建的更少,则某些并行实例可能保持空闲状态。
返回值:
可以并行处理的此输入的拆分。
抛出:
IOException -分割的创建错误时抛出。
获取此输入格式处理的输入拆分的类型。
指定者:
getInputSplitAssigner 在界面中 InputSplitSource
返回值:
输入拆分的类型。
打开输入格式的并行实例以进行拆分。
调用此方法时,保证可以配置其输入格式。
参数:
split -要打开的拆分。
抛出:
IOException -如果由于I / O问题而无法打开唾液,则将其抛出
用于检查输入是否结束的方法。
调用此方法时,保证可以打开输入格式。
返回值:
如果到达末尾,则为true,否则为false。
抛出:
IOException -如果发生I / O错误,则抛出该异常
从输入中读取下一条记录。
调用此方法时,保证可以打开输入格式。
参数:
reuse -可以重用的对象。
返回值:
阅读记录。
抛出:
IOException -如果发生I / O错误,则抛出该异常。
标记输入拆分的生命周期结束的方法。应该用于关闭频道和流并释放资源。此方法无误返回后,假定输入已正确读取。
调用此方法时,保证可以打开输入格式。
抛出:
IOException -如果无法正确关闭输入,则将其抛出。
因篇幅问题不能全部显示,请点此查看更多更全内容