天天看點

雲原生大資料架構中實時計算維表和結果表的選型實踐

雲原生大資料架構中實時計算維表和結果表的選型實踐

作者 | 志羽

來源 | 阿裡技術公衆号

一 前言

傳統的大資料技術起源于 Google 三架馬車 GFS、MapReduce、Bigtable,以及其衍生的開源分布式檔案系統 HDFS,分布式計算引擎 MapReduce,以及分布式資料庫 HBase。最初的大資料技術與需求往往集中在超大規模資料存儲、資料處理、線上查詢等。在這個階段,很多公司會選擇自建機房部署 Hadoop 的方式,大資料技術與需求集中在離線計算與大規模存儲上,常見的展現方式有 T+1 報表,大規模資料線上查詢等。

随着網際網路技術的日漸發展、資料規模的擴大與複雜的需求場景的産生,傳統的大資料架構無法承載。大資料架構在近些年的演進主要展現下以下幾方面:

  1. 規模化:這裡的規模化主要展現在大資料技術的使用規模上和資料規模的增長。大資料技術的使用規模增長代表越來越多的複雜需求産生,而資料規模的增長決定了傳統的準大資料技術(如 MySQL)無法解決所有問題。是以,拿存儲元件舉例來說,通常會劃分到不同的資料分層,面向規模、成本、查詢和分析性能等不同次元的優化偏向,以滿足多樣性的需求。
  2. 實時化:傳統的 T+1 的離線大資料技術無法滿足推薦、監控類近實時的需求,整個大資料生态和技術架構在過去十年發生了很大的更新換代。就存儲上來說,傳統的 HDFS 檔案存儲、Hive 數倉無法滿足低成本,可更新疊代的需求,是以滋生出 Hudi 等資料方案。就計算上來說,傳統的 MapReduce 批處理的能力無法做到秒級的資料處理,先後出現 Storm 較原始的實時處理和 Spark Streaming 的微批處理,目前由 Flink 基于 Dataflow 模型的實時計算架構在實時計算領域占據絕對主導地位。
  3. 雲原生化:傳統的公司往往會選擇自建機房,或者在雲上購買機器部署執行個體這種雲托管的形式,但這種架構存在低谷期使用率低,存儲計算不分離導緻的存儲和計算彈性差,以及更新靈活度低等各種問題。雲原生大資料架構就是所謂的資料湖,其本質就是充分利用雲上的彈性資源來實作一個統一管理、統一存儲、彈性計算的大資料架構,變革了傳統大資料架構基于實體叢集和本地磁盤的計算存儲架構。其主要技術特征是存儲和計算分離和 Serverless。在雲原生大資料架構中,每一層架構都在往服務化的趨勢演進,存儲服務化、計算服務化、中繼資料管理服務化等。每個元件都被要求拆分成不同的單元,具備獨立擴充的能力,更開放、更靈活、更彈性。

本篇文章将基于雲原生大資料架構的場景,詳細讨論實時計算中的維表和結果表的架構選型。

二 大資料架構中的實時計算

1 實時計算場景

大資料的高速發展已經超過 10 年,大資料也正在從計算規模化向更加實時化的趨勢演進。實時計算場景主要有以下幾種最常見的場景:

  1. 實時數倉:實時數倉主要應用在網站 PV / UV 統計、交易資料統計、商品銷量統計等各類交易型資料場景中。在這種場景下,實時計算任務通過訂閱業務實時資料源,将資訊實時秒級分析,最終呈現在業務大屏中給決策者使用,友善判斷企業營運狀況和活動促銷的情況。
  2. 實時推薦:實時推薦主要是基于 AI 技術,根據使用者喜好進行個性化推薦。常見于短視訊場景、内容資訊場景、電商購物等場景。在這種場景下,通過使用者的曆史點選情況實時判斷使用者喜好,進而進行針對性推薦,以達到增加使用者粘性的效果。
  3. 資料 ETL:實時的 ETL 場景常見于資料同步任務中。比如資料庫中不同表的同步、轉化,或者是不同資料庫的同步,或者是進行資料聚合預處理等操作,最終将結果寫入資料倉庫或者資料湖進行歸檔沉澱。這種場景主要是為後續的業務深度分析進行前期準備工作。
  4. 實時診斷:這種常見于金融類或者是交易類業務場景。在這些場景中,針對行業的獨特性,需要有反作弊監管,根據實時短時間之内的行為,判定使用者是否為作弊使用者,做到及時止損。該場景對時效性要求極高,通過實時計算任務對異常資料檢測,實時發現異常并進行及時止損。

2 Flink SQL 實時計算

實時計算需要背景有一套極其強大的大資料計算能力,Apache Flink 作為一款開源大資料實時計算技術應運而生。由于傳統的 Hadoop、Spark 等計算引擎,本質上是批計算引擎,通過對有限的資料集進行資料處理,其處理時效性是不能保證的。而 Apache Flink ,從設計之初就以定位為流式計算引擎,它可以實時訂閱實時産生的流式資料,對資料進行實時分析處理并産生結果,讓資料在第一時間發揮價值。

Flink 選擇了 SQL 這種聲明式語言作為頂層 API,友善使用者使用,也符合雲原生大資料架構的趨勢:

  1. 大資料普惠,規模生産:Flink SQL 能夠根據查詢語句自動優化,生成最優的實體執行計劃,屏蔽大資料計算中的複雜性,大幅降低使用者使用門檻,以達到大資料普惠的效果。
  2. 流批一體:Flink SQL 具備流批統一的特性,無論是流任務還是批處理任務都給使用者提供相同的語義和統一的開發體驗,友善業務離線任務轉實時。
  3. 屏蔽底層存儲差異:Flink 通過提供 SQL 統一查詢語言,屏蔽底層資料存儲的差異,友善業務在多樣性的大資料存儲中進行靈活切換,對雲上大資料架構進行更開放、靈活的調整。
雲原生大資料架構中實時計算維表和結果表的選型實踐

上圖是 Flink SQL 的一些基本操作。可以看到 SQL 的文法和标準 SQL 非常類似,示例中包括了基本的 SELECT、FILTER 操作,可以使用内置函數(如日期的格式化),也可以在注冊函數後使用自定義函數。

Flink SQL 将實時計算拆分成源表,結果表和維表三種,将這三種表的 DDL 語句(比如 CREATE TABLE)注冊各類輸入、輸出的資料源,通過 SQL 的 DML(比如 INSERT INTO)表示實時計算任務的拓撲關系,以達到通過 SQL 完成實時計算任務開發的效果。

雲原生大資料架構中實時計算維表和結果表的選型實踐
  1. 源表:主要代表消息系統類的輸入,比如 Kafka,MQ(Message Queue),或者 CDC(Change Data Capture,例如将 MySQL binlog 轉換成實時流)輸入。
  2. 結果表:主要代表 Flink 将每條實時處理完的資料寫入的目标存儲,如 MySQL,HBase 等資料庫。
  3. 維表:主要代表存儲資料次元資訊的資料源。在實時計算中,因為資料采集端采集到的資料往往比較有限,在做資料分析之前,就要先将所需的次元資訊補全,而維表就是代表存儲資料次元資訊的資料源。常見的使用者維表有 MySQL,Redis 等。

下圖是一個完整的實時計算示例,示例中的 Flink SQL 任務,這個任務的目标是計算每分鐘不同商品分類的 GMV (Gross Merchandise Volume,即商品交易總額)。在這個任務中,Flink 實時消費使用者訂單資料的 Kafka 源表,通過 Redis 維表将商品 id 關聯起來擷取到商品分類,按照 1 分鐘間隔的滾動視窗按商品分類将總計的交易金額計算出來,将最後的結果寫入 RDS(Relational Database Service,如 MySQL) 結果表中。

# 源表 - 使用者訂單資料,代表某個使用者(user_id)在 timestamp 時按 price 的價格購買了商品(item_id)
CREATE TEMPORARY TABLE user_action_source (
  `timestamp` BIGINT,
  `user_id` BIGINT,
  `item_id` BIGINT,
  `price` DOUBLE,SQs
) WITH (
  'connector' = 'kafka',
  'topic' = '<your_topic>',
  'properties.bootstrap.servers' = 'your_kafka_server:9092',
  'properties.group.id' = '<your_consumer_group>'
  'format' = 'json',
  'scan.startup.mode' = 'latest-offset'
);

# 維表 - 物品詳情
CREATE TEMPORARY TABLE item_detail_dim (
  id STRING,
  catagory STRING,
  PRIMARY KEY (id) NOT ENFORCED
) WITH (
  'connector' = 'redis',
  'host' = '<your_redis_host>',
  'port' = '<your_redis_port>',
  'password' = '<your_redis_password>',
  'dbNum' = '<your_db_num>'
);

# 結果表 - 按時間(分鐘)和分類的 GMV 輸出
CREATE TEMPORARY TABLE gmv_output (
   time_minute STRING,
   catagory STRING,
   gmv DOUBLE,
   PRIMARY KEY (time_minute, catagory)
) WITH (
   type='rds',
   url='<your_jdbc_mysql_url_with_database>',
   tableName='<your_table>',
   userName='<your_mysql_database_username>',
   password='<your_mysql_database_password>'
);

# 處理過程
INSERT INTO gmv_output 
SELECT 
  TUMBLE_START(s.timestamp, INTERVAL '1' MINUTES) as time_minute,
  d.catagory,
  SUM(d.price) as gmv
FROM
  user_action_source s
  JOIN item_detail_dim FOR SYSTEM_TIME AS OF PROCTIME() as d
    ON s.item_id = d.id
GROUP BY TUMBLE(s.timestamp, INTERVAL '1' MINUTES), d.catagory;           

這是一個很常見的實時計算的處理鍊路。後續章節中,我們将針對實時計算的維表和結果表的關鍵能力進行展開分析,并分别進行架構選型的讨論。

三 實時計算維表

1 關鍵需求

在資料倉庫的建設中,一般都會圍繞着星型模型和雪花模型來設計表關系或者結構。實時計算也不例外,一種常見的需求就是為資料流補齊字段。因為資料采集端采集到的資料往往比較有限,在做資料分析之前,就要先将所需的次元資訊補全。比如采集到的交易日志中隻記錄了商品 id,但是在做業務時需要根據店鋪次元或者行業緯度進行聚合,這就需要先将交易日志與商品維表進行關聯,補全所需的次元資訊。這裡所說的維表與資料倉庫中的概念類似,是次元屬性的集合,比如商品次元、使用者度、地點次元等等。

雲原生大資料架構中實時計算維表和結果表的選型實踐

作為儲存使用者次元資訊的資料存儲,需要應對實時計算場景下的海量低延時通路。根據這樣的定位,我們總結下對結構化大資料存儲的幾個關鍵需求:

1. 高吞吐與低延時的讀取能力

首當其沖,在不考慮開源引擎 Flink 自身維表的優化外,維表必須能承擔實時計算場景下的海量(上萬 QPS)的資料通路,也能在極低(毫秒級别)的延時下傳回查詢資料。

2. 與計算引擎的高整合能力

在維表自身的能力之外,出于性能、穩定性和成本的考慮,計算引擎自身往往也會有些流量解除安裝的能力,在一些情況下無需每次請求都需要去通路下遊維表。例如,Flink 在維表場景下支援 Async IO 和緩存政策等優化特性。一個比較好的維表需要和開源計算引擎有着較高程度的對接,一方面可以提升計算層的性能,一方面也可以有效的解除安裝部分流量,保障維表不被過多通路擊穿,并降低維表的計算成本。

3. 輕存儲下的計算能力的彈性

維表通常是一張共享表,存儲次元屬性等中繼資料資訊,通路規模往往較大,而存儲規模往往不會特别大。對維表的通路規模極大地依賴實時資料流的資料量。比如,如果實時流的資料規模擴大了數十倍,此時對維表的通路次數會大大提升;又比如,如果新增了多個實時計算任務通路該維表,該維表的查詢壓力會激增。在這些場景下,存儲規模往往不會顯著增加。

是以,計算最好是按需的,是彈性的。無論是新增或者下線實時計算任務,或者增加通路流量,都不會影響通路性能。同時,計算和存儲是應該分離的,不會單純因為通路計算量的激增就增加存儲成本。

2 架構選型

MySQL

大資料和實時計算技術起步之初,網際網路早期大量流行 LAMP (Linux + Apache + MySQL + PHP)架構快速開發站點。是以,由于業務曆史資料已經存在 MySQL 中,在最初的實時計算維表選型中大量使用 MySQL 作為維表。

随着大資料架構的更新,MySQL 雲上架構也在不斷改進,但在維表的應用場景下仍然存在以下問題:

  1. 存儲側擴充靈活性差,擴充成本較高:MySQL 在存儲側的擴充需要進行資料複制遷移,擴充周期長且靈活性差。同時 MySQL 的分庫分表每次擴充需要雙倍資源,擴充成本較高。
  2. 存儲成本高:關系資料庫是結構化資料存儲機關成本最高的存儲系統,是以對于大資料場景來說,關系型資料庫存儲成本較高。

以上這些限制使 MySQL 在大資料維表場景下存在性能瓶頸,成本也比較高。但總體來說,MySQL 是非常優秀的資料庫産品,在資料規模不怎麼大的場景下,MySQL 絕對是個不錯的選擇。

Redis

在雲上應用架構中,由于 MySQL 難以承載不斷增加的業務負載,往往會使用 Redis 作為 MySQL 的查詢結果集緩存,幫助 MySQL 來抵禦大部分的查詢流量。

在這種架構中,MySQL 作為主存儲伺服器,Redis 作為輔助存儲,MySQL 到 Redis 的同步可以通過 binlog 實時同步或者 MySQL UDF + 觸發器的方式實作。在這種架構中,Redis 可以用來緩存提高查詢性能,同時降低 MySQL 被擊穿的風險。

由于在 Redis 中緩存了一份弱一緻性的使用者資料,Redis 也常常用來作為實時計算的維表。相比于 MySQL 作為維表,Redis 有着獨特的優勢:

  1. 查詢性能極高:資料高速緩存在記憶體中,可以通過高速 Key-Value 形式進行結果資料查詢,非常符合維表高性能查詢的需求。
  2. 存儲層擴充靈活性高:Redis 可以非常友善的擴充分片叢集,進行橫向擴充,支援資料多副本的持久化。

Redis 有其突出的優點,但也有一個不可忽視的缺陷:雖然 Redis 有着不錯的擴充方案,但由于高速緩存的資料存在記憶體中,成本較高,如果遇到業務資料的次元屬性較大(比如使用者次元、商品次元)時,使用 Redis 作為維表存儲時成本極高。

Tablestore

Tablestore是阿裡雲自研的結構化大資料存儲産品,具體産品介紹可以參考官網以及權威指南。在大資料維表的場景下,Tablestore 有着獨特的優勢:

  1. 高吞吐通路:Tablestore 采用了存儲計算分離架構,可以彈性擴充計算資源,支援高吞吐下的資料查詢。
  2. 低延時查詢:Tablestore 按照 LSM 存儲引擎實作,支援 Block Cache 加速查詢,使用者也通過配置豐富的索引,優化業務查詢。
  3. 低成本存儲和彈性計算成本:在存儲成本上,Tablestore 屬于結構化 NoSQL 存儲類型,資料存儲成本比起關系型資料庫或者高速緩存要低很多;在計算成本上,Tablestore 采用了存儲計算架構,可以按需彈性擴充計算資源。
  4. 與 Flink 維表優化的高度對接:Tablestore 支援 Flink 維表優化的所有政策,包括 Async IO 和不同緩存政策。

方案對比

雲原生大資料架構中實時計算維表和結果表的選型實踐

上面是前文提到的幾個維表方案在各個次元的對比。接下來,将舉幾個具體的場景細緻對比下成本:

1.高存儲高計算:維表需要存 100 億條訂單次元的資料,總計存儲量需要 1T,盡管業務在 Flink 任務端配置了緩存政策,但仍然有較高的 KV 查詢下沉到維表,到維表的 QPS 峰值 10 萬,均值 2.5 萬。不同維表所需的配置要求和購買成本如下:

雲原生大資料架構中實時計算維表和結果表的選型實踐

2.低存儲低計算:維表需要存 100 萬條地域次元的資料,總計存儲量需要 10M,業務端在 Flink 任務中的維表配置了 LRU 緩存政策抵禦了絕大部分的流量,到維表的 QPS 峰值 1000 均值 250。不同維表所需的配置要求和購買成本如下:

雲原生大資料架構中實時計算維表和結果表的選型實踐

3.高存儲低計算:維表需要存 100 億條訂單次元的資料,總計存儲量需要 1T,業務端在 Flink 任務中的維表配置了 LRU 緩存政策抵禦了絕大部分的流量,到維表的 QPS 峰值 1000 均值 250。不同維表所需的配置要求和購買成本如下:

雲原生大資料架構中實時計算維表和結果表的選型實踐

4.低存儲高計算:Redis 作為記憶體資料庫,具有超高頻的資料 KV 查詢能力,僅 4 核 8G 記憶體的 Redis叢集,即可支援 16 萬 QPS的并發通路,成本預計 1600 元 / 月,在低存儲高計算場景有着鮮明的成本優勢。

從上面的成本對比報告中可見:

1)MySQL 由于缺乏存儲和計算的彈性,以及關系型資料庫固有的缺點,在不同程度的存儲和計算規模下成本均較高。

2)Redis 作為記憶體資料庫,在低存儲(約 128G 以下)高計算場景有着鮮明的成本優勢,但由于記憶體存儲成本很高、缺乏彈性,随着資料規模的提升,成本呈指數增長。

3)Tablestore 基于雲原生架構可以按量對存儲和計算進行彈性,在資料存儲和通路規模不大時成本較低。

4)Tablestore 作為 NoSQL 資料庫存儲成本很低,在高存儲(128G 以上)場景下有着鮮明的成本優勢。

四 實時計算結果表

1 需求分析

結果表作為實時計算完成後資料導入的存儲系統,主要可分為關系資料庫、搜尋引擎、結構化大資料離線存儲、結構化大資料線上存儲幾種分類,具體差異通過以下表格進行了歸納。

雲原生大資料架構中實時計算維表和結果表的選型實踐

對于這幾種資料産品,在各自場景下各有優勢,起源的先後也各有不同。為了友善探究,我們将問題域縮小,僅僅考慮實時計算的場景下,一個更好的結果表存儲需要承擔什麼樣的角色。

上文提到了實時計算的主要幾個場景中,實時數倉,實時推薦,實時監控三個場景需要考慮結果表的選型。我們一一分析。

  1. 實時數倉:實時數倉主要應用在網站實時 PV / UV 統計、交易資料統計等實時分析場景。實時分析(即OLAP)場景分為預聚合、搜尋引擎和 MPP(Massively Parallel Processing,即大規模并行處理)三種 OLAP 模型。對于預聚合模型來說,可以通過 Flink 計算層進行資料聚合寫入結果表,也可以全量寫入結果表中,通過結果表自身的預聚合能力進行資料存儲,在這種形态中極大地依賴結果表資料查詢與分析能力的支撐。對于搜尋引擎模型來說,資料将全量寫入結果表中,通過搜尋引擎的反向索引和列存特性進行資料分析,在這種形态中需要結果表有高吞吐的資料寫入能力和大規模資料存儲能力。MPP 模型是計算引擎,如果通路的是列式存儲,可以更好地發揮分析查詢特性。實時 OLAP 存儲和計算引擎衆多,在一個完整的資料系統架構下,需要有多個存儲元件并存。并且根據對查詢和分析能力的不同要求,需要資料派生派生能力在必要時擴充到其他類型存儲。另外,實時數倉中随着業務規模的擴大,存儲量會大幅增長,相較來說資料查詢等計算規模變化一般不會特别明顯,是以結果表需要做到存儲和計算成本分離,極大地控制資源成本。
  2. 實時推薦:實時推薦主要是根據使用者喜好進行個性化推薦,在常見的使用者商品個性化推薦場景下,一種常見的做法是将使用者的特征寫入結構化大資料存儲(如 HBase )中,而該存儲将作為維表另一條使用者點選消費行為資料進行關聯,提取出使用者特征與行為關聯輸入,作為推薦算法的輸入。這裡的存儲既需要作為結果表提供高吞吐的資料寫入能力,也需要作為維表提供高吞吐低延時的資料線上查詢能力。
  3. 實時監控:應用的實時監控常見于金融類或者是交易類業務場景,該場景對時效性要求極高,通過對異常資料檢測,可以實時發現異常情況而做出一個止損的行為。在這種場景下無論是通過門檻值進行判斷還是通過異常檢測算法,都需要實時低延時的資料聚合查詢能力。

2 關鍵能力

通過以上的需求分析,我們可以總結出幾項實時大資料結果表的關鍵能力:

1.大規模資料存儲

結果表存儲的定位是集中式的大規模存儲,作為線上資料庫的彙總,或者是實時計算(或者是離線)的輸入和輸出,必須要能支撐 PB 級規模資料存儲。

2.豐富的資料查詢與聚合分析能力

結果表需要擁有豐富的資料查詢與聚合分析能力,需要為支撐高效線上查詢做優化。常見的查詢優化包括高速緩存、高并發低延遲的随機查詢、複雜的任意字段條件組合查詢以及資料檢索。這些查詢優化的技術手段就是緩存和索引,其中索引的支援是多元化的,面向不同的查詢場景提供不同類型的索引。例如面向固定組合查詢的基于 B+tree 的二級索引,面向地理位置查詢的基于 R-tree 或 BKD-tree 的空間索引或者是面向多條件組合查詢和全文檢索的反向索引。

3.高吞吐寫入能力

實時計算的資料表需要能承受大資料計算引擎的海量結果資料集導出。是以必須能支撐高吞吐的資料寫入,通常會采用一個為寫入而優化的存儲引擎。

4.資料派生能力

一個完整的資料系統架構下,需要有多個存儲元件并存。并且根據對查詢和分析能力的不同要求,需要在資料派生體系下對存儲進行動态擴充。是以對于大資料存儲來說,也需要有能擴充存儲的派生能力,來擴充資料處理能力。而判斷一個存儲元件是否具備更好的資料派生能力,就看是否具備成熟的 CDC 技術。

5.雲原生架構:存儲與計算成本分離

在雲原生大資料架構中,每一層架構都在往服務化的趨勢演進,存儲服務化、計算服務化、中繼資料管理服務化等。每個元件都被要求拆分成不同的單元,作為結果表也不例外,需要具備獨立擴充的能力,更開放、更靈活、更彈性。

單就從結果表來說,隻有符合雲原生架構的元件,即基于存儲計算分離架構實作的産品,才能做到存儲和計算成本的分離,以及獨立擴充。存儲和計算分離的優勢,在大資料系統下會更加明顯。舉一個簡單的例子,結構化大資料存儲的存儲量會随着資料的積累越來越大,但是資料寫入量是相對平穩的。是以存儲需要不斷的擴大,但是為了支撐資料寫入或臨時的資料分析而所需的計算資源,則相對來說比較固定,是按需的。

3 架構選型

和維表一樣,大資料和實時計算技術起步之初,MySQL 是一個萬能存儲,幾乎所有需求都可以通過 MySQL 來完成,是以應用規模非常廣,結果表也不例外。随着資料規模的不斷擴充和需求場景的日漸複雜,MySQL 有點難以承載,就結果表的場景下主要存在以下問題:

  1. 大資料存儲成本高:這個在之前讨論維表時已經提到,關系資料庫機關存儲成本非常高。
  2. 單一存儲系統,提供的查詢能力有限:随着資料規模的擴大,MySQL 讀寫性能的不足問題逐漸顯現了出來。另外,随着分析類 AP 需求的産生,更适合 TP 場景的 MySQL 查詢能力比較有限。
  3. 高吞吐資料寫入能力較差:作為 TP 類的關系型資料庫,并不是特别擅長高吞吐的資料寫入。
  4. 擴充性差,擴充成本較高:這個在之前讨論維表時已經提到,MySQL 在存儲側的擴充需要進行資料複制遷移,且需要雙倍資源,是以擴充靈活性差,成本也比較高。

以上這些限制使 MySQL 在大資料結果表場景下存在性能瓶頸,成本也比較高,但作為關系型資料庫,不是特别适合作為大資料的結果表使用。

HBase

由于關系型資料庫的天然瓶頸,基于 BigTable 概念的分布式 NoSQL 結構化資料庫應運而生。目前開源界比較知名的結構化大資料存儲是 Cassandra 和 HBase,Cassandra 是 WideColumn 模型 NoSQL 類别下排名 Top-1 的産品,在國外應用比較廣泛。這篇文章中,我們重點提下在國内應用更多的 HBase。 HBase 是基于 HDFS 的存儲計算分離架構的 WideColumn 模型資料庫,擁有非常好的擴充性,能支撐大規模資料存儲,它的優點為:

  1. 大資料規模存儲,支援高吞吐寫入:基于 LSM 實作的存儲引擎,支援大規模資料存儲,并為寫入優化設計,能提供高吞吐的資料寫入。
  2. 存儲計算分離架構:底層基于 HDFS,分離的架構可以按需對存存儲和計算分别進行彈性擴充。
  3. 開發者生态成熟,與其他開源生态整合較好:作為發展多年的開源産品,在國内也有比較多的應用,開發者社群很成熟,與其他開源生态如 Hadoop,Spark 整合較好。

HBase有其突出的優點,但也有幾大不可忽視的缺陷:

  1. 查詢能力弱,幾乎不支援資料分析:提供高效的單行随機查詢以及範圍掃描,複雜的組合條件查詢必須使用 Scan + Filter 的方式,稍不注意就是全表掃描,效率極低。HBase 的 Phoenix 提供了二級索引來優化查詢,但和 MySQL 的二級索引一樣,隻有符合最左比對的查詢條件才能做索引優化,可被優化的查詢條件非常有限。
  2. 資料派生能力弱:前面章節提到 CDC 技術是支撐資料派生體系的核心技術,HBase 不具備 CDC 技術。
  3. 非雲原生 Serverless 服務模式,成本高:前面提到結構化大資料存儲的關鍵需求之一是存儲與計算的成本分離,HBase 的成本取決于計算所需 CPU 核數成本以及磁盤的存儲成本,基于固定配比實體資源的部署模式下 CPU 和存儲永遠會有一個無法降低的最小比例關系。即随着存儲空間的增大,CPU 核數成本也會相應變大,而不是按實際所需計算資源來計算成本。是以,隻有雲原生的 Serverless 服務模式,才要達到完全的存儲與計算成本分離。
  4. 運維複雜:HBase 是标準的 Hadoop 元件,最核心依賴是 Zookeeper 和 HDFS,沒有專業的運維團隊幾乎無法運維。

國内的進階玩家大多會基于 HBase 做二次開發,基本都是在做各種方案來彌補 HBase 查詢能力弱的問題,根據自身業務查詢特色研發自己的索引方案,例如自研二級索引方案、對接 Solr 做全文索引或者是針對區分度小的資料集的 bitmap 索引方案等等。總的來說,HBase 是一個優秀的開源産品,有很多優秀的設計思路值得借鑒。

HBase + Elasticsearch

為了解決 HBase 查詢能力弱的問題,國内很多公司通過 Elasticsearch 來加速資料檢索,按照 HBase + Elasticsearch 的方案實作他們的架構。其中,HBase 用于做大資料存儲和曆史冷資料查詢,Elasticsearch 用于資料檢索,其中,由于 HBase 不具備 CDC 技術,是以需要業務方應用層雙寫 HBase 和 Elasticsearch,或者啟動資料同步任務将 HBase 同步至 Elasticsearch。

這個方案能通過 Elasticsearch 極大地補足 HBase 查詢能力弱的問題,但由于 HBase 和 Elasticsearch 本身的一些能力不足,會存在以下幾個問題:

  1. 開發成本高,運維更加複雜:客戶要維護至少兩套叢集,以及需要完成 HBase 到 Elasticsearch 的資料同步。如果要保證 HBase 和 Elasticsearch 的一緻性,需要通過前文提到的應用層多寫的方式,這不是解耦的架構擴充起來比較複雜。另外整體架構比較複雜,涉及的子產品和技術較多,運維成本也很高。
  2. 成本很高:客戶需要購買兩套叢集,以及維護 HBase 和 Elasticsearch 的資料同步,資源成本很高。
  3. 仍沒有資料派生能力:這套架構中,隻是将資料分别寫入 HBase 和 Elasticsearch 中,而 HBase 和 Elasticsearch 均沒有 CDC 技術,仍然無法靈活的将資料派生到其他系統中。

Tablestore 是阿裡雲自研的結構化大資料存儲産品,具體産品介紹可以參考官網以及權威指南。Tablestore 的設計理念很大程度上顧及了資料系統内對結構化大資料存儲的需求,并且基于派生資料體系這個設計理念專門設計和實作了一些特色的功能。簡單概括下 Tablestore 的技術理念:

  1. 大規模資料存儲,支援高吞吐寫入:LSM 和 B+ tree 是主流的兩個存儲引擎實作,其中 Tablestore 基于 LSM 實作,支援大規模資料存儲,專為高吞吐資料寫入優化。
  2. 通過多元化索引,提供豐富的查詢能力:LSM 引擎特性決定了查詢能力的短闆,需要索引來優化查詢。而不同的查詢場景需要不同類型的索引,是以 Tablestore 提供多元化的索引來滿足不同類型場景下的資料查詢需求。
  3. 支援 CDC 技術,提供資料派生能力:Tablestore 的 CDC 技術名為 Tunnel Service,支援全量和增量的實時資料訂閱,并且能無縫對接 Flink 流計算引擎來實作表内資料的實時流計算。
  4. 存儲計算分離架構:采用存儲計算分離架構,底層基于飛天盤古分布式檔案系統,這是實作存儲計算成本分離的基礎。
  5. 雲原生架構,Serverless 産品形态,免運維:雲原生架構的最關鍵因素是存儲計算分離和 Serverless 服務化,隻有存儲計算分離和 Serverless 服務才能實作一個統一管理、統一存儲、彈性計算的雲原生架構。由于是 Serverless 産品形态,業務方無需部署和維護 Tablestore,極大地降低使用者的運維成本。
雲原生大資料架構中實時計算維表和結果表的選型實踐

舉一個具體的場景,結果表需要存千億級别的電商訂單交易資料,總計存儲量需要 1T,使用者需要對于這類資料進行查詢與靈活的分析。日常訂單查詢與資料檢索頻率為 1000 次/秒,資料分析約每分鐘查詢 10 次左右。

以下是不同架構達到要求所需的配置,以及在阿裡雲上的購買成本:

雲原生大資料架構中實時計算維表和結果表的選型實踐

五 總結

本篇文章談了雲原生大資料架構下的實時計算維表和結果表場景下的架構設計與選型。其中,阿裡雲 Tablestore 在這些場景下有一些特色功能,希望能通過本篇文章對我們有一個更深刻的了解。後續,我們會推出從零建構 Flink on Tablestore 系列文章,并針對維表和結果表場景推出最佳實踐文章。

網站架構師(CUED)教育訓練課程

網站架構師CUED(Cloud User Experience Design),集項目經理、産品經理、原型設計師等多重身份于一身,幫助客戶整理需求、内容及架構搭建工作,把客戶的需求完整地在網站系統中實作 。需要網站架構師具備完整的邏輯能力,對行業有較深了解,協助使用者完成網站的原型設計。

點選這裡

,檢視課程~