Apache Kudu 加速對頻繁更新數據的分析

今天解讀的內容是來自 Hadoop Summit San 2016 關於 Apache Kudu 的一個介紹:Apache Kudu & Apache Spark SQL for Fast Analystics on Fast Data(視頻見文章末尾)。歡迎關注微信公眾號:大數據技術峰會解讀(bigdata_summit),獲取更多的內容和大數據技術峰會視頻。

Apache Kudu 加速對頻繁更新數據的分析_騰訊視頻 https://v.qq.com/x/page/h03728qz2xm.html

Kudu Overview

上圖是 Hadoop 生態體系中,存儲引擎和應用場景的對應關係。

橫軸代表數據查詢分析的頻度(Pace of Analysis),依次為:

  • 歸檔
  • 基於靜態數據的掃描/分析(一次寫入多次讀取)
  • 基於頻繁更新數據的快速分析
  • 實時訪問/更新(OLTP)

縱軸代表的是數據的更新頻度(Pace of Data),依次為

  • 只讀
  • 追加(Append-Only)
  • 頻繁更新
  • 實時更新

我們知道,HDFS 特別適合歸檔和基於靜態數據的掃描/分析的場景(一次寫入多次讀取),也就是上圖中左下角的黃色區域,而HBase擅長實時高並發的讀寫應用,也就是右上角的藍色區域。但是對於需要在頻繁更新的數據之上做快速分析,也就是上圖中間的虛線區域,Hadoop社區卻一直沒有比較好的存儲層產品來滿足。Kudu正是出於填補這個空白而誕生的。

視頻中提到,Kudu的設計借鑒了Parque和HBase一些理念 / 思想。

Kudu產品的幾個要點:

  • 數據模型和關係資料庫類似,為結構化的表;列的數量有限(和HBase/Cassandra相比較而言)
  • 內部數據組織方式為列式存儲
  • 很好的橫向擴展能力,目前測試的是275個節點(3PB),計劃支持到上千個節點(幾十PB)
  • 不錯的性能,集群能達到百萬級別的TPS,單節點吞吐為幾個GB/s
  • 本身不提供SQL介面,只支持類似NoSQL的介面,如 Insert(), Update(), Delete() and Scan() 等
  • 通過與 Spark 和 Impala 等(Drill,Hive的支持還在進行中)的集成,對外提供基於 SQL 的查詢分析服務

Kudu 和 Spark 集成後,能帶來的好處:

  • 帶來和 Parquet 相似的掃描性能,但卻不存在數據更新/插入的延遲,也就是說,對數據的實時更新/插入,對分析應用來說是即時可見的,無延遲。
  • Spark對數據的過濾條件(基於判定的過濾條件,即 predicate)可以下推到 Kudu 這一存儲層,能提高數據讀取/掃描的性能
  • 相對 Parque,基於主鍵索引的查詢,性能更高

Spark Datasource

這部分比較簡單,介紹Kudu與Spark集成的代碼片段。基本上就創建一個kuduDataFrame後,後續的操作就和普通的Spark DataFrame API沒什麼差別了

Quick Demo

Demo也比較簡單,有興趣大家可以自己看一下視頻(位置在視頻的 18分26秒),就是在 Spark Shell 中操作一個 kuduDataFrame

Use Cases

Kudu 最適合的場景包含這兩個特點:

  • 同時有順序和隨機讀寫的場景
  • 對數據更新的時效性要求比較高

這樣的場景有:

  • 和時間序列相關的數據分析:對市場/銷售數據的實時分析;反欺詐;網路監控等
  • 在線報表和數據倉庫應用:如ODS(Operational Data Store)

片中還介紹了小米使用Kudu的一個具體場景,需求是要收集手機App和後台服務發送的 RPC 跟蹤事件數據,然後構建一個服務監控和問題診斷的工具,要求:

  • 高寫入吞吐:每天大於200億條記錄
  • 為了能夠儘快定位和解決問題,要求系統能夠查詢最新的數據並能快速返回結果
  • 為了方便問題診斷,要求系統能夠查詢/搜索明細數據(而不只是統計信息)

在沒有使用kudu之前,方案的架構如下圖所示。

這是典型的Lambda架構(存在兩套相對獨立的數據流水線:批處理和流處理),一部分源系統數據是通過Scribe(日誌聚合系統)把數據寫到HDFS,另一部分源系統數據(實時性要求較高的?)是直接寫入HBase,然後:

  • 為了能支持互動式/實時的查詢,需要通過Hive/MR/Spark作業把這兩部分數據合併成 Parquet 格式存放在HDFS,通過 Impala 對外提供互動式查詢服務
  • 線下分析的就直接通過運行 Hive/MR/Spark 作業來完成

我們可以看到,這樣的數據線比較長,帶來兩個問題:

  • 其一是數據時效性較差(一個小時到一天);
  • 其二是需要多次數據轉換(如:HFile + seqfile ==> Parquet)

還有一個問題,存儲層中數據不是按照時間戳來排序,如果有部分數據沒有及時到達,那麼為了統計某一天的數據,可能就要讀取好幾天的數據才能得到。

使用了Kudu以後,方案的架構如下圖所示。

數據都存儲在Kudu中,分兩條線進入Kudu:

  • 對於需要做加工(ETL)的數據或來自壓力較大的系統的數據(產生的數據較多,源系統無法長時間緩存)可以先進入Kafka緩存,然後通過Storm做實時的ETL後進入Kudu,這種情況的延時在 0~10秒的區間
  • 反之,源系統的數據可以直接寫入 Kudu,這種情況數據沒有任何延遲

然後,一方面可以通過 Impala 對外提供互動式查詢服務(基於SQL),另一方面也可以直接通過 Kudu API 直接訪問數據

這樣的架構帶來的好處比較明顯,一方面是大大提高數據的時效性,另一方面大大簡化系統架構

PPT中還有一張 Kudu + Impala 的方案與 MPP 資料庫產品(如 Greenplum,Vertica 和 Teradata)進行對比,但是由於時間關係視頻中沒有講,這裡簡單提一下:

他們有存在相似之處:

  • 提供基於SQL的互動式快速查詢/分析
  • 能夠提供插入、更新和刪除操作

相對於 MPP 資料庫,Kudu + Impala 方案的優勢:

  • 更快的流式數據插入(streaming insert)
  • 和 Hadoop 生態體系有較好的集成:
    • 把 Kudu 和 HDFS 部署在同一個集群,可以關聯分別存儲在 Kudu 和 HDFS 上的表
    • 和 Spark,Flume等的集成度較好

相對於 MPP 資料庫,Kudu + Impala 方案的劣勢:

  • 批量插入的性能相對較慢
  • 不支持數據裝載的原子操作,不支持跨行的原子操作,不支持二級索引

Kudu Roadmap

相對 HDFS 和 HBase,Kudu還是一個比較新的項目,視頻介紹了產品路線圖的一些想法:

安全方面:

  • 和 Kerberos 的集成
  • 力度更細的許可權控制
  • 基於組和角色的許可權管理
  • ...

運維方面:

  • 穩定性的增強
  • 一些恢復工具
  • 故障診斷輔助工具

性能和擴展性:

  • 具體一些讀寫性能提升的想法
  • 擴展性的提升(短期到400節點,長期上千節點)

客戶端方面:

  • 目前支持Java、C++ 和 python,Python目前還是短板,有些功能還沒支持
  • 文檔、教程和日誌等方面

推薦閱讀:

九章雲極方磊:大數據時代,數據科學家也需要協作平台 | 愛分析訪談
大數據是回事么?(2016年最新大數據公司全局圖)
互聯網廣告公司受資本市場歡迎么?
大數據「佔領」餐飲業,哪一種店鋪能發家致富?
周杰倫歌曲可視化分析

TAG:Kudu | Hadoop | 大数据 |