---toc: truetitle: 滴滴實時計算髮展之路及平臺架構實踐date: 2019-08-25tags:git
滴滴的核心業務是一個實時在線服務,所以具備豐富的實時數據和實時計算場景。本文將介紹滴滴實時計算髮展之路以及平臺架構實踐。github
隨着滴滴業務的發展,滴滴的實時計算架構也在快速演變。到目前爲止大概經歷了三個階段:sql
下圖標識了其中重要的里程碑,稍後會給出詳細闡述:json
在2017年之前,滴滴並無統一的實時計算平臺,而是各個業務方自建小集羣。其中用到的引擎有Storm、JStorm、Spark Streaming、Samza等。業務方自建小集羣模式存在以下弊端:緩存
爲了有效解決以上問題,滴滴從2017年年初開始構建統一的實時計算集羣及平臺。微信
技術選型上,咱們基於滴滴現狀選擇了內部用大規模數據清洗的Spark Streaming引擎,同時引入On-YARN模式,並利用YARN的多租戶體系構建了認證、鑑權、資源隔離、計費等機制。session
相對於離線計算,實時計算任務對於穩定性有着更高的要求,爲此咱們構建了兩層資源隔離體系:架構
咱們經過改造YARN的FairScheduler使其支持Node Label。達到的效果以下圖所示:框架
普通業務的任務混跑在同一個Label機器上,而特殊業務的任務跑在專用Label的機器上。機器學習
經過集中式大集羣和平臺化建設,基本消除了業務方自建小集羣帶來的弊端,實時計算也進入了第二階段。
伴隨着業務的發展,咱們發現Spark Streaming的Micro Batch模式在一些低延時的報警業務及在線業務上顯得捉襟見肘。因而咱們引入了基於Native Streaming模式的Flink做爲新一代實時計算引擎。
Flink不只延時能夠作到毫秒級,並且提供了基於Process Time/Event Time豐富的窗口函數。基於Flink咱們聯合業務方構架了滴滴流量最大的業務網關監控系統,並快速支持了諸如乘客位置變化通知、軌跡異常檢測等多個線上業務。
爲了最大程度方便業務方開發和管理流計算任務,咱們構建瞭如圖所示的實時計算平臺:
在流計算引擎基礎上提供了StreamSQL IDE、監控報警、診斷體系、血緣關係、任務管控等能力。各自的做用以下:
在滴滴內部有大量的實時運營場景,好比「某城市乘客冒泡後10秒沒有下單」。針對這類檢測事件之間依賴關係的場景,用Fink的CEP是很是合適的。
可是社區版本的CEP不支持描述語言,每一個規則須要開發一個應用,同時不支持動態更新規則。爲了解決這些問題,滴滴作了大量功能擴展及優化工做。功能擴展方面主要改動有:
除了功能拓展以外,爲了應對大規模運營規則的挑戰,滴滴在CEP性能上也作了大量優化,主要有:
以上優化將CEP性能提高了多個數量級。配合功能擴展,咱們在滴滴內部提供瞭如圖所示的服務模式:
業務方只須要清洗數據並提供規則列表API便可具有負責規則的實時匹配能力。
目前滴滴CEP已經在快車個性化運營、實時異常工單檢測等業務上落地,取得了良好的效果。
正如離線計算中Hive之於MapReduce同樣,流式SQL也是必然的發展趨勢。經過SQL化能夠大幅度下降業務方開發流計算的難度,業務方再也不須要學習Java/Scala,也不須要理解引擎執行細節及各種參數調優。
爲此咱們在2018年啓動了StreamSQL建設項目,在社區Flink SQL基礎上拓展瞭如下能力:
擴展DDL語法。以下圖所示,打通了滴滴內部主流的消息隊列以及實時存儲系統(StreamSQL內置打通消息隊列及實施存儲):
目前StreamSQL在滴滴已經成功落地,流計算開發成本獲得大幅度下降。預期將來將承擔80%的流計算業務量。
做爲一家出行領域的互聯網公司,滴滴對實時計算有自然的需求。
過去的一年多時間裏,咱們從零構建了集中式實時計算平臺,改變了業務方自建小集羣的局面。爲知足低延時業務的需求,成功落地了Flink Streaming,並基於Flink構建了實時規則匹配(CEP)服務以及StreamSQL,使得流計算開發能力大幅度下降。將來將進一步拓展StreamSQL,並在批流統1、IoT、實時機器學習等領域探索和建設。
微信公衆號:zhisheng
另外我本身整理了些 Flink 的學習資料,目前已經所有放到微信公衆號(zhisheng)了,你能夠回覆關鍵字:Flink 便可無條件獲取到。另外也能夠加我微信 你能夠加個人微信:yuanblog_tzs,探討技術!
更多私密資料請加入知識星球!
之後這個項目的全部代碼都將放在這個倉庫裏,包含了本身學習 flink 的一些 demo 和博客
一、Flink 從0到1學習 —— Apache Flink 介紹
二、Flink 從0到1學習 —— Mac 上搭建 Flink 1.6.0 環境並構建運行簡單程序入門
三、Flink 從0到1學習 —— Flink 配置文件詳解
四、Flink 從0到1學習 —— Data Source 介紹
五、Flink 從0到1學習 —— 如何自定義 Data Source ?
六、Flink 從0到1學習 —— Data Sink 介紹
七、Flink 從0到1學習 —— 如何自定義 Data Sink ?
八、Flink 從0到1學習 —— Flink Data transformation(轉換)
九、Flink 從0到1學習 —— 介紹 Flink 中的 Stream Windows
十、Flink 從0到1學習 —— Flink 中的幾種 Time 詳解
十一、Flink 從0到1學習 —— Flink 讀取 Kafka 數據寫入到 ElasticSearch
十二、Flink 從0到1學習 —— Flink 項目如何運行?
1三、Flink 從0到1學習 —— Flink 讀取 Kafka 數據寫入到 Kafka
1四、Flink 從0到1學習 —— Flink JobManager 高可用性配置
1五、Flink 從0到1學習 —— Flink parallelism 和 Slot 介紹
1六、Flink 從0到1學習 —— Flink 讀取 Kafka 數據批量寫入到 MySQL
1七、Flink 從0到1學習 —— Flink 讀取 Kafka 數據寫入到 RabbitMQ
1八、Flink 從0到1學習 —— Flink 讀取 Kafka 數據寫入到 HBase
1九、Flink 從0到1學習 —— Flink 讀取 Kafka 數據寫入到 HDFS
20、Flink 從0到1學習 —— Flink 讀取 Kafka 數據寫入到 Redis
2一、Flink 從0到1學習 —— Flink 讀取 Kafka 數據寫入到 Cassandra
2二、Flink 從0到1學習 —— Flink 讀取 Kafka 數據寫入到 Flume
2三、Flink 從0到1學習 —— Flink 讀取 Kafka 數據寫入到 InfluxDB
2四、Flink 從0到1學習 —— Flink 讀取 Kafka 數據寫入到 RocketMQ
2五、Flink 從0到1學習 —— 你上傳的 jar 包藏到哪裏去了
2六、Flink 從0到1學習 —— 你的 Flink job 日誌跑到哪裏去了
2八、Flink 從0到1學習 —— Flink 中如何管理配置?
2九、Flink 從0到1學習—— Flink 不能夠連續 Split(分流)?
30、Flink 從0到1學習—— 分享四本 Flink 國外的書和二十多篇 Paper 論文
3二、爲何說流處理即將來?
3三、OPPO 數據中臺之基石:基於 Flink SQL 構建實時數據倉庫
3六、Apache Flink 結合 Kafka 構建端到端的 Exactly-Once 處理
3八、如何基於Flink+TensorFlow打造實時智能異常檢測平臺?只看這一篇就夠了
40、Flink 全網最全資源(視頻、博客、PPT、入門、原理、實戰、性能調優、源碼解析、問答等持續更新)
4二、Flink 從0到1學習 —— 如何使用 Side Output 來分流?
四、Flink 源碼解析 —— standalone session 模式啓動流程
五、Flink 源碼解析 —— Standalone Session Cluster 啓動流程深度分析之 Job Manager 啓動
六、Flink 源碼解析 —— Standalone Session Cluster 啓動流程深度分析之 Task Manager 啓動
七、Flink 源碼解析 —— 分析 Batch WordCount 程序的執行過程
八、Flink 源碼解析 —— 分析 Streaming WordCount 程序的執行過程
九、Flink 源碼解析 —— 如何獲取 JobGraph?
十、Flink 源碼解析 —— 如何獲取 StreamGraph?
十一、Flink 源碼解析 —— Flink JobManager 有什麼做用?
十二、Flink 源碼解析 —— Flink TaskManager 有什麼做用?
1三、Flink 源碼解析 —— JobManager 處理 SubmitJob 的過程
1四、Flink 源碼解析 —— TaskManager 處理 SubmitJob 的過程
1五、Flink 源碼解析 —— 深度解析 Flink Checkpoint 機制
1六、Flink 源碼解析 —— 深度解析 Flink 序列化機制
1七、Flink 源碼解析 —— 深度解析 Flink 是如何管理好內存的?
1八、Flink Metrics 源碼解析 —— Flink-metrics-core
1九、Flink Metrics 源碼解析 —— Flink-metrics-datadog
20、Flink Metrics 源碼解析 —— Flink-metrics-dropwizard
2一、Flink Metrics 源碼解析 —— Flink-metrics-graphite
2二、Flink Metrics 源碼解析 —— Flink-metrics-influxdb
2三、Flink Metrics 源碼解析 —— Flink-metrics-jmx
2四、Flink Metrics 源碼解析 —— Flink-metrics-slf4j
2五、Flink Metrics 源碼解析 —— Flink-metrics-statsd
2六、Flink Metrics 源碼解析 —— Flink-metrics-prometheus
2七、Flink 源碼解析 —— 如何獲取 ExecutionGraph ?
30、Flink Clients 源碼解析原文出處:zhisheng的博客,歡迎關注個人公衆號:zhisheng