【问题标题】:Flink CEP No Results PrintedFlink CEP 没有打印结果
【发布时间】:2016-09-19 14:45:30
【问题描述】:

如果使用 Flink CEP 库找到 Hello 和 world,我正在尝试打印出一个字符串。我的来源是 Kafka,并使用控制台生产者输入数据。那部分正在工作。我可以打印出我进入主题的内容。但是,它不会打印出我的最后一条消息“世界真好!”。它甚至不会打印出它进入了 lambda。下面是类

package kafka;

import org.apache.flink.cep.CEP;
import org.apache.flink.cep.PatternStream;
import org.apache.flink.cep.pattern.Pattern;
import org.apache.flink.streaming.api.TimeCharacteristic;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.api.windowing.time.Time;
import org.apache.flink.streaming.connectors.kafka.FlinkKafkaConsumer08;
import org.apache.flink.streaming.util.serialization.SimpleStringSchema;
import org.apache.flink.util.Collector;

import java.util.Map;
import java.util.Properties;

/**
 * Created by crackerman on 9/16/16.
*/
public class WordCount {

public static void main(String[] args) throws Exception {

    Properties properties = new Properties();
    properties.put("bootstrap.servers", "localhost:9092");
    properties.put("zookeeper.connect", "localhost:2181");
    properties.put("group.id", "test");
    StreamExecutionEnvironment see = StreamExecutionEnvironment.getExecutionEnvironment();
    see.setStreamTimeCharacteristic(TimeCharacteristic.EventTime);

    DataStream<String> src = see.addSource(new FlinkKafkaConsumer08<>("complexString",
                                                                      new SimpleStringSchema(),
                                                                      properties));

    src.print();


    Pattern<String, String> pattern = Pattern.<String>begin("first")
            .where(evt -> evt.contains("Hello"))
            .followedBy("second")
            .where(evt -> evt.contains("World"));

    PatternStream<String> patternStream = CEP.pattern(src, pattern);

    DataStream<String> alerts = patternStream.flatSelect(
            (Map<String, String> in, Collector<String> out) -> {
                System.out.println("Made it to the lambda");
                String first = in.get("first");
                String second = in.get("second");
                System.out.println("First: " + first);
                System.out.println("Second: " + second);

                if (first.equals("Hello") && second.equals("World")) {

                    out.collect("The world is so nice!");
                }


            });

    alerts.print();

    see.execute();
}

}

任何帮助将不胜感激。

谢谢!

【问题讨论】:

    标签: apache-flink flink-streaming flink-cep


    【解决方案1】:

    问题出在下面一行

     see.setStreamTimeCharacteristic(TimeCharacteristic.EventTime);
    

    如果将其删除,它将按我预期的方式工作。

    【讨论】:

    • 您是否指定了时间戳和水印?事件时间模式只有在你告诉 Flink 每条记录的时间以及已经过去了多少时间时才有效。如果没有这些信息,Flink 就无法在事件时间处理数据。如果您的数据无序到达或您有基于时间的操作(例如 windows),则需要事件时间才能产生一致的结果。
    • 我没有指定时间戳和水印。我已经回去并实施了这一点。感谢您的信息!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多