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
相关推荐
豌豆花下猫3 分钟前
Python 潮流周刊#78:async/await 是糟糕的设计(摘要)
后端·python·ai
YMWM_5 分钟前
第一章 Go语言简介
开发语言·后端·golang
码蜂窝编程官方22 分钟前
【含开题报告+文档+PPT+源码】基于SpringBoot+Vue的虎鲸旅游攻略网的设计与实现
java·vue.js·spring boot·后端·spring·旅游
天冬忘忧32 分钟前
Kafka 生产者全面解析:从基础原理到高级实践
大数据·分布式·kafka
hummhumm40 分钟前
第 25 章 - Golang 项目结构
java·开发语言·前端·后端·python·elasticsearch·golang
J老熊1 小时前
JavaFX:简介、使用场景、常见问题及对比其他框架分析
java·开发语言·后端·面试·系统架构·软件工程
青云交1 小时前
大数据新视界 -- Hive 数据仓库:构建高效数据存储的基石(下)(2/ 30)
大数据·数据仓库·hive·数据安全·数据分区·数据桶·大数据存储
AuroraI'ncoding1 小时前
时间请求参数、响应
java·后端·spring
zmd-zk1 小时前
flink学习(2)——wordcount案例
大数据·开发语言·学习·flink
电子手信1 小时前
知识中台在多语言客户中的应用
大数据·人工智能·自然语言处理·数据挖掘·知识图谱