Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache flink ApacheFlink:对数据集进行排序并使用事件时间从多个输入文件创建数据流_Apache Flink_Flink Streaming - Fatal编程技术网

Apache flink ApacheFlink:对数据集进行排序并使用事件时间从多个输入文件创建数据流

Apache flink ApacheFlink:对数据集进行排序并使用事件时间从多个输入文件创建数据流,apache-flink,flink-streaming,Apache Flink,Flink Streaming,目前,我正在进行一个项目,其中我有一个CSV文件,需要在“流处理”之前进行预处理。因此,我需要执行批处理和流处理。具体来说,我的data.csv文件需要在特定字段上进行预处理和排序,该字段将用作流处理的EventTime时间戳。下面的批处理脚本生成预处理的输出: final ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment(); DataSet<Tuple3<Long, String, St

目前,我正在进行一个项目,其中我有一个CSV文件,需要在“流处理”之前进行预处理。因此,我需要执行批处理和流处理。具体来说,我的
data.csv
文件需要在特定字段上进行预处理和排序,该字段将用作流处理的
EventTime
时间戳。下面的批处理脚本生成预处理的输出:

final ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();
DataSet<Tuple3<Long, String, String>> compactData = env
    .readTextFile("data.csv")
    .flatMap(new RichFlatMapFunction<String, Tuple3<Long, String, String>>() {
      private CustomDelegate delegate;
      @Override
      public void open(Configuration parameters) throws Exception {
        delegate = new CustomDelegate();
      }
      @Override
      public void flatMap(String s, Collector<Tuple3<Long, String, String>> out)
          throws Exception {
        Tuple3<Long, String, String> datum = delegate.deserializeRide(s);
        if (datum != null)
          out.collect(datum);
      }
    });
compactData.partitionByRange(0)
    .sortPartition(0, Order.ASCENDING)
    .writeAsCsv("output_dir", "\n", ",");
env.execute();
问题2:我将目录
output\u dir
定义为输入,其中包含按字段0排序的文件。将根据我想要的顺序(即,在其字段0上)解析记录并将其放置在数据流上。如果没有,我相信我在分配时间戳方面会有问题(对吗?)?我可以从多个文件中读取
DataStream
(就像我现在做的那样),还是必须将所有文件合并为一个文件,并通过从单个文件中连续读取所有记录来创建数据流

问题1:我的问题是这些文件是否基于全局顺序生成。实际上,与文件2中的记录相比,文件1中的记录是否具有更小的值(依此类推)?如果没有,我如何保证前面的或类似的内容

否。因为有32个分区,所以每个分区中的数据都是有序的。但是不能保证不同输出文件之间的数据顺序。您可以手动将sortPartition运算符的并行度设置为1,或者实现自己的分区器而不是哈希分区器

问题2:我将目录output_dir定义为输入,其中包含按字段0排序的文件。将根据我想要的顺序(即,在其字段0上)解析记录并将其放置在数据流上。如果没有,我相信我在分配时间戳方面会有问题(对吗?)?我可以从多个文件中读取数据流(就像我现在做的那样),还是必须将所有文件合并为一个文件,并通过从单个文件中连续读取所有记录来创建数据流


假设有32个输出文件,如果流作业的并行度也是32,则每个文件将被一个并行度消耗,来自此输入文件的所有数据将根据当前并行度中文件中出现的数据顺序进行处理。但一旦您尝试从32并行中聚合数据或尝试洗牌数据,数据的顺序将不再排序。如果您希望接收者对数据进行全局排序,您可能需要将所有数据放在一个文件中,并使用一个并行的流作业处理这些数据。

谢谢您的回答。关于问题1,我遵照您的建议,在单个文件中生成了全局排序的数据。转到问题2,似乎如果我想基于EventTime处理数据,那么我就坚持并行性等于1。我说得对吗?@nick.katsip对于问题2,如果您希望严格按照事件时间逐个处理所有记录,则操作员处理这些记录的并行度应为1,并确保此操作员的输入记录也是全局排序的。如果数据集不是很大,只需将批处理作业和流处理作业的并行度设置为1,记录将按全局顺序处理。再次感谢David的评论。显然,在Flink 1.2上,我必须使用
windowAll()
转换,然后使用1的并行性来根据事件时间顺序处理数据。再次感谢您的回答和评论。
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime);
// Phase 0: Collect input and create timestamps
DataStream<Tuple3<Long, String, Integer>> dataStream = env
    .readTextFile("output_dir")
    .map(new MapFunction<String, Tuple3<Long, String, Integer>>() {
      @Override
      public Tuple3<Long, String, Integer> map(String s) throws Exception {
        String[] tokens = s.split(",");
        return new Tuple3<Long, String, Integer>(Long.parseLong(tokens[0]),
            tokens[1] + "-" + tokens[2], 1);
      }
    })
    .assignTimestampsAndWatermarks(
        new AscendingTimestampExtractor<Tuple3<Long, String, Integer>>() {
          @Override
          public long extractAscendingTimestamp(Tuple3<Long, String, Integer> t) {
            return t.f0;
          }
        });
env.execute();