我想使用flink流处理文件,其中两行属于同一流。在第一行中有一个标题,在第二行中有一个对应的文本。
文件位于我的本地文件系统上。我正在使用readFile(fileInputFormat, path, watchType, interval, pathFilter, typeInfo)
方法和自定义FileInputFormat
。
我的流作业类如下:
final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
DataStream<Read> inputStream = env.readFile(new ReadInputFormatTest("path/to/monitored/folder"), "path/to/monitored/folder", FileProcessingMode.PROCESS_CONTINUOUSLY, 100);
inputStream.print();
env.execute("Flink Streaming Java API Skeleton");
和我的ReadInputFormatTest
是这样的:
public class ReadInputFormatTest extends FileInputFormat<Read> {
private transient FileSystem fileSystem;
private transient BufferedReader reader;
private final String inputPath;
private String headerLine;
private String readLine;
public ReadInputFormatTest(String inputPath) {
this.inputPath = inputPath;
}
@Override
public void open(FileInputSplit inputSplit) throws IOException {
FileSystem fileSystem = getFileSystem();
this.reader = new BufferedReader(new InputStreamReader(fileSystem.open(inputSplit.getPath())));
this.headerLine = reader.readLine();
this.readLine = reader.readLine();
}
private FileSystem getFileSystem() {
if (fileSystem == null) {
try {
fileSystem = FileSystem.get(new URI(inputPath));
} catch (URISyntaxException | IOException e) {
throw new RuntimeException(e);
}
}
return fileSystem;
}
@Override
public boolean reachedEnd() throws IOException {
return headerLine == null;
}
@Override
public Read nextRecord(Read r) throws IOException {
r.setHeader(headerLine);
r.setSequence(readLine);
headerLine = reader.readLine();
readLine = reader.readLine();
return r;
}
}
按预期,标题和文本一起存储在一个对象中。但是,该文件被读取八次。所以问题是并行化。我在哪里以及如何指定一个文件只能处理一次,而要并行处理几个文件?
还是我必须进一步更改自定义FileInputFormat
?
答案 0 :(得分:0)
我将修改您的源以发出可用的文件名(而不是实际的文件内容),然后添加一个新处理器以从输入流中读取名称,然后发出成对的行。换句话说,将当前源拆分为一个源,然后是一个处理器。可以使处理器以任何并行度运行,并且源将是单个实例。