如何将Flink中的时间窗口保存到文本文件



我开始在Java的ApacheFlink中工作。

我的目标是在一分钟的时间窗口内使用ApacheKafka主题,这将应用非常基本的信息,并将每个窗口的结果记录在一个文件中。

到目前为止,我设法将文本转换简化为我收到的内容,我应该使用apply或process来编写文件——窗口的结果我有些迷失了。

这是我迄今为止的代码

package myflink;
import org.apache.flink.api.common.functions.FlatMapFunction;
import org.apache.flink.api.common.functions.MapFunction;
import org.apache.flink.api.common.serialization.SimpleStringSchema;
import java.time.ZoneId;
import java.util.Date;
import java.util.Properties;
import org.apache.flink.api.java.tuple.Tuple;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.api.java.tuple.Tuple3;
import org.apache.flink.shaded.akka.org.jboss.netty.channel.ExceptionEvent;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.functions.windowing.AllWindowFunction;
import org.apache.flink.streaming.api.functions.windowing.ProcessAllWindowFunction;
import org.apache.flink.streaming.api.functions.windowing.ProcessWindowFunction;
import org.apache.flink.streaming.api.functions.windowing.WindowFunction;
import org.apache.flink.streaming.api.watermark.Watermark;
import org.apache.flink.streaming.api.windowing.time.Time;
import org.apache.flink.streaming.api.windowing.windows.TimeWindow;
import org.apache.flink.streaming.connectors.kafka.FlinkKafkaConsumer;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.util.Collector;
import scala.util.parsing.json.JSONObject;
public class BatchJob {
public static void main(String[] args) throws Exception {
final StreamExecutionEnvironment  env = StreamExecutionEnvironment.getExecutionEnvironment();
Properties properties = new Properties();
properties.setProperty("bootstrap.servers", "localhost:9092");
properties.setProperty("zookeeper.connect", "localhost:2181");
properties.setProperty("group.id", "test");
properties.setProperty("auto.offset.reset", "latest");
FlinkKafkaConsumer consumer = new FlinkKafkaConsumer("topic-basic-test", new SimpleStringSchema(), properties);
DataStream<String> data = env.addSource(consumer);
data.flatMap(new JSONparse()).timeWindowAll(Time.minutes(1))."NEXT ??" .print()
System.out.println("Hola usuario 2");
env.execute("Flink Batch Java API Skeleton");
}
public static class JSONparse implements FlatMapFunction<String, Tuple2<String, String>> {
@Override
public void flatMap(String s, Collector<Tuple2<String, String>> collector) throws Exception {
System.out.println(s);
s = s + "ACA PODES JUGAR NDEAH";
collector.collect(new Tuple2<String,String>("M",s));
}
}
}

如果您希望每个一分钟窗口的结果都转到自己的文件中,您可以考虑使用带有一分钟存储桶的StreamingFileSink,这应该可以满足您的要求,或者非常接近。

我认为您最终会为每个窗口创建一个目录,其中包含来自该窗口的每个并行实例的一个文件——但当您使用不并行操作的timeWindowAll时,每个bucket将只有一个文件,除非结果太大,以至于文件会滚动。

顺便说一句,在FlatMap中进行JSON解析会表现得很差,因为这最终会为每个事件实例化一个新的解析器,这反过来会导致相当大的GC活动。最好使用RichFlatMap并在open((方法中创建一个解析器,以便对每个事件重用。更好的是,使用JSONKeyValueDeserializationSchema而不是SimpleStringSchema,并让kafka连接器为您处理json解析。

相关内容

  • 没有找到相关文章

最新更新