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
相关推荐
求学小火龙27 分钟前
ElasticSearch介绍+使用
java·大数据·elasticsearch
檀越剑指大厂29 分钟前
【Elasticsearch系列六】系统命令API
大数据·elasticsearch·搜索引擎
数据运营新视界1 小时前
你知道企业架构中核心的4大架构联系和不同吗?
大数据·架构
Lingbug1 小时前
.Net日志组件之NLog的使用和配置
后端·c#·.net·.netcore
h177113472051 小时前
基于区块链的相亲交易系统源码解析
大数据·人工智能·安全·系统架构·交友
计算机学姐1 小时前
基于SpringBoot+Vue的篮球馆会员信息管理系统
java·vue.js·spring boot·后端·mysql·spring·mybatis
好兄弟给我起把狙1 小时前
[Golang] Select
开发语言·后端·golang
程序员大金1 小时前
基于SpringBoot+Vue+MySQL的智能物流管理系统
java·javascript·vue.js·spring boot·后端·mysql·mybatis
ac-er88883 小时前
在Flask中处理后台任务
后端·python·flask
ac-er88883 小时前
Flask中的钩子函数
后端·python·flask