Categories
程式開發

Twitter 如何應用 Druid 分析 ZB 級實時數據?


Druid 是一個用於大數據實時查詢和分析的高容錯、高性能開源分佈式系統,旨在快速處理大規模的數據,並能夠實現快速查詢和分析。尤其是當發生代碼部署、機器故障以及其他產品系統遇到宕機等情況時,Druid 仍能夠保持 100% 正常運行。

Apache Druid社區在今年初發布了Druid 0.17.0。這是該項目自Apache Incubator畢業以來的第一個版本,因此也是一個重要的里程碑。

Twitter在一年多之前就開始採用Druid,並應用到多個場景中。對於Twitter的實踐經驗,我們採訪了Twitter大數據引擎負責人羅震霄。他將在QCon全球軟件開發大會(北京站)2020 分享主題為《Twitter ZB 級實時數據分析實踐》的演講。

羅震霄,Twitter Sr. Staff Engineer,負責 Twitter 大數據引擎的開發與運營,主要負責項目 Druid、Presto、Spark、Hive。在加入 Twitter 之前,在 Uber、Netflix、Facebook 從事大數據相關的研發與管理工作。是 Presto Foundation committer 和技術委員會委員。他於復旦大學獲得學士學位,並於 University of Wisconsin Madison 獲得碩士學位。

InfoQ:您好,請問Druid自開源以來,有哪些重要的演化?

羅震霄:Twitter用Druid已經有一年多了,從0.15到0.17,這幾個版本都比較穩定,主要的變化有:

  • 設計並實現了Native Ingestion,徹底擺脫了對MapReduce的依賴,可以直接Ingest Parquet,ORC文件。
  • Data Ingestion設計了Indexer Process。
  • SQL功能持續加強。
  • 方便易用的用戶界面。
  • 更全面的Security and Privacy Support,例如 LDAP Authentication and Authorization。

InfoQ:一般的企業,哪些場景需要使用Druid? Twitter為什麼選擇了Druid? Twitter裡有哪些Druid的應用舉例?

羅震霄:Druid的主要特點是性能快,規模大,易用性好。

  • 性能可以達到1秒以下,真正實現了大數據的實時性計算;
  • Druid單群可以擴展至2000台節點以上,很好的滿足了企業對大數據規模的要求;
  • Druid的用戶界面非常友好,用戶常常可以通過拖拖拽拽進行查詢,方便非技術類人員的應用。

Twitter業務有很多實時的大數據需求,我們當時對比了市場上現有的開源方案,在穩定性、擴展性、性能和易用性方面Druid都有一定優勢,最後選擇Druid。目前來看公司上下對Druid還比較滿意。

Twitter所有的user events都通過內部Message Queue導入Druid,用戶可以實時對Druid進行查詢,也可以在Druid基礎上設置各類的監控和提醒。實時監控很好的利用了Druid性能快和方便查詢的特性。

Twitter內部用Druid很多,有三大類:其一,將用戶行為數據導入Druid,進行實時用戶行為分析;其二,通過Druid為廣告商提供實時的廣告效果分析;其三,利用Druid的實時特性,做實時監控和實時報表。

InfoQ:比如現在某個企業已經有了成熟的Lamda架構的離線實時系統。而Druid也是Lamda架構的,那哪些部分是可以相互Share的嗎?

羅震霄:Druid需要自己的存儲,可以將Message Queue同時導入離線系統和實時系統(Druid)。

如果對一些數據經過濾後有實時的計算需求,也可以通過Hadoop Distributed File System將數據導入Druid。

一般來說,企業的Message Queue可以共享,Hadoop Distributed File System也可以作為Druid的數據源進行共享。

Twitter現在正在開發Presto Druid Connector,通過Presto實時查詢Druid數據,這樣企業內部的查詢語言,查詢系統也可以共享。

因為Twitter數據分析大多數是通過SQL進行的。公司上下對SQL on Druid的需求很高。

現有的DruidSQL功能不太完善,SubQuery、Join都不支持。如果將Druid數據再導入其他存儲系統,不僅費時費力,而且很難保證數據的一致性。基於這些考慮,我們決定開發Presto Druid Connector,用Presto對Druid數據提供完整的SQL分析,避免了數據重複,節省了存儲空間,而且還可以利用Presto Connector的優勢,跨平台進行Join操作,比如,Join Hadoop Data with Druid Data。

現在有一些用戶在使用Presto Druid Connector,大家還是比較滿意的。下一步,我們會進一步提升性能,pushdown各類子運算到Druid。最終的願景是爭取將所有的SQL操作統一到Presto上來。

InfoQ:如果一個系統每天需要處理PB級別的系統,再增加一個Druid這樣的存儲系統,是不是很大程度上增加了存儲空間的壓力?原系統和Druid,最好的融合方式是什麼樣的?

羅震霄:為了性能的提升,Druid需要自己的存儲。對Twitter而言,查詢速度,和系統的易用性,較之存儲空間,更為重要。

Druid需要做自己的存儲的原因是:

Druid一個重要的設計目標是實時查詢,也就是查詢延遲一定要在1秒以下。

現有硬件的基本性能決定,從內存中順序讀取4GB數據的延時在1秒左右,實際應用場景中,我們處理的數據遠遠大於4GB,所以,沒有索引,僅僅靠掃描文件,是不可能達到實時查詢要求的。

基於這些考慮,Druid設計並實現了自己的存儲格式,主要是列式存儲,並應用字典、RLE等方式進行優化。 Druid還設計了bitmap索引。在實際應用中,bitmap索引會以mmap方式放在內存中。絕大多數查詢可以通過bitmap索引直接找到結果,少數查詢會通過列式存儲進行有選擇性的文件查詢。

我們也在開發一些項目,盡量減少不必要的數據重複。比如Presto Druid Connector,通過Presto實時查詢Druid數據,這樣當用戶需要對Druid數據進行SQL分析時,用Presto就可以了,不必要拷貝數據。

InfoQ:Druid和Kylin這樣的開源軟件主要差別在哪裡?

羅震霄:對Kylin實在不太熟悉,不好妄加評論。

我們當時主要考慮的是Druid和Pinot,這兩個現在應用比較廣泛。相對而言,Druid更穩定一些,社區也更大一些。

InfoQ:目前還有哪些OLAP 平台可供選擇? Druid相對有何優勢?

羅震霄:現有的OLAP平台比較多,開源方面,有Hive、 Impala、Spark、Presto、Drill、Druid、Pinot等等。

Twitter現在的技術佈局:對實時計算,統一於Druid,對秒級到幾十分鐘級的數據分析,統一於Presto,對小時級別的ETL,統一於Spark。

Druid主要的優勢在性能,穩定性,擴展性,和易用性。能夠達到1秒以下的實時引擎,只有Druid和Pinot,如果考慮到擴展性和穩定性,Druid的優勢比較明顯。

InfoQ:在Twitter裡,您們定制了關於Druid的哪些開發功能? (與開源版本不同的功能)

羅震霄:主要是四個方面:

  • 對Thrift文件格式的支持,Twitter內部有大量的Thrift文件。
  • Presto Druid Connector,通過Presto對Druid數據進行SQL分析。
  • Multi-tenancy Druid,Druid支持不同的用戶類型,包括數據安全,隱私保護,和數據隔離。
  • Native Ingestion,擺脫對MapReduce的依賴,直接導入Parquet文件。

InfoQ:未來,Twitter還計劃對Druid開發或加強哪些功能?

羅震霄:主要有以下計劃:

  • Unified Indexing Service,為用戶提供方便的一鍵式導入。
  • Secure Druid,完整的Druid信息安全,包括LDAP Authentication and Authorization。
  • Pushdown for Presto Druid Connector,用Presto為Druid提供完整的SQL分析,並充分發揮Druid的性能優勢,包括Predicate Pushdown, Aggregation Pushdown,Limit Pushdown。

QCon北京2020的演講中,羅震霄老師將會分享Twitter 在ZB 級實時數據分析實踐中遇到的經驗和教訓。還有多位國內外一線互聯網企業的技術專家為大家分享新的實時計算和數據分析技術發展趨勢,大量真實生產實踐案例或許能給你帶來新的啟發,點擊了解詳情