1. 程式人生 > >Apache CarbonData :一種為更加快速資料分析而生的新Hadoop檔案版式

Apache CarbonData :一種為更加快速資料分析而生的新Hadoop檔案版式

用例和動機:為什麼介紹一種新的檔案格式?

用例: 順序掃描

這裡寫圖片描述

  • 全表掃描
    • 大掃描(全行, 沒過濾)
    • 只獲取表的幾列作為查詢結果
  • 通常的使用場景:
    • ETL工作
    • 日誌分析

用例:隨機訪問

這裡寫圖片描述

  • 在很多列進行過濾(點查詢)
    • 行鍵值查詢 (比如HBase)
    • 窄掃描但可能要獲取所以列
    • 要求秒/亞秒級別的低延遲
  • 通常的使用場景:
    • 操作查詢
    • 使用者分析

用例:OLAP類查詢

這裡寫圖片描述
- 任意範圍的互動資料分析
- 包括聚合/join
- Roll-up, Drill-down, Slicing and Dicing
- 低延遲的點對點查詢
- 通常的使用場景:
- 儀器報表
- 詐騙&點對點分析

動機

這裡寫圖片描述

為什麼需要CarbonData

基於以下需求,我們研究Hadoop生態系統中現有的檔案格式,但是我們不能找到一個同時滿足所有需求的合適的方法,所以我們開始設計CarbonData。

  • 支援廣掃描& 少列結果
  • 支援在亞秒級響應主鍵查詢
  • 支援大資料上涉及一個查詢中有許多過濾的互動OLAP類查詢, 並能以秒級響應
  • 支援包含全列的單條記錄的快速抽取
  • 支援HDFS以便使用者可以管理正存在的Hadoop叢集

當我們研究Parquet/ORC,它們似乎在R1和R5上表現很好,但是對於R2,R3,R4則不然。所以我們設計CarbonData主要增加以下不同的特性:

  • 帶索引的資料儲存:它可以顯著的提高查詢效能,並且當查詢中有過濾條件,可以減少I/O掃描與CPU資源開銷。CarbonData索引包括多個級別,處理框架可以通過這個索引來減少它需要排程和處理的任務。它也可以在一個更加高效的單元(叫做blocklet)裡面跳躍掃描,而不用掃描整個檔案。
  • 可操作的編碼過的資料:通過支援高效的壓縮和全域性編碼設計,使得可以在已經壓縮/編碼過的資料上進行查詢。資料可以僅當返回結果給使用者的時候才修改,即“惰性實現”。
  • 列組:允許多列組成一個列組,並以行格式進行儲存。這減少了查詢時的行重建的開銷。
  • 用一種資料格式支援多種用例:如互動OLAP類查詢,順序查詢(廣掃描),隨機訪問(窄掃描)。

設計目標

  • 多種資料訪問型別的低延遲
  • 允許壓縮編碼過資料上的快速查詢
  • 確保空間高效性
  • Hadoop生態系統上可行的通用格式
  • 讀最優化的列式儲存
  • 利用多級索引實現低延遲
  • 支援利用列組來獲得基於行的有點
  • 能夠對聚合的延遲解碼進行字典編碼
  • 貫穿整個廣泛的Hadoop生態體系

深入CarbonData檔案格式

CarbonData檔案結構

這裡寫圖片描述

  • Blocklet:一個包含列式儲存中的多行的集合
  • Column chunk:在一個Blocklet中一列/列組的資料
    • 允許多列組成一個列組&以行格式進行儲存
    • 列資料以有序索引儲存
  • Footer:元資料資訊
    • 檔案級別的元資料&統計資訊
    • 表資訊
    • Blocklet索引&Blocklet級別元資料
      一個CarbonData檔案是一個HDFS塊。

版式

![這裡寫圖片描述](https://img-blog.csdn.net/20160726142453559)

Blocklet

  • 資料根據多維鍵值(MDK)排序
    • 在列存中資料以索引儲存

例子:

  • 原始表
    這裡寫圖片描述

  • 編碼

    對每列的取值進行Hash,如(QTR1->1),(QTR2->2),……

    這裡寫圖片描述

  • MDK排序
    這裡寫圖片描述

  • Blocklet邏輯結構圖
    這裡寫圖片描述

檔案級別Blocklet索引

  • 建立用於過濾的記憶體中的檔案級別MDK索引
  • 為高效掃描做的主要優化
    這裡寫圖片描述

    這裡寫圖片描述

倒排索引

  • 在column chunk選擇性的將列資料儲存為倒排索引
    • 取值種類少的列壓縮效果更加好
    • 利於快速判斷過濾

例子:

  • Blocklet

    我們需要對每個維度按照鍵值進行排序,但是還要知道每個值原來的行號。所以我們把每個鍵值map成[值,行號],然後對每個維度按照鍵值進行排序。

    這裡寫圖片描述

  • 倒排索引
    這裡寫圖片描述

  • Blocklet物理結構圖
    這裡寫圖片描述

    • d列儲存內容:值,該行開始往後,有幾行都是存這個值
    • r列儲存內容:值,該行開始往後,有幾行都是順序增1的

這裡寫圖片描述