Flink实现topurl的线上实践

背景

线上已有的架构是基于 Spark+ClickHouse 实现的,spark 直接把原始数据写入ck,数据量为几万qps。但是线上另外一个业务有百万级别qps,这种架构存储量巨大,所以需要先计算出topurl,之后存到ck进行查询。但是由于spark没有日志时间概念,所以采用flink方案。

Flink配置

env配置

  1. 并行度(parallsim):根据数据量级进行配置
  2. 重启策略(RestartStrategy):这里我们选择了fixed-delay的方式,重试5次间隔10秒

详见: nightlies.apache.org/flink/flink...

  1. 指定时间为事件时间
  2. checkpoint相关配置,包括checpoint timeout,两次checkpoint间隔,stateBackend等。

详见:nightlies.apache.org/flink/flink...

uid和name

  1. uid:这是算子的唯一id,每个算子都应该有唯一id,特别是有状态的算子,将state映射到正确的算子上。
  2. name:可视化的名称。
  1. kafkaConsumer常规配置:
    • bootstrap.servers
    • group.id
    • auto.offset.reset
    • kafka.consumer.group
    • 反序列化器SimpleStringSchema
  2. commit offset方式:
    • 如果 checkpoint 关闭,commit offset 要依赖于 kafka 客户端的 auto commit。需设置enable.auto.commit,auto.commit.interval.ms 参数到 consumer properties,就会按固定的时间间隔定期 auto commit offset 到 kafka。
    • 这里我们开启了checkpoint,作业消费的 offset 是 Flink 在 state 中自己管理和容错。提交 offset 作为外部进度的监控。此时需要 setCommitOffsetsOnCheckpoints 为 true 来设置当 checkpoint 成功时提交 offset 到 kafka。此时 commit offset 的间隔就取决于 checkpoint 的间隔,所以此时从 kafka 一侧看到的 lag 可能并非完全实时,如果checkpoint 间隔比较长 lag 曲线可能会是一个锯齿状
  3. 消费并行度和kafka分区数之间的关系:尽量设置1:1,如果资源有限设置1:2,但是消费并行度不能大于kafka分区数,否则会导致部分消费线程没数据,会发现此时watermark不生成,无法做cp。
  1. kafkaSink常规配置:
    • bootstrap.servers
    • kafka.sink.topic
    • 序列化器SimpleStringSchema
  2. 结合kafka的事务,两阶段提交 linkKafkaProducer.Semantic.EXACTLY_ONCE
  3. 并行度和kafka分区对应关系:
    • 默认使用FlinkFixedPartition,sink task < partition 个数时会有部分 partition 没有数据写入
    • partitioner设置为null,使用RoundRobin方式,轮询写入每个partition,每个task需要和所有partition建连接。

Flink topurl执行图

  1. 从kafka读取数据;日志清洗,字段抽取;分配时间戳和水位线
  2. 按照domain,url,timestamp对数据流分组;开一个10s的滚动窗口;每个窗口中按照key对value求和
  3. 按照窗口结束时间分组;计算每个窗口的topurl
  4. 写入kafka

执行脚本

使用yarn-application模式执行,执行脚本:

ini 复制代码
./bin/flink run-application -t yarn-application \
-Dtaskmanager.numberOfTaskSlots=10 \
-Dparallelism.default=10 \
-Dyarn.application.name="TopurlTest" \
-Dtaskmanager.memory.managed.size=0 \
-c com.jd.flink.job.TopUrl \
/xxx/flink-start-1.0-SNAPSHOT.jar topurl 10 \
--detached \

更多参数可以参考:

nightlies.apache.org/flink/flink...

任务停止并且做sp:

bash 复制代码
/xxx/flink-1.12.0/bin/flink cancel -s hdfs://xxx/flink/savepoint/ id -yid application_id
相关推荐
没逻辑1 天前
gocron - 分布式定时任务管理系统
后端
程序猿DD1 天前
人工智能如何改变 Anthropic 的工作方式
java·后端
桦说编程1 天前
Guava Forwarding系列类详解——装饰器模式实战
java·后端·设计模式
香精煎鱼香翅捞饭1 天前
记一次多线程调用TDEngine restful获取数据的时间异常
大数据·时序数据库·tdengine
VX:Fegn08951 天前
计算机毕业设计|基于springboot + vue敬老院管理系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
算法与双吉汉堡1 天前
【短链接项目笔记】Day2 用户注册
java·redis·笔记·后端·spring
AI_56781 天前
Webpack5优化的“双引擎”
大数据·人工智能·性能优化
Victor3561 天前
Netty(18)Netty的内存模型
后端
Victor3561 天前
Netty(17)Netty如何处理大量的并发连接?
后端