大數據計算發展至今,已經形成了一個百花齊放的大數據生態,通用計算、定制開發,批量處理、實時計算,關系查詢、圖遍歷以及機器學習等等,我們都可以找到各種對應的計算引擎來協助我們處理這些任務。本系列文章擬以大數據平臺從低到高的層次為主線,梳理整個大數據計算生態組件及其功能。
大數據計算生態的系列文章,擬包含的系列文章有:《大數據計算生態之數據存儲》《大數據計算生態之數據計算》《大數據計算生態之數據交互》《大數據計算生態之計算調度》以及《大數據計算生態之數據工具》,該系列文章將從底層存儲到頂層交互的各個組件進行講解,幫助大家厘清大數據體系,豐富大數據知識。
大數據計算生態(如上圖)最上層為應用層,也就是實際與開發人員交互的層,例如分析人員只需要在應用層的Hive中寫SQL即可,具體的任務分配和運行交給Hive來調用中間層的MapReduce引擎來進行處理。Spark的GraphX、MLlib等組件可以用來進行圖分析和機器學習等。中間層的Spark、Flink等作為核心計算引擎提供批計算和流計算支持。左邊ZK和Oozie是任務配置協調,右邊的是日志采集、遷移或者獲取數據相關的組件,再向下是資源調度管理系統,最底層是數據存儲,一個大數據平臺就要提供能進行多模型數據存儲的能力,比如除了最常見的關系數據,還有時序、文檔、鍵值和圖等數據。
有些組件所處的層次其實還值得繼續討論,例如ElasticSearch其實也是一個存儲組件,Hbase在作為存儲組件的時候其實也作為查詢計算組件使用,Flink也可以放到最上層,作為開發人員直接交互的組件。但整體來講,整個大數據生態大概就是如此,大數據生態組件之間本就是相互拼接來完成特定功能。本文來具體介紹最底層的數據存儲。
存儲層
存儲層負責進行大數據平臺的數據存儲。過去的幾十年,數據大部分以結構化的形式存儲在關系數據庫中,常見的如Oracle和MySQL兩種。隨著數據越來越多樣,出現了各種類型的數據庫,如圖數據庫、鍵值數據庫、時序數據庫、文檔數據庫等,以及除了傳統的行存數據庫外,也出現了列存數據庫或者文件格式。
1.HDFS(分布式文件系統)
HDFS 是 Hadoop Distribute File System,Hadoop分布式文件系統的簡稱。這個文件系統是一個適用于大的數據集的支持高吞吐和高容錯的運行在通用(廉價)機上的分布式文件系統。
HDFS 是一個主從架構的服務。一個 HDFS 集群包括一個 NameNode 節點、一個 SecondaryNameNode 節點(非必須)和多個 DataNode 節點。

圖中的幾個要點:
- NameNode管理著Metadata(元數據)
- 客戶端Client對元數據的操作是指向NameNode,對用戶數據的讀寫是通過DataNode;
- NameNode向DataNode發送Block的操作命令
- 一塊的副本被存儲在不同的機架中
關系數據存儲(行存儲)
傳統的數據庫例如MySQL,Oracle等關系數據庫,都采用的是行存儲引擎,在基于行式存儲的數據庫中, 數據是按照行數據為基礎邏輯存儲單元進行存儲的, 一行中的數據在存儲介質中以連續存儲形式存在。
列存儲
列式存儲(Column-based)是相對于行式存儲來說的,新興的 Hbase、HP Vertica、EMC Greenplum 等分布式數據庫均采用列式存儲。在基于列式存儲的數據庫中, 數據是按照列為基礎的邏輯存儲單元進行存儲的,一列中的數據在存儲介質中以連續存儲形式存在。
從上圖可以很清楚地看到,行式存儲下一張表的數據都是放在一起的,但列式存儲下都被分開保存了。所以它們就有了如下這些優缺點:

對于傳統的數據存儲來講,無論是行存還是列存,它們的存取策略都基本是一致的,整體分為兩大類操作(讀操作和寫操作),如上圖所示,讀寫策略可以大概總結為如下的步驟:

針對這樣的讀寫邏輯,就有了針對存儲層在不同存取階段的優化方案。
多模型存儲
隨著數據多樣性的發展,多種類型的數據大量涌出,相對應的NoSQL系統也出現了。例如Neo4j圖存儲,用來存儲社交網絡、知識圖譜等圖數據;再入近兩年Iot智能制造的興起,大量工業生產生活中的時序數據,也對應出現了InfluxDB這種存儲時序數據的系統;還有生產中常用的鍵值數據庫Redis等。
(1)圖存儲
圖存儲分為原生圖存儲和非原生圖存儲(利用圖模型加已有的存儲引擎),不同的存儲方案在讀寫圖數據的時候也有不一樣的策略,如下所列:


原生圖存儲雖然是針對圖數據自身特點而定制化開發的圖存儲策略,但是對于分布式的支持較差。在大數據時代,很難有一個數據管理系統能夠做到存儲查詢雙高效,因此,在現實的應用中,圖相關的計算存儲往往是分離的,采用一些比較成熟的存儲引擎。
(2)鍵值對存儲

另一種比較流行的存儲就是鍵值對存儲,鍵值數據庫因其在不涉及過多數據關聯的數據上的高效讀寫能力得到了廣泛的應用。我們以最基本的LevelDB存儲模型為例,來探索鍵值存儲一角。

以上就是LevelDB的讀寫策略,當然這只是簡單的總結,其中還涉及到很多有意思的細節,大家可以繼續深入探索。
除了上面講的行存儲、列存儲、鍵值存儲以及圖存儲,還有文檔存儲,時序數據存儲等,在數據規模日益擴大、數據類型日益豐富的時代,可能還會有新的存儲出現,但是,只要我們掌握了現有存儲的基本套路,就能夠快速應對和掌握新的存儲形式的出現。
內存存儲
內存存儲也可以簡單理解為緩存,緩存其實已經不是什么新概念了,無論是在操作系統還是傳統的數據管理系統,都有緩沖區或者緩存的概念,主要是為了平衡CPU和磁盤之間的速度的差異,提高效率。在大數據的應用場景中,由于數據量比較大,數據的處理邏輯也比較復雜,因此一些中間過程結果可以復用的數據就可以通過分布式緩存來進行臨時存儲,其他的任務就可以避免數據的二次加工從而提高效率。
(1)Alluxio
Alluxio(之前名為Tachyon)是世界上第一個以內存為中心的虛擬的分布式存儲系統。它統一了數據訪問的方式,為上層計算框架和底層存儲系統構建了橋梁。應用只需要連接Alluxio即可訪問存儲在底層任意存儲系統中的數據。此外,Alluxio的以內存為中心的架構使得數據的訪問速度能比現有方案快幾個數量級。
Alluxio的特點是數據存儲與計算分離,兩部分引擎可以進行獨立的擴展。上層的計算引擎(如Hadoop, Spark)可以通過Alluxio訪問不同數據源(Amazon S3, HDFS)中的數據,通過Alluxio屏蔽底層不同的數據源,做到數據的無感獲取。
總結
隨著新硬件的出現和發展,基于磁盤、新硬件、緩存以及內存的多級存儲體系得到了越來越多的研究,隨著多級存儲的發展,必將迎來新的技術進步。
編輯:hfy
電子發燒友App
























評論