繁体   English   中英

如何将 Flink 中的 window 时间保存到文本文件?

[英]How do I save a time window in Flink to a text file?

我开始在 Java 的 ApacheFlink 工作。

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

到目前为止,我设法对收到的内容应用了文本转换简化,我应该使用 apply 或 process 将 window 的结果写入文件我有点迷茫。

到目前为止,这是我的代码

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));
        }
    }
}

如果您希望将每分钟 window 到 go 的结果保存到其自己的文件中,您可以查看将StreamingFileSink与一分钟存储桶一起使用——这应该可以满足您的需求,或者非常接近。

我认为您实际上最终会为每个 window 找到一个目录,其中包含来自 window 的每个并行实例的文件——但是当您使用timeWindowAll时,它不会并行运行,每个存储桶将只有一个文件,除非结果太大以致文件翻转。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM