我们计划使用Flink处理来自kafka主题的数据流(以Json格式登录)。
但是对于那个处理,我们需要使用每天都在变化的输入文件,并且其中的信息可以完全改变(不是格式,而是内容)。
每当其中一个输入文件发生变化时,我们就必须将这些文件重新加载到程序中并继续进行流处理。
重新加载数据可以像现在这样完成:
DataSet<String> globalData = env.readTextFile("file:///path/to/file");
但到目前为止,我无法找到示例或想出一种方法来在流处理作业中触发重新加载。
作为额外信息,我们不会在每个节点上使用HDFS而是本地文件系统,因此必须在本地文件的每个节点中完成重新加载。 这是因为我们需要HDFS的唯一原因是这个输入文件总共只有100 MB,使用HDFS会有点过分。
到目前为止,我一直在尝试使用RichMapFunction,试图找到一个提供此功能的kafka主题(重新加载文件)并试图找到这个例子而没有运气。
编辑:
在阅读了更多内容之后,我在几个地方发现了这是可行的方法:DataArtisans examples。
尝试创建一个简单的代码,可以在控制流的流中进行简单的更改,我得到了以下代码:
public class RichCoFlatMapExample extends EventTimeJoinHelper {
private String config_source_path = "NOT_INITIALIZED";
@Override
public void open(Configuration conf) {
config_source_path = "first_file_path";
}
public abstract void processElement1(String one, String two, Collector<String> out) {
config_source_path = one;
}
public abstract void processElement2(String one, String two, Collector<String> out) {
String three = two + config_source_path;
out.collect(three);
}
}
我现在遇到的问题是,无论我尝试什么,我都会收到以下错误:
类'RichCoFlatMapExample'必须声明为abstract或在'RichCoFlatMapExample'中实现抽象方法'processElement1(String,String,Collector)'
问题是,请求的方法已实现,但我不能在非抽象类中使它们“抽象”(我从IDE中得到错误)。 如果我创建RichCoFlatMapExample类,我将无法从Flink方法(dataStream方法)调用它。
我不确定发生了什么,但我认为必须接近。如果我做这项工作,我会继续尝试和更新。
答案 0 :(得分:3)
Flink可以监控目录并在文件移动到该目录时提取文件;也许这就是你要找的东西。请参阅PROCESS_CONTINUOUSLY option for readfile in the documentation。
但是,如果数据在Kafka中,那么使用Flink的Kafka消费者直接将数据流式传输到Flink会更自然。还有documentation about using the Kafka connector。 Flink培训包括an exercise on using Kafka with Flink。