以下文章來源于數倉寶貝庫 ,作者Saurabh
業務問題的范圍太廣、太深、太復雜,一種工具無法解決所有問題,在大數據和分析領域尤其如此。
熱數據需要在內存中存儲和處理,因此適合用緩存或內存數據庫(如redis或SAP Hana)。
AWS提供了ElastiCache服務,可生成托管的Redis或Memcached環境。
NoSQL數據庫是面向高速但小規模記錄(例如,用戶會話信息或物聯網數據)的理想選擇。
NoSQL數據庫對于內容管理也很有用,可以存儲數據目錄。
1、結構化數據存儲
結構化數據存儲已經存在了幾十年,是人們最熟悉的數據存儲技術。大多數事務型數據庫(如Oracle、MySQL、SQL Server和PostgreSQL)都是行式數據庫,因為要處理來自軟件應用程序的頻繁數據寫入。
企業經常將事務型數據庫同時用于報表,在這種情況下,需要頻繁讀取數據,但數據寫入頻率要低得多。
隨著數據讀取的需求越來越強,有更多的創新進入了結構化數據存儲的查詢領域,比如列式文件格式的創新,它有助于提高數據讀取性能,滿足分析需求。
基于行的格式將數據以行的形式存儲在文件中?;谛械膶懭敕绞绞菍祿懭氪疟P的最快方式,但它不一定能最快地讀取,因為你必須跳過很多不相關的數據。
基于列的格式將所有的列值一起存儲在文件中。這樣會帶來更好的壓縮效果,因為相同的數據類型現在被歸為一組。通常,它還能提供更好的讀取性能,因為你可以跳過不需要的列。
我們來看結構化數據存儲的常見選擇。
例如,你需要從訂單表中查詢某個月的銷售總數,但該表有50列。在基于行的架構中,查詢時會掃描整個表的50個列,但在列式架構中,查詢時只會掃描訂單銷售列,因而提高了數據查詢性能。
我們再來詳細介紹關系型數據庫,重點介紹事務數據和數據倉庫處理數據分析的需求。
(1)關系型數據庫
RDBMS比較適合在線事務處理(OLTP)應用。流行的關系型數據庫有Oracle、MSSQL、MariaDB、PostgreSQL等。其中一些傳統數據庫已經存在了幾十年。
許多應用,包括電子商務、銀行業務和酒店預訂,都是由關系型數據庫支持的。關系型數據庫非常擅長處理表之間需要復雜聯合查詢的事務數據。
從事務數據的需求來看,關系型數據庫應該堅持原子性、一致性、隔離性、持久性原則,具體如下:
- 原子性:事務將從頭到尾完全執行,一旦出現錯誤,整個事務將會回滾。
- 一致性:一旦事務完成,所有的數據都要提交到數據庫中。
- 隔離性:要求多個事務能在隔離的情況下同時運行,互不干擾。
- 持久性:在任何中斷(如網絡或電源故障)的情況下,事務應該能夠恢復到最后已知的狀態。
- 通常情況下,關系型數據庫的數據會被轉存到數據倉庫中,用于報表和聚合。
(2)數據倉庫
數據倉庫更適合在線分析處理(OLAP)應用。數據倉庫提供了對海量結構化數據的快速聚合功能。
雖然這些技術(如Amazon Redshift、Netezza和Teradata)旨在快速執行復雜的聚合查詢,但它們并沒有針對大量并發寫入進行過優化。所以,數據需要分批加載,使得倉庫無法在熱數據上提供實時洞察。
現代數據倉庫使用列式存儲來提升查詢性能,例如Amazon Redshift、Snowflake和google Big Query。得益于列式存儲,這些數據倉庫提供了非??斓牟樵兯俣?,提高了I/O效率。
除此之外,Amazon Redshift等數據倉庫系統還通過在多個節點上并行查詢以及大規模并行處理(MPP)來提高查詢性能。
數據倉庫是中央存儲庫,可以存儲來自一個或多個數據庫的累積數據。它們存儲當前和歷史數據,用于創建業務數據的分析報告。
雖然,數據倉庫集中存儲來自多個系統的數據,但它們不能被視為數據湖。數據倉庫只能處理結構化的關系型數據,而數據湖則可以同時處理結構化的關系型數據和非結構化的數據,如JSON、日志和CSV數據。
Amazon Redshift等數據倉庫解決方案可以處理PB級的數據,并提供解耦的計算和存儲功能,以節省成本。
除了列式存儲外,Redshift還使用數據編碼、數據分布和區域映射來提高查詢性能。比較傳統的基于行的數據倉庫解決方案包括Netezza、Teradata和Greenplum。
2、NoSQL數據庫
NoSQL數據庫(如Dynamo DB、Cassandra和Mongo DB)可以解決在關系型數據庫中經常遇到的伸縮和性能挑戰。顧名思義,NoSQL表示非關系型數據庫。NoSQL數據庫儲存的數據沒有明確結構機制連接不同表中的數據(沒有連接、外鍵,也不具備范式)。
NoSQL運用了多種數據模型,包括列式、鍵值、搜索、文檔和圖模型。NoSQL數據庫提供可伸縮的性能、具有高可用性和韌性。
NoSQL通常沒有嚴格的數據庫模式,每條記錄都可以有任意數量的列(屬性),這意味著某一行可以有4列,而同一個表中的另一行可以有10列。分區鍵用于檢索包含相關屬性的值或文檔。
NoSQL數據庫是高度分布式的,可以復制。NoSQL數據庫非常耐用,高可用的同時不會出現性能問題。
SQL數據庫已經存在了幾十年,大多數人可能已經非常熟悉關系型數據庫。我們來看SQL數據庫和NoSQL數據庫之間的一些重大區別(見表1)。
表1 SQL數據庫和NoSQL數據庫的區別
根據數據特點,市面上有各種類別的NoSQL數據存儲來解決特定的問題。我們來看NoSQL數據庫的類型。
3、NoSQL數據庫類型
NoSQL數據庫的主要類型如下:
- 列式數據庫:Apache Cassandra和Apache HBase是流行的列式數據庫。列式數據存儲有助于在查詢數據時掃描某一列,而不是掃描整行。如果物品表有10列100萬行,而你想查詢庫存中某一物品的數量,那么列式數據庫只會將查詢應用于物品數量列,不需要掃描整個表。
- 文檔數據庫:最流行的文檔數據庫有MongoDB、Couchbase、MarkLogic、Dynamo DB和Cassandra??梢允褂梦臋n數據庫來存儲JSON和XML格式的半結構化數據。
- 圖數據庫:流行的圖數據庫包括Amazon Neptune、JanusGraph、TinkerPop、Neo4j、OrientDB、GraphDB和Spark上的GraphX。圖數據庫存儲頂點和頂點之間的鏈接(稱為邊)。圖可以建立在關系型和非關系型數據庫上。
- 內存式鍵值存儲:最流行的內存式鍵值存儲是Redis和Memcached。它們將數據存儲在內存中,用于數據讀取頻率高的場景。應用程序的查詢首先會轉到內存數據庫,如果數據在緩存中可用,則不會沖擊主數據庫。內存數據庫很適合存儲用戶會話信息,這些數據會導致復雜的查詢和頻繁的請求數據,如用戶資料。
NoSQL有很多用例,但要建立數據搜索服務,需要對所有數據建立索引。
4、搜索數據存儲
Elasticsearch是大數據場景(如點擊流和日志分析)最受歡迎的搜索引擎之一。搜索引擎能很好地支持對具有任意數量的屬性(包括字符串令牌)的溫數據進行臨時查詢。Elasticsearch非常流行。一般的二進制或對象存儲適用于非結構化、不可索引和其他沒有專業工具能理解其格式的數據。
Amazon Elasticsearch Service管理Elasticsearch集群,并提供API訪問。它還提供了Kibana作為可視化工具,對Elasticsearch集群中的存儲的索引數據進行搜索。
AWS管理集群的容量、伸縮和補丁,省去了運維開銷。日志搜索和分析是常見的大數據應用場景,Elasticsearch可以幫助你分析來自網站、服務器、物聯網傳感器的日志數據。
Elasticsearch被大量的行業應用使用,如銀行、游戲、營銷、應用監控、廣告技術、欺詐檢測、推薦和物聯網等。
5、非結構化數據存儲
當你有非結構化數據存儲的需求時,Hadoop似乎是一個完美的選擇,因為它是可擴展、可伸縮的,而且非常靈活。它可以運行在消費級設備上,擁有龐大的工具生態,而且運行起來似乎很劃算。
Hadoop采用主節點和子節點模式,數據分布在多個子節點,由主節點協調作業,對數據進行查詢運算。Hadoop系統依托于大規模并行處理(MPP),這使得它可以快速地對各種類型的數據進行查詢,無論是結構化數據還是非結構化數據。
在創建Hadoop集群時,從服務器上創建的每個子節點都會附帶一個稱為本地Hadoop分布式文件系統(HDFS)的磁盤存儲塊。
你可以使用常見的處理框架(如Hive、Ping和Spark)對存儲數據進行查詢。但是,本地磁盤上的數據只在相關實例的生命期內持久化。
如果使用Hadoop的存儲層(即HDFS)來存儲數據,那么存儲與計算將耦合在一起。增加存儲空間意味著必須增加更多的機器,這也會提高計算能力。為了獲得最大的靈活性和最佳成本效益,需要將計算和存儲分開,并將兩者獨立伸縮。
總的來說,對象存儲更適合數據湖,以經濟高效的方式存儲各種數據?;谠朴嬎愕臄祿趯ο蟠鎯Φ闹С窒?,可以靈活地將計算和存儲解耦。
6、數據湖
數據湖是結構化和非結構化數據的集中存儲庫。數據湖正在成為在集中存儲中存儲和分析大量數據的一種流行方式。它按原樣存儲數據,使用開源文件格式來實現直接分析。
由于數據可以按當前格式原樣存儲,因此不需要將數據轉換為預定義的模式,從而提高了數據攝取的速度。如圖1所示,數據湖是企業中所有數據的單一真實來源。
圖1 數據湖的對象存儲
數據湖的好處如下:
- 從各種來源攝取數據:數據湖可以讓你在一個集中的位置存儲和分析來自各種來源(如關系型、非關系型數據庫以及流)的數據,以產生單一的真實來源。它解答了一些問題,例如,為什么數據分布在多個地方?單一真實來源在哪里?
- 采集并高效存儲數據:數據湖可以攝取任何類型的數據,包括半結構化和非結構化數據,不需要任何模式。這就回答了如何從各種來源、各種格式的數據中快速攝取數據,并高效地進行大規模存儲的問題。
- 隨著產生的數據量不斷擴展:數據湖允許你將存儲層和計算層分開,對每個組件分別伸縮。這就回答了如何隨著產生的數據量進行伸縮的問題。
- 將分析方法應用于不同來源的數據:通過數據湖,你可以在讀取時確定數據模式,并對從不同資源收集的數據創建集中的數據目錄。這使你能夠隨時、快速地對數據進行分析。這回答了是否能將多種分析和處理框架應用于相同的數據的問題。
你需要為數據湖提供一個能無限伸縮的數據存儲解決方案。將處理和存儲解耦會帶來巨大的好處,包括能夠使用各種工具處理和分析相同的數據。
雖然這可能需要一個額外的步驟將數據加載到對應工具中,但使用Amazon S3作為中央數據存儲比傳統存儲方案有更多的好處。
數據湖還有其他好處。它能讓你的架構永不過時。假設12個月后,可能會有你想要使用的新技術。因為數據已經存在于數據湖,你可以以最小的開銷將這種新技術插入工作流程中。
通過在大數據處理流水線中構建模塊化系統,將AWS S3等通用對象存儲作為主干,當特定模塊不再適用或有更好的工具時,可以自如地替換。