Kafka-Flink-Stream处理:有没有办法将输入文件重新加载到流式处理中使用的变量中?

时间:2017-10-20 10:22:57

标签: apache-flink flink-streaming

我们计划使用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方法)调用它。

我不确定发生了什么,但我认为必须接近。如果我做这项工作,我会继续尝试和更新。

1 个答案:

答案 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