Samza是LinkedIn開源的一款流處理器,本文介紹了Samza在LinkedIn公司的應用情況,Samza在流處理方面的優勢、新特性以及下一步的規劃。LinkedIn使用Samza提升實時用戶體驗中央流量控制:在LinkedIn,發送給用戶的所有郵件都會經由中央Email分發Samza任務處理,該任務會根據特定的策略和窗口標準將同一用戶的所有郵件進行聚合,最終向用戶發送一個匯總的Email,而不是將每個應用程序的Email單獨發送給用戶。
廣告關聯:使用Samza計算廣告點擊率(CTR),通過Samza連接廣告點擊事件流和廣告展現事件流,并聚合一些其他維度的數據來計算點擊率。
新聞遞送:使用Samza連接包含“用戶查看事件”的事件流和包含所有“新聞條目”的事件流從而判斷為每個用戶推送新聞的推送質量。該系統每天會處理數十億事件。
標準化和關聯管道:基于Samza構建標準化平臺,當用戶在LinkedIn網站上修改職稱、公司名稱、地理位置等信息時,該管道能使用機器學習模型和關聯規則快速解析所有同義詞,將名稱不同但含義相同的詞語關聯到一起。
監控A/B測試期間網站的速度:實時監控A/B測試期間的各項指標,觀察測試時間窗口內各指標對網站速度的影響,并對發現的異常進行警報。
作為轉換管道:使用Samza進行模式轉換和聚合,生成事件并發送到Kafka實時事件輸入流,實現與已有的Graph引擎和Pinot分析數據庫等系統的集成。
調用圖:用戶訪問LinkedIn的過程中會產生很多服務調用事件,這些數據會被發送到Kafka,之后Samza會基于唯一的“TreeID”聚合這些數據并生成網站健康報告。
安全:通過Samza分析事件流,實時發現安全隱患、生成警報并執行防護措施。
Samza的主要優勢模型非常適合構建高性能有狀態的應用程序
大部分有狀態的事件處理應用要么需要從遠程數據庫中讀取數據,要么需要在應用內部維護狀態,但是這些方式會有I/O或者CPU瓶頸。而Samza對本地集成數據庫有良好的支持,可以在事件處理器中集成RocksDB,從而將數據存儲在本地,所有的數據獲取操作都在本地完成,十分高效。將應用程序邏輯與底層的消息傳輸解耦
Samza支持可插拔的消息源(消費者)和蓄水池(生產者),用戶可以根據自己的需要將Kafka、ZeroMQ等事件源直接與Samza結合到一起使用,不需要預先將來自于不同事件源的數據匯聚到統一的消息系統進行標準化處理。Samza的新特性宿主親和(Affinity)和狀態重用
啟動任務時,Samza會將主機和容器之間的映射關系存儲到“協調流”中;關閉任務時,Samza會將該任務的所有狀態保存到RocksDB和偏移文件中;再次啟動任務時,YARN會按照映射關系將容器分配到它之前運行的那一臺機器上,并恢復之前的狀態數據繼續運行。
廣播流
不需要重啟Samza就能通過修改“配置參數”動態改變整個應用程序的行為。
協調流
之前任務配置是以環境變量的形式通過命令行傳遞的,這種方式變量的個數有限制。新版本增加了一個名為“協調流”的集中持久流,用戶可以將配置和相關系統信息存儲到該流中,然后通過它來修改任務的動態配置。
RocksDB TTL
可以讓Samza狀態存儲中的老舊數據自動過期。
為HDFS和ElasticSearch提供了新的系統生產者
集成HDFS生產者和ElasticSearch生產者 ,能夠將應用程序的輸出直接寫入到HDFS和ElasticSerarch。
Samza框架無縫升級
不再需要將Samza和應用程序一起打包,只需要將Samza二進制包預裝到集群,應用程序會自動加載預裝到集群中的Samza。
啟動和停止能力
提供了一個可以啟動或者停止單個Samza任務的REST API。
通過在Samza任務中為容器指定一組靜態的分區分配,擺脫了對YARN的依賴。
不需要任何YARN依賴就能讓Samza應用程序運行在AWS EC2等實例上。
下一步計劃
Samza即類庫
解耦協調邏輯和YARN托管邏輯,使Samza能夠支持Mesos、Kubernetes等其他的集群管理系統,以及AWS EC2、Microsoft Azure Compute、Google Compute等無集群管理器的云計算平臺。雖然靜態分區分配特性已經實現了部分功能,但是安裝配置依然非常復雜,未來將進一步優化。
進程支持并行執行
在Samza中,每個應用程序運行在獨立的容器(進程)中,每個容器單線程執行,這種方式內存利用率低。為了讓IO操作并行執行,需要分配大量容器,且容器間的數據無法共享,為了解決這一問題,Samza將增加并行執行特性。
支持DAG (有向無環圖)
簡化DAG的表達方式,簡化多階段事件處理管道的配置和創建,使之易于部署、監控和升級。
支持Window和Join操作符
支持Window和Join操作符,讓Samza應用程序在事件延遲到達的情況下也能產生精確的結果。