Index R 時序數倉技術架構(待補充)

凱新雲技術社群發表於2019-03-03

1 Index R 的前世今生

  • IndexR是由舜飛科技研發的實時OLAP系統。於 2017 年 1 月初正式開源,目前已經更新至 0.6.1 版本,其作者認為IndexR具有以下特點:

  • 超大資料集,低查詢延時(超大資料集由HDFS保證,查詢低延遲由MPP架構的Drill和IndexR專門設計的儲存格式保證)

  • 準實時 (和Druid實時攝入的思路類似,從Kafka實時攝入資料)

  • 高可用,易擴充套件(架構設計簡單,只有一種節點,可以輕易橫向擴充套件)

  • 易維護(支援Schema線上更新)

  • SQL支援 (由Drill支援,實際上Drill也是利用Calcite實現的)
    與Hadoop生態整合(Hive,Kafka,Spark, Zookeeper, HDFS)

2 IndexR技術架構

  • IndexR作為Drill外掛嵌入了Drillbit程式,下圖是IndexR的服務部署圖,可以看到IndexR只是做了優化資料索引的操作。
  • Drill是一個類似Presto的MPP資料庫,Drillbit是一個類似Presto Work節點的常駐程式,和Hadoop的DN程式混部,可以利用HDFS的短路讀的特性。Zookeeper主要用來儲存表和segment的一些元資訊。IndexR的架構圖如下:
Index R 時序數倉技術架構(待補充)
  • IndexR支援從Kafka實時讀取資料。IndexR支援通過Drill,Hive,Spark查詢資料,不過Hive,Spark只能查詢歷史資料,Drill可以同時查詢實時資料和歷史資料。

  • IndexR儲存體系

      Table:表是對使用者可見的概念,使用者的查詢需要指定Table。
      Segment:1個Table由多個Segment組成,Segment自解釋,自帶索引,是實時資料和離線資料轉換的紐帶,實時的segment和離線的segment具體結構稍有不同。
      Column: IndexR是列式儲存的,即某一列的資料會集中存放在一起。某一列的索引和資料是存放在一起的。
      Pack: 列資料在內部會進一步細分為Pack,每個Pack有65536行記錄,Pack是基本的IO和索引單位。
      Row: 表示一行資料。實時資料攝入和離線匯入的時候資料都是以行為單位加入一個segment的。
    複製程式碼
  • Segment的後設資料包括:行數,列數,每列的MAX和MIN值,每列的name, type,每列的各種索引的偏移量等。

  • Segment 檔案由4部分組成:版本號,Segment的後設資料,所有Column 和 Pack的倒排索引。

  • 一個Column包含多個Pack,每個Pack由DataPackNode,PackRSIndex,PackExtIndex,DataPack4部分組成,但是儲存的時候是先儲存所有Pack的索引資料,再儲存所有Pack的實際資料,這樣的好處是可以通過只讀取索引檔案來快讀過濾掉不必要的Pack,來減少隨機IO。

3 IndexR適合的經典場景

  • 需要在海量資料之上做快速的統計分析查詢。
  • 要求入庫速度非常快,並且需要實時分析。
  • 存放超大量歷史明細資料庫。比如網站瀏覽資訊,交易資訊,安保資料,電力行業資料,物聯網裝置採集資料等。這類資料通常量非常大,資料內容複雜,存放時間比較久,且希望在需要時可以比較快速的根據各種條件做明細查詢,或者在一定範圍內做複雜的分析。這種情況下可以充分發揮IndexR的低成本,可擴充套件,適合超大資料集的優勢。
  • IndexR在開源之後,我們已經看到有不少使用案例,包括國內外的不同團隊。有意思的是,有些團隊的使用方式比較特別,比如用於存放超大量(單表千億級別)的複雜明細資料,做歷史資料的明細查詢。IndexR不僅可以用於多維分析,商業智慧等OLAP經典領域,還可以用於物聯網,輿情監控,人群行為分析等新興方向。

相關文章