聊聊Apache Arrow">聊聊Apache Arrow

分類:IT技術 時間:2017-10-02

基本介紹

Apache Arrow是一種基於內存的列式數據結構,正像上面這張圖的箭頭,它的出現就是為了解決系統到系統之間的數據傳輸問題,2016年2月Arrow被提升為Apache的頂級項目。

在分布式系統內部,每個系統都有自己的內存格式,大量的CPU資源被消耗在序列化和反序列化過程中,並且由於每個項目都有自己的實現,沒有一個明確的標準,造成各個系統都在重復著復制、轉換工作,這種問題在微服務系統架構出現之後更加明顯,Arrow的出現就是為了解決這一問題。作為一個跨平臺的數據層,我們可以使用Arrow加快大數據分析項目的運行速度。下面這張圖概括了Hadoop生態系統,本身就分為4層,每層又有若幹組件,而且還在不斷擴大系統範圍,如果各個系統之間都需要進行序列化和反序列化,消耗巨大。

相關技術

  • 適配器模式

適配器模式是經典的23種設計模式之一,它的主要作用是在新接口和老接口之間進行適配,可以讓客戶方便使用,不需要改造自身的產品,如下圖所示。

雖然Apache Arrow的實現細節遠不止適配器模式,但是它從功能設計思路來看,還是有點像的,有了Arrow之後,它的一部分功能就相當於所有系統的適配器了。

  • 列式存儲

我們假設數據表有session_id、timestamp、source_ip等三個字段,在行式存儲的時候,按照每一行形式包含3個字段,而多行之間是互相分開的,沒有關聯,而到了列式存儲概念,我們按照每一列對數據進行聚集,例如session_id包含了“1331246660”等4個值。

從上面這張摘錄自Arrow官網的圖可以看出,傳統的內存數據格式以每一行作為各個字段的分布,相同字段沒有被集中在一起,造成了計算時的不必要浪費。通過列式存儲格式約束,可以將相同字段集中排列在一起。而官網也給出了一條SQL語句,代表使用SQL語句很容易查詢得到數據。

  • SIMD指令

即單指令流多數據流(SingleInstruction Multiple Data),是一種采用一個控制器來控制多個處理器,同時對一組數據(又稱“數據向量”)中的每一個分別執行相同的操作從而實現空間上的並行性的技術。在微處理器中,單指令流多數據流技術則是一個控制器控制多個平行的處理微元。

技術深入

需要明確的是,Apache Arrow不是一個引擎,也不是一個存儲系統,它是用來處理分層的列式內存數據的一系列格式和算法。它不是一個獨立的軟件,而是系統中用來加速數據分析的一個組件。很多開源項目都已經支持了Arrow,而且其他商業化的項目也有這個趨勢。對於已經支持Arrow的項目來說,這些項目不再需要序列化和反序列化各種數據,從而以極小的成本來共享數據資源,對於同一集群下的系統則完全不需要進行任何的數據格式轉換。

對於Apache Arrow的期望:

  • 列式存儲:大數據系統幾乎都是列式存儲的,類似於Apache Parquet這樣的列式數據存儲技術自從誕生起就是大家的期望。
  • 內存式:SAP HANA是第一個利用內存加速分析流程的組件,隨著Apache Spark的出現,進一步提升了利用內存加速流程的技術可能性落地。
  • 復雜數據和動態模式:當我們通過繼承和內部數據結構呈現數據的時候,一開始有點麻煩,後來就有了JSON和基於文檔的數據庫。

Arrow的列式存儲有著O(1)的隨機訪問速度,並且可以進行高效的Cache,同時還允許SIMD指令的優化。由於很多大數據系統都是在JVM上運行的,Arrow對於python和R的社區來說顯得格外重要。

Apache Arrow是基於Apache Drill中的Value Vector來實現的,而使用Value Vector可以減少運算時重復訪問數據帶來的成本。

舉個例子,有一個people數組:

people=[
{
  name:’mary’,age:30,
  placed_lived:[
     {city:’Akron’,state:’OH’},
     {city:’Bath’,state:’OH’}
  ]
},
{
  name:’mary’,age:31,
  placed_lived:[
     {city:’Lodi’,state:’OH’},
     {city:’Ada’,state:’OH’}
{city:’Akron’,state:’OH’}
  ]
}
]

其中,對於people.places_lived.city,在Arrow中是這樣存儲的:

這種存儲方式有O(1)的訪問速度,可以有效地緩存,而且,在Value Vector中的信息可以直接在不同的項目之間傳遞,不依賴於所使用的編程語言。

而從代碼層面分析,Apache Arrow類的設計采用了設計模式裏的建造者模式,封裝了基礎類Array、Buffer以及ArrayBuilder,具體類圖如下圖所示:

從GC的角度來看,Arrow基於一種有規劃的內存使用理念。傳統的GC面對的程序數據是很多細粒度的、頻繁誕生與消亡的對象。而Arrow的內存使用體現了基於較粗粒度的按需分配,有良好的線性關系,要處理的數據都是大塊的,本身不具高頻新生與刪除的數據。(而這種數據特性剛好很切合我們的內存表所要處理的數據。)由於數據本身塊頭大,變化頻率低,為進一步規劃更穩健和高效的內存分配策略提供了可能。系統啟動時需要預鎖定一片區域;當刪除數據時,瞬時歸還系統,但會留存一塊;幾乎沒有內存碎片。

總結

Apache Arrow之所以會流行,是因為它不針對特定產品,而是可以為大數據整個生態系統帶來便利。有了Arrow作為標準數據交換格式,各個數據分析系統和應用之間的交互性有了全新的方式,我們不再需要把CPU資源花費在數據的序列化和反序列化上了,實現了不同系統之間數據的無縫連接,官網發表的文章顯示,它的目標是提升數據之間的100倍交換速度,這樣才能真正對數據分析流程進行加速。

作者介紹:周明耀,2004年畢業於浙江大學,工學碩士。13年軟件研發經驗,近10年技術團隊管理經驗,4年分布式計算、大數據技術經驗。著有《大話Java性能優化》、《深入理解JVM&G1 GC》、《技術領導力-碼農如何才能帶團隊》。個人微信號michael_tec,個人公眾號“麥克叔叔每晚10點說”。

感謝蔡芳芳對本文的審校。


Tags: 系統 序列化 Arrow 適配器 Apache 之間

文章來源:


ads
ads

相關文章
ads

相關文章

ad