0%

Flink 引擎与实时推荐

Flink引擎与Kafka

Flink是流处理框架,Kafka消息队列是最广泛使用的消息队列(JDQ、JMQ),Flink引擎通常用来处理 Kafka消息队列中的消息(Topic);

  • Flink 提供两种类型类型 API:DataStream API; Table API;(数据流中同样提供两种API形式做数据处理,并提供可以进行转换的算子进行不同API间算子的串联)
  • Datastream API 和 Table API 不相互依赖,可以混合使用
  • 支持流处理和批处理
  • 共享槽位组,可以实现资源隔离(Java 线程上隔离)
  • 支持并行度设置,客户端执行预处理并转换为并行数据流形式,由TM和JM来执行

重要特性

支持窗口类型

  • 滑动窗口,移动窗口,移动window slile, window_slide < window_size
  • 滚动窗口,window_slide = 0时的窗口
  • 会话窗口和全局窗口用的不多
    Flink 按照时间窗口(window)来处理流数据,把缓存在内存中数据进行批处理。通过连接曝光数据和点击数据,计算 CTR。

    问题?分割两个窗口怎么办?

    滑动窗口提供给两窗口时间间隔足够时间做 Join,避免数据遗漏

支持有状态流

  • 容错机制完善,提供checkpoint和statebackends(状态存储)功能
  • 提供 memory、filesystem、rocksDB三种类型的状态存储机制

Kafka 介绍

  • 分布式的多副本,基于 Zookeeper 的分布式消息流平台
  • 多用于提交日志从而做全链路分析、流量跟踪(点击流)从而做推荐、实时监控
  • 支持消息压缩,支持LZ4、snappy等格式

特性

  • 高吞吐,10几万条消息/s
  • 高伸缩,每个主题包含多个 partition
  • 容错性,集群中某个节点失败,Kafka集群可以正常工作
  • 支持设置检查点,可以从停止时的检查点重新启动
  • 支持重置位点功能,可以从指定位点进行消费
  • 提供多消费者、生产者、broker(独立Kafka服务器,域名+端口号)

Flink批流一体Kappa架构浅谈

优点

  • 无存储系统,运行速度快
  • 增加数据重播功能,数据落盘后进行落盘数据处理,保证代码维护一致性

难点

  • 已构造数据体系
  • 批流一体难以共享一套代码,复杂特征(用户观看视频的百分比)
  • 数据时间跨度大、计算复杂,难以实现

实操

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
DataStream<Rating> ratingStream = inputStream.map(Rating::new);
ratingStream.keyBy(rating -> rating.userId)
.timeWindow(Time.seconds(1))
.reduce(
(ReduceFunction<Rating>) (rating, t1) -> {
if (rating.timestamp.compareTo(t1.timestamp) > 0){
return rating;
}else{
return t1;
}
}
).addSink(new SinkFunction<Rating>() {
@Override
public void invoke(Rating value, Context context) {
System.out.println("userId:" + value.userId + "\tlatestMovieId:" + value.latestMovieId);
}
});

Flink引擎搭建实时数仓

美团基于 Flink 的实时数仓建设实践

Welcome to my other publishing channels