Flink CEP简单示例----对用户访问页面顺序检测

Flink CEP简单示例----对用户访问页面顺序检测

CEP是flink早期推出的一个的库,是基于一些规则模型,检测异常行为。比如检测反爬虫,或检测优惠活动褥羊毛行为等。

下面简单介绍一下项目背景,使用CEP做模式检测。

需求:

因公司针对会员,发放优惠券活动,因防止羊毛党褥羊毛,通过Flink CEP进行异常检测。检测规则,如果同一个设备号在5分钟内顺序访问login页面–>my页面–>ling quan页面超过5次,那么该数据print至窗口。

这里使用python脚本来模拟用户的行为日志。

1、Flink CEP检测代码:

public class CEPDemo {

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

        StreamExecutionEnvironment sEnv = StreamExecutionEnvironment.getExecutionEnvironment();
        sEnv.setParallelism(1);
        
        Properties p = new Properties();
        p.setProperty("bootstrap.servers", "localhost:9092");
        p.setProperty("group.id", "test");
        DataStreamSource<String> ds = sEnv.addSource(new FlinkKafkaConsumer09<String>("cep", new SimpleStringSchema(), p));

        KeyedStream<Event, String> keyedStream = ds
                .map(new MapFunction<String, Event>() {
                    @Override
                    public Event map(String value) throws Exception {
                        return new Gson().fromJson(value, Event.class);
                    }
                })
                .assignTimestampsAndWatermarks(new AscendingTimestampExtractor<Event>() {
                    @Override
                    public long extractAscendingTimestamp(Event element) {
                        return element.timestamp;
                    }
                }).keyBy(new KeySelector<Event, String>() {

                    @Override
                    public String getKey(Event value) throws Exception {
                        return value.driverId;
                    }
                });


        Pattern<Event, Event> pattern = Pattern.<Event>begin("first")
                .where(new SimpleCondition<Event>() {
                    @Override
                    public boolean filter(Event value) throws Exception {
                        return value.event.equals("login");
                    }
                })
                .next("second").where(new SimpleCondition<Event>() {
                    @Override
                    public boolean filter(Event value) throws Exception {
                        return value.event.equals("my");
                    }
                })
                .followedBy("end").where(new SimpleCondition<Event>() {
                    @Override
                    public boolean filter(Event value) throws Exception {
                        return value.event.equals("ling quan");
                    }
                })
                .within(Time.minutes(5)) // 5分钟内
                .timesOrMore(5);// 超过5次


        PatternStream<Event> patternStream = CEP.pattern(keyedStream, pattern);
        patternStream.process(new PatternProcessFunction<Event, String>() {
            @Override
            public void processMatch(Map<String, List<Event>> match, Context ctx, Collector<String> out) throws Exception {
                out.collect(match.toString());
            }
        }).print();

        sEnv.execute("CEP");
    }
}
2、模拟kafka的product的python脚本
import random
import time

from kafka import KafkaProducer

if __name__ == '__main__':

    driver_ids = ["1001", "1002", "1003", "1004", "1005", "1006", "1007", "1008", "1009"]
    events = ["register", "login", "my", "search", "list", "detail", "order", "ling quan"]
    p = KafkaProducer(bootstrap_servers="localhost:9092")

    while True:
        i = random.randint(0, len(driver_ids) - 1)
        driverId = driver_ids[i]
        index = random.randint(0, len(events) - 1)
        event = events[index]
        timestamp = int(time.time() * 1000)
        v = '{"driverId":"%s","event":"%s","timestamp":%s}' % (driverId, event, timestamp)
        print(v)
        p.send("cep", bytes(v, encoding="utf-8"))
        p.flush()

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单Flink CEP 的例子: 假设我们有一个数据流,它包含了用户的登录和登出事件,我们想要在用户登录后的 10 分钟内检测用户的登出事件,以便我们可以计算用户的在线时间。我们可以使用 Flink CEP 来实现这个功能。 首先,我们需要定义登录和登出事件的数据结构: ```java public class LoginEvent { public long userId; public String ip; public String eventType; public long timestamp; } public class LogoutEvent { public long userId; public long timestamp; } ``` 然后,我们可以创建一个 Flink DataStream,并使用 Flink CEP 来定义模式,以便检测用户的登录和登出事件: ```java DataStream<LoginEvent> loginEventStream = ... Pattern<LoginEvent, ?> loginPattern = Pattern.<LoginEvent>begin("start") .where(new SimpleCondition<LoginEvent>() { @Override public boolean filter(LoginEvent loginEvent) throws Exception { return "login".equals(loginEvent.eventType); } }); Pattern<LogoutEvent, ?> logoutPattern = Pattern.<LogoutEvent>begin("start") .where(new SimpleCondition<LogoutEvent>() { @Override public boolean filter(LogoutEvent logoutEvent) throws Exception { return true; } }) .within(Time.minutes(10)); PatternStream<LoginEvent> patternStream = CEP.pattern( loginEventStream.keyBy("userId"), loginPattern.followedByAny(logoutPattern)); DataStream<Tuple2<Long, Long>> onlineTimeStream = patternStream.select( (Map<String, LoginEvent> first, Map<String, LogoutEvent> second) -> { long userId = first.get("start").userId; long startTime = first.get("start").timestamp; long endTime = second.get("start").timestamp; return Tuple2.of(userId, endTime - startTime); }); ``` 在上面的代码中,我们定义了两个模式:登录模式和登出模式。登录模式表示一个用户的登录事件,而登出模式表示一个用户的登出事件。我们使用 keyBy() 方法将数据流按照用户 ID 进行分区,并使用 followedByAny() 方法将登录模式和登出模式组合在一起。 最后,我们可以使用 select() 方法来处理匹配到的模式,并计算用户的在线时间。在 select() 方法中,我们从匹配到的模式中获取用户 ID、登录时间和登出时间,并计算在线时间。 以上就是一个简单Flink CEP 的例子。在实际应用中,我们可以根据需要定义更复杂的模式,并使用 Flink CEP 来实现各种复杂的业务逻辑。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值