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 分钟前
Elasticsearch Query DSL 指令整理
大数据·数据库·笔记·学习·elasticsearch·搜索引擎·全文检索
doris61010 分钟前
设备点检、保养、维修一站式解决方案
大数据·数据库·人工智能
海上彼尚18 分钟前
Go之路 - 3.go的数据类型与转换
开发语言·后端·golang
EriccoShaanxi24 分钟前
穿越高温地层:加速度计如何成为石油钻井的核心感官
大数据·算法
半夏知半秋27 分钟前
Elasticsearch专用的ES|QL语法指令整理
大数据·数据库·elasticsearch·搜索引擎·全文检索
Li_76953227 分钟前
Spring Cloud — SkyWalking(六)
java·后端·spring·spring cloud·skywalking
2201_7578308735 分钟前
SpringBoot
java·spring boot·后端
程序员Sunday1 小时前
为什么 AI 明明写后端更爽,但却都网传 AI 取代前端,而不是 AI 取代后端?就离谱...
前端·后端
程序员西西1 小时前
深入剖析 Java 中的 ZGC 机制:原理、优势与实践
java·后端·算法
海上彼尚1 小时前
Go之路 - 4.go的集合[完整版]
开发语言·后端·golang