天天看點

大資料的近實時分析系統架構

近實時分析的場景

近實時分析 – 對變化中的資料?供快速分析能力

  • 分析現實世界中正在發生的事件的能力,結合曆史資料和實時流資料進行彙總分析、預測和明細查詢
  • 絕對實時和批量不可調和,"近實時" 的意思是這是人機互動中能感受的尺度(秒級),而不是機器自動處理的實時性量級(ns / us級)
  • 資料價值從非結構化到結構化,分析從非範式到範式。SQL是結構化分析的最終手段,但是:
    • 彙總分析(順序掃?)與明細查詢(随機掃描)
    • 小資料量下都不是問題;但是放在海量資料下看,兩種負載難以調和
    • 海量資料和實時流視窗上的SQL引擎實作也完全不同
  • 更接近實時Hadoop上是完全可行的,但是實時性要求會帶來架構上的巨大變化

典型場景

需要同時支援順序和随機讀/寫的應用場景

●線上互動式BI分析/決策輔助

○ 場景舉例: 貸後風險實時監測,實時資産偏好視圖,曆史風險偏好趨勢,市場監測

○ 應用類型: 需要準實時的同步插入/修改,同時彙總分析和單條查詢

● 時間序列資料

○ 場景舉例: 股市行情資料; 欺詐檢測和預防; 風險監控;線上實時反欺詐

○ 應用類型:需要實時捕獲流資料,同時結合已有的T+1資料進行彙總、分析和計算

● 機器日志資料分析

○ 場景舉例: 台機監控、故障預警

○ 應用類型:需要過濾大量流資料,同時結合已有的T+1資料進行彙總、分析和計算

更實時的、互動式BI

傳統數倉中增加實時彙總分析能力

物聯網(IoT)産生的實時分析和預測

車聯網

  • 曆史分析
    • 開發人員希望知道如何優化充電性能
    • 新版本軟體更新後随着時間推移是如何影響汽車性能的?
  • 實時洞察
    • 客戶希望知道是否是未成年人在駕駛。他們加速多快?

      時速多少?他們在哪裡?

    • 汽車裝置——比如在服務前或服務中拿到最新的診斷資料包

源于網際網路的Lambda 架構

Lambda 架構

企業應用中Lambda的典型實作方式

車聯網的實時資料處理

Hbase Provides:

• Fast, Random Read & Write Access

• "Mini-scans"

• Scale-out architecture capable of serving Big Data to many users

車輛網曆史資料分析方案

建構在混合架構上的分析管道

但是,HBase+HDFS混合架構的複雜性無處不在

同時供高性能的順序掃?和随機查詢,避免使用HBase+HDFS混合架構的複雜性:

• 開發:必須編寫複雜的代碼來管理兩個系統之間的資料傳輸及同步

• 運維:必須管理跨多個不同系統的一緻性備份、安全政策以及監控

• 業務:新資料從達到HBase到HDFS中有時延,不能馬上供分析

在實際運作中,系統通常會遇到資料延時達到,是以需要對過去的資料進行修正等。如果使用不可更改的存儲(如HDFS檔案),将會非常不便。

Lambda 複雜性一:同步

Lambda 複雜性二:錯誤難以診斷

Lambda Pros & Cons

  • Pros

    • 成功将不同領域的開源架構嫁接到一個統

    一架構内,應對不同類型的混合負載

    • Batch Layer可應對資料的無限擴充

    • Speed Layer可?供準實時的響應性能

  •  Cons - Complexity

    • 需要大量的資料在不同存儲和格式中遷移,造成維護困難

    • 資料結構重新聲明或者資料修改都很困難

    • Batch Layer和Speed Layer需要維護兩套代碼,但其實作邏輯需要一緻

    • 意外錯誤的捕獲、處理和沖正非常複雜

    • 前端查詢的複雜度非常大,需要合并資料集

基于Kudu實作簡單的近實時分析

目前的欺詐檢測架構:存儲架構太複雜

 但是怎 樣處理下面的問題 ?

● 怎麼有效處理轉換過程中的錯誤?

● 如何定義将HBase資料轉換成Parquet格式作業的周期?

● 從資料進入到報表中能展現之間的時延如何量化?

● 作業流程怎麼保障不被其他操作打斷?

使用Kudu的Hadoop實時資料分析

改進點 :

● 隻要一套系 統

●不需要背景定 時的批處理任務

● 輕松應對資料遲到和資料修正

●新資料立即用于在分析和 業務營運

Kudu: 在快速變化的資料上進行快速分析

Kudu的設計目标

 • 掃描大資料量時吞吐率 高(列式存儲和多副本機制)

目标 : 相對Parquet的掃?性能差距在2x之内

• 通路少量資料時延時低(主鍵索引和多數占優複制機制)

目标 : SSD上讀寫延時不超過1毫秒

• 類似的資料庫語義(初期支援單行記錄的ACID)

• 關系資料模型

  • SQL查詢
  • "NoSQL"風格的掃?/插入/更新(Java用戶端)

Kudu的使用

類似SQL 模式的表

• 有限的列數 (不同于HBase/Cassandra)

• 資料類型: BOOL, INT8, INT16, INT32, INT64, FLOAT, DOUBLE, STRING, BINARY,TIMESTAMP

• 一部分列構成聯合主鍵

• ALTER TABLE快速傳回

"NoSQL" 風格的 Java和C++ APIs

• Insert(), Update(), Delete(), Upsert(), Scan()

與MapReduce, Spark 和Impala 的無縫對接

• 将對接更多處理引擎!

車輛網:一緻的架構處理異構的資料分析管道

在CDH技術堆棧上的準實時分析技術

基于OGG 的資料庫日志解析和Apache Kudu 的實時分析

•Kudu Adapter (Handler)幫助保持DB和Kudu之間基于日志解析的資料同步。

•使用OGG Java API将DB事務解碼為kudu特定的事務。

•使用KUDU API在Kudu結束執行事務操作。

•Kudu Adapter (Handler) 支援資料的Inserts, Updates, Upsert 及Deletes 事務操作.

更通用的實時資料處理內建/分析架構

• 與Apache Spark Streaming 內建進行real-time 的資料分析

• 處理完的資料再接入Kafka進行進一步的處理和供下遊系統進一步分析

使用案例分享

小米(MI) 簡介

使用案例1

移動服務監聽及跟蹤工具

目标:

收集從移動App及背景服務發起的RPC程式調用重要的跟蹤事件

服務監聽及錯誤處理工具

需求:

  • 高寫吞吐

    >50億條/天的寫能力,且持續增長

  • 快速查詢最新記錄并做響應

    快速定位錯誤并作出響應

  • 能夠確定單條記錄快速查詢

    更容易進行差錯

沒有Kudu 之前大 資料分析處理

在kudu之前,我們的大資料分析pipeline大概是有這幾種:

1. 資料源-> scribe打日志到HDFS -> MR/Hive/Spark -> HDFS

Parquet -> Impala -> 結果service這個資料流一般用來分析各種日志。

2. 資料源 -> 實時更新HBase/Mysql -> 每天批量導出Parquet->

Impala -> 結果serve這個資料流一般用來分析狀态資料,也就是一般需要随機更新的資料,比如使用者profile之類。

 這兩條資料流主要有幾個問題:

  1. 資料從生成到能夠被高效查詢的列存儲,整個資料流延遲比較大,一般是小時級别到一天;
  2. 很多資料的日志到達時間和邏輯時間是不一緻的,一般存在一些随機延遲。
  3. 比如很多mobile app統計應用,這些tracing event發生後,很可能過一段時間才被後端tracing server收集到。我們經常看到一些hive查詢,分 析一天或者一小時的資料,但是要讀2-3天或者多個小時的日志,然後過濾出實際想要的記錄。
  4. 對于一些實時分析需求,有一些可以通過流處理來解決,不過他肯定沒用SQL友善,另外流式處理隻能做固定的資料分析,對ad-hoc查詢無能為力kudu的特點正好可以來配合impala搭建實時ad-hoc分析應用。

大資料分析管道- 因為Kudu

改進後的資料流大概是這個樣子:

1. 資料源 -> kafka -> ETL(Storm) -> kudu -> Impala

2. 資料源 -> kudu -> Impala

3. 資料流1 主要是為需要進一步做ETL的應用使用的,另外kafka可以當做一個buffer,當寫吞吐有毛刺時,kafka可以做一個緩沖。如果應用嚴格的實時需求,就是隻要資料源寫入就必須能夠查到,就需要使用資料流2。

案例1: Benchmark

環境:

  • 71 節點叢集
  • 硬體

    CPU: E5-2620 2.1GHz * 24 core Memory: 64GB

    Network: 1Gb Disk: 12 HDD

  • 軟體

    Hadoop2.6/Impala 2.1/Kudu

資料:

1 天的伺服器端跟蹤資料

~26億行記錄

~270 bytes/行

每條記錄17 字段, 5 關鍵字段

案例 1: Benchmark 結果

使用 impala 進行批加載 (INSERT INTO):

查詢延時:

* HDFS parquet 檔案複制因子= 3 , kudu 表複制因子= 3

*結果為每條查詢執行5次并取平均值 

案例2: 京東案例

Jd.com 中國第二大線上電商

  1. 使用Kafka實時收集資料

    • 點選流日志

    • 應用/浏覽器Trace日志

    • 每條記錄約70字段

  2. 6/18 sale day

    • 150億筆交易

    • 高峰期每秒一千萬條資料插入

    • 叢集200台伺服器

  3. 查詢使用JDBC -> Impala -> Kudu

案例3 某網際網路金融 使用 Kafka 、Spark 、Kudu 和Impala 建構

 業務需求:

  • 根據目前客戶的操作行為進行風險等級實時分析,防範金融風險

架構說明:

  • 資料源Stream API的資料由Kafka接入
  • Spark Streaming消費Kafka資料,并注入到Kudu中
  • 流資料接入Spark Streaming作業進行實時處理,并使用Mlib進行預測
  • 預測的結果儲存到Kudu
  • 客戶使用Impala或Spark SQL進行互動式結果查詢
  • 分析工具使用JDBC接口通路資料進行分析

案例4 某銀行使用 Kafka 、Kudu 和Impala 實作準實時資料倉庫應用

 業務需求:

  • 數倉應用建立在多元分析模型上,次元表需要根據需要保留曆史記錄

架構說明:

  • 資料源Stream API的資料由Kafka接入到Spark Streaming或Flume,并儲存到Kudu
  • 通過Impala對次元資料進行SCD操作:
    • SCD I: 存在即update
    • SCD II: 存在則先insert一條新記錄,并更新曆史記錄,如End Time 或 Flag
  • 客戶使用Impala進行互動式結果查詢
  • 分析工具使用JDBC接口通路資料進行分析

案例5 使用 Kafka、Kudu 和Impala實作準實時資料倉庫分析應用

業務要求:

客戶流式計算測試要求實作Hadoop産品從KAFKA快速加載資料,主要有2個應用場景:

• Append模式即簡單将記錄添加到資料表中,類似MySQL的insert into,并需要保證資料不重複。

• Insert_update模式即對于有主鍵的資料表,如果新的記錄的主鍵在資料表中已存在,則用新的記錄update舊的記錄,如果新的記錄的主鍵 在資料表中不存在,則将新的記錄insert導資料表中。

設計實作思路:

1. 基于本次流式計算的測試要求,無論是Append還是Insert_update本來都可以通過使用HBase來實作,因為HBase的Rowkey可以保證資料的唯一性限制,達到Append去重的目的,而HBase的API也支援通過Rowkey去更新已經存在的資料。

2. 但是在本次流計算測試的性能場景要求中,還需要測試混合負載,需要進行資料集的統計查詢,即在入庫的同時需要進行大量的SQL統計分析查詢,還包括join操作。這樣HBase肯定無法滿足,因為HBase隻适合于随機插入以及簡單的Rowkey條件查詢。

是以我們最終選擇了Kudu來完成,既可以滿足快速的随機插入,包括去重和更新操作,同時支援并發的SQL查詢的混合負載要求。

總體架構設計

• Append:Kudu是用于存儲結構化的表。表有預定義的帶類型的列(Columns),每張表有一個主鍵(primary key)。主鍵帶有唯一性(uniqueness)限制,可作為索引用來支援快速的随機查詢。如果我們使用insert()方法,通過Kudu主鍵的唯一性,我們可以達到去重的目的,當有重複資料導入的時候,Kudu自身會通過主鍵判斷,如果存在,則直接丢棄。

• Insert_update:Kudu源生提供了Upsert()方法,直接可以達到本次測試insert_update的目的,即根據主鍵判斷,如果存在則更新該資料,否則則作為新的資料插入到Kudu

測試資料集及測試結果

本次測試主要用到了五個表:

HDFS中的表主要用來SQL混合負載的join表,并驗證Impala跨存儲執行性能。

 Append,無重複

Upsert,去重

Upsert,去重時有SQL查詢的混合負載

穩定的入庫速度

0min-6min,

指數行情:63萬條/秒,

現貨行情:18萬條/秒,

委托:40萬條/秒,

成交:35萬條/秒,

總的吞吐在:160萬條/秒

案例6: 某車企的實時車輛網分析平台

應用場景4:企業大資料中心 技術架構
規劃中的技術架構

性能基準測試

TPC-H (Analytics benchmark)

  • 叢集由75個TS 和一個master構成

    • 每個節點12 塊硬碟, 128GRAM

    • Kudu 0.5.0+Impala 2.2+CDH 5.4

    • TPC-H Scale Factor 100 (100GB)

  • 分析語句舉例(6表關聯統計分析):

SELECT n_name, sum(l_extendedprice * (1 - l_discount)) as revenue FROM customer,

orders, lineitem, supplier, nation, region WHERE c_custkey = o_custkey AND

l_orderkey = o_orderkey AND l_suppkey = s_suppkey AND c_nationkey = s_nationkey

AND s_nationkey = n_nationkey AND n_regionkey = r_regionkey AND r_name = 'ASIA'

AND o_orderdate >= date

'1994-01-01'

AND o_orderdate < '1995-01-01' GROUP BY

n_name ORDER BY revenue desc;

- 對記憶體資料,Kudu性能比Parquet高31% (幾何平均)

- 對硬碟資料,Parquet性能應該比Kudu更好(larger IO requests)

Kudu vs Phoenix

• 10 節點叢集 (9 worker, 1 master)

• HBase 1.0, Phoenix 4.3

• TPC-H LINEITEM 表(60億行記錄)

與NoSQL資料庫PK随機查詢性能 (YCSB)

• YCSB 0.5.0-snapshot

• 10 節點叢集

(9 worker, 1 master)

• HBase 1.0

• 1億條記錄, 1千萬 ops

多使用者并發查詢下性能最好