免费下载!由 O’Reilly 出版的《NGINX 完全指南》中文版已正式上线 了解详情
写点什么

Flink 在大搜车流计算的探索与实践

  • 2019-09-05
  • 本文字数:3184 字

    阅读完需:约 10 分钟

Flink在大搜车流计算的探索与实践

互联网的高速发展使得对数据实效性的要求越来越高,基于数据流的流计算越来越重要。以 Flink 为代表的新一代流计算引擎以其高吞吐、低延迟、checkpoint、state、time、window 等特性方便了我们对数据流的高效处理。


Flink 是一个框架和分布式处理引擎,用于对无界和有界数据流进行状态计算。Flink 起源于德国柏林工业大学的一个研究项目 Stratosphere,Flink 从 Stratosphere 的分布式执行引擎开始,并于 2014 年 3 月成为 Apache Incubator 项目。2014 年 12 月,Flink 成为 Apache 顶级项目。

Why flink

high throughput & low latency。流计算任务对吞吐和延迟有着很高要求,Spark Streaming 通过微批去实现流处理,而 Flink 是纯流式计算的思路,可以满足高吞吐和低延迟。



图 1 latency 对比



图 2 throughput 对比


state & checkpoint。流计算任务中 state 管理是非常重要的一部分,在 Storm 等框架中需要开发人员自己去管理 state,同时 Storm 不支持批计算,而 Flink 能够支持批流统一。Flink 通过内置的 state 使得我们可以像使用集合类一样方便进行状态操作,同时得益于 checkpoint 机制,通过 Chandy-Lamport 算法产生一个分布式快照,保证了 exactly-once 并可以进行快速的故障恢复。


time & window。现在流处理中,对 time 的支持必不可少,Flink 中,processing time 表示处理消息的时间、event time 表示流数据中包含的业务时间时间、ingestion time 表示进入到系统的时间。watermark 也是一个很关键的概念。基于 event time 必须指定如何生成事件 watermark,这是表示事件时间进度的机制。通过 watermark 声明不会再有任何小于该 watermark 的时间戳的数据元素到来,即使一些事件延迟到达,也不至于过于影响窗口计算的正确性。watermark 很好的解决了 event time 乱序的问题。此外,Flink 还提供了一套便捷的窗口操作包括滚动窗口、滑动窗口、会话窗口。

流计算开发平台

大搜车旗下包括车易拍、车行 168、运车管家、布雷克索等公司,以及深度战略合作的长城汽车、长安汽车、英菲尼迪等主机厂商,以及与中石油昆仑好客等产业链上下游的合作伙伴。


Flink 在大搜车各个业务域有着广泛的应用,如日志分析、物联网、实时数仓等。大搜车基于 Flink 的流计算的开发平台,经历了从小到大的历程。

整体架构


图 3 大搜车流计算平台架构

统一脚手架

最初各个任务是自己创建 maven 工程,过程中发现开发人员需要花大量时间去结果依赖冲突的问题,同时线上会出现由于版本带来的各种问题。为了解决这个问题,我们提供 maven 提供的脚手架创建一个任务模板。生成的作业模板 pom.xml 已经将 Flink 相关的依赖进行了处理。


mvn org.apache.maven.plugins:maven-archetype-plugin:2.4:generate \-DarchetypeGroupId=com.souche \-DarchetypeArtifactId=jingwei-quickstart \-DarchetypeVersion=1.1.0-SNAPSHOT
复制代码


开发人员无需再花时间处理依赖冲突,也方便后续 Flink 版本的升级。同时我们对 Flink 中的常见 source 及 sink,如 kafka、mysql,进行了封装,开发人员通过简单配置即可接入数据源,对于 kakfa 还可以通过统一参数管理进行 offset 重置进行任务重跑,此外在任务 Dispatcher 中配置任务重启策略等。

统一工作台

最初我们依赖 Flink Web 工作台进行,随着业务量的增加,我们发现诸多不便,对于权限管理、任务版本、执行 savepoint 等功能不能很好支持,因此我们开发了一个统一的流计算工作台(精卫)。包含如下功能:


  • 任务运行/恢复

  • 版本管理

  • 任务暂停(savepoint)

  • 权限管理

  • 日志查询

  • 运行监控

  • 图 4 任务开发



图 5 版本管理

SQL 开发

Java API 的问题


  1. 开发效率及成本


通过 Java API 基于 DataStream 开发流计算任务,通过脚手架解决了依赖冲突的问题,但是开发人员还是要通过 flatmap、filter、keyby、window 等 Operator 去开发流计算任务,同时要经过打包,上传及发布等流程,调试过程中出现问题需要重新执行上述流程,这便造成了流计算任务开发缓慢、效率低下的问题。开发周期长,一个开发人员很难同时维护多个任务。


  1. 维护成本


同时任务一旦出现问题,平台开发运维人员不了解具体业务,不能快速处理问题,往往需要查看业务源代码来进行问题定位和处理。


SQL 的重要性


如何解决这些问题,能提升开发人员的效率,并减少平台方的运维成本?SQL 是一个很好的解决方案。SQL 语言是一个高级的非过程化语言,1974 诞生至今,经久不衰,语言简洁,在开发人员、DBA、数据分析师中都有着良好的基础。同时我们看到在大数据离线处理领域,也经历了 MapReduce 到 Hive 的发展过程,当下 Hive 以其快速、高效、易于维护的特性已经成为数据仓库的重要组成部分。因此支持 Flink SQL 开发流计算任务变得尤为重要。


我们知道 SQL 是作用于关系表的,流计算是对流数据的处理,为什么可以用 SQL 开发流计算任务?回答这个问题,就要提到流与表的等价性。以 Mysql 和 Binlog 为例,Mysql 的对表的操作会通过 Binlog 形成携带时间的数据流,主从同步中会通过对 Binlog 数据流的处理形成一张表。因此,流与表是等价的,流跟表可以进行互转,因此作用于关系表的 SQL 可以适用于流计算中。


SQL 实践


Flink 当前版本(1.8)对 DDL、维表 join 等功能尚不完善,同时内置 UDF 少、connector 少,开发 SQL 任务繁琐,没法做到百分百 SQL 开发流计算任务。阿里巴巴开源的 BLink 对 DDL、维表 join、UDF 等功能有了很大的增强,对于 connector 和 SQL 任务提交等功能开源版本尚不完善。为了解决能够实现完全 SQL 开发流计算任务,我们对 SQL 任务提交接口和 connector 进行了扩展。通过实现 sql-client 中的 Executor 实现了 SQL 任务的 Rest 接口,并提供参数配置、Savepoint 等功能。通过实现 StreamTableSink 、 StreamTableSourceFactory


、 LookupableTableSource 等接口实现了自定义 connector 及维表 join 功能。



图 6 维表时序图


以此,实现了以 Flink SQL 方式提供平台化服务。通过 SQL 语言优势降低了业务开发成本,提升了开发效率,减少运维成本。原来需要两周的任务,三天既可以上线,上百行的 Java 代码,可以缩减到几十行 SQL 脚本。出现问题后,平台开发人员可以快速定位和解决问题。



图 7 SQL 任务开发与运行

运维监控

监控报警


流计算任务不同于离线任务,对数据的实时性要求很高,一旦任务出现异常,出现数据堆积将直接影响下游应用,因此流计算任务的监控报警极为重要。大搜车基于 Flink Metrics 并在关键节点(source、sink)开发了自定义监控指标,通过 Prometheus+Grafana 实现了对 Flink 集群的监控及 Flink Job 的监控 Dashboard。同时对任务状态、集群资源等关键指标进行了报警规则的配置,确保平台开发人员可以第一时间获取集群异常信息。



图 8 Flink job 监控


Flink on yarn


Flink 支持 standalone 和 yarn/k8s 等模式,大搜车包括多个工作域,出于业务的需求要进行资源隔离,yarn 模式可以实现对资源的隔离,同时资源按需使用提升资源率。


日志采集


通过 Flink Web 工作台可以方便的查看日志,但是如果日志过多则会出现加载缓慢甚至页面 Crash。可以通过修改 conf 下日志配置进行按日滚动和日志拆分,大搜车在实践过程中,会将 Flink 应用日志通过 Flume 进行采集对接日志平台,方便开发人员定位问题。


远程调试


Flink 是运行在 JVM 上的,因此可以通过配置相关参数进行 remote debug。


export JVM_ARGS="-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005"
复制代码


再通过 IDE 新建 remote



图 9 远程调试


Checkpoint


checkpoint 的时间间隔不要太小,分钟级别即可。


//interval 5minenv.enableCheckpointing(1000 * 60 * 5);
复制代码

后期规划

  • SQL 任务可视化调试

  • 任务血缘关系分析


作者简介


张迪,大搜车基础架构部资深数据研发工程师,现负责大搜车流计算平台的建设与研发。


本文转载自公众号 大搜车 TED 技术沙龙 (ID: souchedata)


原文链接https://mp.weixin.qq.com/s/KVmS0ZToSxlrpdTtclOj4A


2019-09-05 13:362973

评论

发布
暂无评论
发现更多内容

nginx 惊群处理及原子锁技术

赖猫

nginx 高并发 服务器开发 C++后台开发

十亿级流量的搜索前端,是怎么做架构升级的?

百度Geek说

大前端 架构设计

直流电源防反接电路设计

不脱发的程序猿

嵌入式 28天写作 硬件设计 直流电源 防反接电路设计

微服务框架相关技术整理

架构 微服务

最新整理:Google/网易/腾讯/百度/华为面经(25个专题 1W字答案解析)

比伯

Java 编程 程序员 架构 面试

开源分享 | 火遍全网的「蚂蚁呀嘿」教程来了!

百度开发者中心

paddle 开源 #飞桨#

Pgbouncer最佳实践:系列二

PostgreSQLChina

数据库 postgresql 开源 软件 开源社区

如果软件测试行业没门槛了,你开心么?

程序员阿沐

软件测试 自动化测试 测试开发 测试工程师 黑盒测试

SQL Server 多表数据增量获取和发布 2.2

happlyfox

数据库 学习 28天写作 3月日更

RocketMQ安装部署

云淡风轻

RocketMQ

【黑科技】爬虫也可以一键获取 [加载更多] 数据,无编码学爬虫之三。

梦想橡皮擦

Python 28天写作 3月日更

【LeetCode】二维区域和检索 - 矩阵不可变Java题解

Albert

算法 LeetCode 28天写作

谷歌android!通宵都要看完这个Android关键技术点,威力加强版

欢喜学安卓

android 程序员 面试 移动开发

总结:近几年有哪些不错的scrum工具

PingCode

Scrum 敏捷 敏捷开发 研发管理 研发工具

LeetCode题解:188. 买卖股票的最佳时机 IV,动态规划,JavaScript,详细注释

Lee Chen

算法 大前端 LeetCode

在敏捷项目管理情境下,如何做多项目管理?

PingCode

敏捷 敏捷开发 研发管理 研发效能 研发工具

与 Hadoop 对比,我是如何看待 Spark 技术?

TASKCTL

大数据 hadoop spark 存储

力扣(LeetCode)刷题,简单+中等题(第30期)

不脱发的程序猿

面试 程序人生 算法 LeetCode 28天写作

severless架构演进思考杂谈

鲍师傅的铜锣烧

Serverless 架构

作为产品经理,如何分析和管理你的产品需求?

PingCode

敏捷开发 研发管理 需求管理 需求 研发工具

最新热点:钉钉公布低代码开发者画像,这些数据意味着什么?

优秀

哪些应用场景在使用语音连麦

anyRTC开发者

音视频 WebRTC RTC 语音社交

Java程序员福音!蚂蚁+字节+腾讯+龙湖地产+美团+滴滴+猿辅导1000+面试题总结

Java架构追梦

Java 架构 面试 金三银四

滴普FastData系列-自动化数据集成服务DCT可编程调度容器设计

容器 数据传输 数据集成

产品经理训练营 Week7 作业

Mai

话说 synchronized

木子的昼夜

Java

谷歌开发安卓系统!Android面试你必须要知道的那些知识,全网疯传

欢喜学安卓

android 程序员 面试 移动开发

接口测试--apipost变量使用(一)

测试人生路

产品训练营--第五期作业

曦语

产品训练营

互联网公司的「敏捷开发」流程是怎么样的?典型的敏捷团队是什么样?

PingCode

敏捷 敏捷开发 研发管理 研发效能 研发工具

高效搜索信息,你需要掌握这些谷歌搜索技巧

LeanCloud

开发者 大前端 工作效率

Flink在大搜车流计算的探索与实践_架构_张迪_InfoQ精选文章