Apache Arrow 內存數據

1.概述

  Apache Arrow 是 Apache 基金會全新孵化的一個頂級項目。它設計的目的在於做爲一個跨平臺的數據層,來加快大數據分析項目的運行速度。apache

2.內容

  如今大數據處理模型不少,用戶在應用大數據分析時,除了將 Hadoop 等大數據平臺做爲一個存儲和批處理平臺以外,一樣也得關注系統的擴展性和性能。過去開源社區已經發布了不少工具來完善大數據分析的生態系統,這些工具包含了數據分析的各個層面,例如列式存儲格式(Parquet,ORC),內存計算模型(Drill,Spark,Impala 和 Storm)以及其強大的 API 接口。而 Arrow 則是最新加入的一員,它提供了一種跨平臺應用的內存數據交換格式。編程

  在數據快速增加和複雜化的狀況下,提升大數據分析性能一個重要的途徑是對列式數據的設計和處理。列式數據處理藉助了向量計算和 SIMD 使咱們能夠充分挖掘硬件的潛力。而 Apache Drill 其大數據查詢引擎不管是在硬盤仍是內存中數據都是以列的方式存在的,而 Arrow 就是由 Drill 中的 Value Vector 這一數據格式發展而來。此外,Arrow 也支持關係型和動態數據集。緩存

  Arrow 的誕生爲大數據生態帶來了不少可能性,有了 Arrow 做爲從此標準數據交換格式,各個數據分析的系統和應用之間的交互性能夠說是揭開了新的篇章。過去大部分的 CPU 週期都花在了數據的序列化與反序列化上,如今咱們則可以實現不一樣系統之間數據的無縫連接。這意味着使用者在不一樣系統結合時,不用在數據格式上話費過多的時間。數據結構

3.Arrow Group

  Arrow 的內存數據結構以下所示:編程語言

  從上圖中,咱們能夠很清晰的看出,傳統的內存數據格式,各個字段的分佈是以沒一行呈現,相同字段並未集中排列在一塊兒。而經過 Arrow 格式化後的內存數據,能夠將相同字段集中排列在一塊兒。咱們能夠很方便的使用 SQL 來操做數據。工具

  傳統的訪問各個數據模型中的數據以及使用 Arrow 後的圖,以下所示:oop

  經過上圖能夠總結出如下觀點:佈局

  • 每一個系統都有屬於本身的內存格式。
  • 70~80% 的 CPU 浪費在序列化和反序列化上。
  • 在多個項目都實現的相似的功能(Copy & Convert)。

  而在看上述使用 Arrow 後,得出如下結論:性能

  • 全部的系統都使用相同的內存格式。
  • 沒有跨系統通訊開銷。
  • 項目能夠貢獻功能(好比,Parquet 到 Arrow 的讀取)。

4.Arrow 數據格式

  Arrow 列式數據格式以下所示:學習

persons = [{
    name: 'wes',
    iq: 180,
    addresses: [
    {number: 2, street 'a'},
    {number: 3, street 'bb'}
    ]
}, {
    name: 'joe',
iq: 100,
addresses: [
{number: 4, street 'ccc'}, {number: 5, street 'dddd'}, {number: 2, street 'f'}
]
}]

  從上述 JSON 數據格式來看,person.iq 分別是 180 和 100,以以下方式排列:

  而 persons.addresses.number 的排列格式以下所示:

5.特性

5.1 Fast

  Apache Arrow 執行引擎,利用最新的SIMD(單輸入多個數據)操做包括在模型處理器,用於分析數據處理本地向量優化。數據的列式佈局也容許更好地利用 CPU 緩存,將全部與列操做相關的數據以儘量緊湊的格式放置。

5.2 Flexible

  Arrow 扮演着高性能的接口在各個複雜的系統中,它也支持工業化的編程語言。Java,C,C++,Python 以及從此更多的語言。

5.3 Standard

  Apache Arrow 由 13 個開源項目開發者支持,包含 Calcite, Cassandra, Drill, Hadoop, HBase, Ibis, Impala, Kudu, Pandas, Parquet, Phoenix, Spark, 和 Storm。

6.Example

  使用 Python 來處理 Spark 或是 Drill 中的數據,以下圖所示:

  • 快速的、語言無關的二進制數據幀格式的文件。
  • 使用 Python 去寫。
  • 讀取速度接近磁盤 IO 性能。

  部分實現示例代碼,以下所示:

import feather
path = 'my_data.feather'
feather.write_dataframe(df, path)
df = feather.read_dataframe(path)

7.總結

  Apache Arrow 當前發佈了 0.1.0 第一個版本,官方目前獲取的資料的信息較少,你們能夠到官方的 JIRA 上獲取更多諮詢信息,以及 Arrow 提供的開發者聊天室去獲取更多的幫助。

8.結束語

  這篇博客就和你們分享到這裏,若是你們在研究學習的過程中有什麼問題,能夠加羣進行討論或發送郵件給我,我會盡我所能爲您解答,與君共勉!

相關文章
相關標籤/搜索