數據湖倉
自從Databricks提出Lakehouse后,同時Snowflake的上市,湖倉一體成為數據領域最火熱的話題。
https://databricks.com/blog/2020/01/30/what-is-a-data-lakehouse.html
核心的理念是Delta Lake使Hadoop有了ACID事務能力,使用Spark內存做實時,批,AI計算層。
這樣就可以用分布式文件存儲顛覆關系數據庫存儲。
數據倉庫
數倉一直有3種類型,概念上和物理上:
一體機 |
Oracle Exadata,Teradata |
價格,軟硬件無法解耦 |
MPP |
Greenplum |
數據分片始終會遇到數據傾斜問題 |
數據庫 |
Oracle,SQL Server |
100T以下容量數倉,使用列存儲索引 |
//Snowflake是介於一體機和MPP之間的一種
//Hive沒有事務,不支持update
數倉&BI架構
數據湖倉定義
數據湖倉庫可以分解為兩種類型的架構:
第一種是數據湖(以使用讀取存儲模式的形式),稱之為NOEDW,
第二種數據湖和關系數據庫(以企業數據倉庫或 EDW 的形式),將稱之為ProEDW
對於 NoEDW,我的思維過程是,如果您試圖使數據湖像關系數據庫一樣工作,為什么不只使用關系數據庫呢?然后讓數據湖做它擅長的事情, 關系數據庫做它擅長的事情?
將關系數據庫納入數據湖倉的額外成本、復雜性和價值時間是值得的,原因有很多,其中之一是關系數據庫將元數據與數據相結合,與在許多情況下元數據與數據分離的數據湖相比,自助 BI 更容易。當您處理來自許多不同來源的數據時,這種情況變得更加明顯。
https://www.jamesserra.com/archive/2021/01/data-lakehouse-defined/
這篇blog很好的解析了數據湖倉概念。
很多家廠商在提湖倉一體的產品,主要是4種開源組合:
- Hadoop(Hudi)-存儲
- Presto做虛擬連接-聯邦查詢
- Spark內存計算-ETL
- PostgreSQL MPP-數據集市
Azure Synapse Analytics Serverless
目前最成熟的商業產品就是Azure Synapse Analytics
- MPP數倉和無服務器SQL
- 用於大數據的Databricks/Spark
- Low/No Code的ETL/ELT數據編排
- 一站式Web開發環境
- 與 Power BI、CosmosDB 和 AzureML等深度集成
功能有很多就不展開介紹了,這次只談Azure Synapse Analytics Serverless,核心有2點:
- 用戶界面就是SQL Server
- 使用T-SQL查詢對象存儲文件
https://docs.microsoft.com/zh-cn/azure/synapse-analytics/sql/on-demand-workspace-overview
另外支持Azure Cosmos DB做HTAP
https://docs.microsoft.com/zh-cn/azure/cosmos-db/synapse-link
使用場景
- 數據湖探索 - 快速探索 Data Lake 中各種格式(Parquet、CSV、JSON)的數據。
- 邏輯數據倉庫 – 基於原始數據提供關系抽象,而無需重新轉換數據。
- 數據轉換 - 使用 T-SQL 以簡單、可縮放且高效的方式轉換 Data Lake 中的數據,以便可將數據推送到 BI 和其他工具,存儲到關系數據庫。
用戶角色
- 數據工程師: 轉換和准備數據,簡化ETL/ELT數據集成管道
- 數據科學家: 快速使用數據湖的內容做AI和機器學習
- 數據分析師: 使用熟悉的 T-SQL,Spark查詢和分析數據
- BI專業人員: 快速基於數據湖中的數據創建 Power BI報表
用法
查詢外部文件
Azure Data Lake在對象存儲的基礎上增加了文件層級目錄結構,面向大數據分析優化。
https://docs.microsoft.com/zh-cn/azure/synapse-analytics/sql/query-data-storage
視圖
外表
查詢結果導出
復雜查詢
/*分頁查詢*/ select countries_and_territories, year, month, day, cases from openrowset( bulk 'https://pandemicdatalake.blob.core.windows.net/public/curated/covid-19/ecdc_cases/latest/ecdc_cases.parquet', format = 'parquet') as rows order by year, month, day OFFSET 30 ROWS FETCH NEXT 10 ROWS ONLY; /*字符組合*/ select top 10 geo_id, year, month, cases = '{' + string_agg(concat('"',day,'":',cases), ',') within group (order by day asc) + '}' from openrowset( bulk 'https://pandemicdatalake.blob.core.windows.net/public/curated/covid-19/ecdc_cases/latest/ecdc_cases.parquet', format = 'parquet') as rows group by geo_id, year, month; /*透視*/ with cases as ( select countries_and_territories, year, month, day, cases from openrowset( bulk 'https://pandemicdatalake.blob.core.windows.net/public/curated/covid-19/ecdc_cases/latest/ecdc_cases.parquet', format = 'parquet') as rows ) select top 10 * from cases PIVOT ( SUM (cases) FOR day IN ( [1], [2], [3], [4], [5], [6], [7]) ) AS months
/*逆透視*/ with cases as ( select countries_and_territories, year, month, day, cases, deaths from openrowset( bulk 'https://pandemicdatalake.blob.core.windows.net/public/curated/covid-19/ecdc_cases/latest/ecdc_cases.parquet', format = 'parquet') as rows where continent_exp = 'Europe' and year = 2020 ) select top 100 countries_and_territories, year, month, day, property, value from cases UNPIVOT ( value FOR property IN ( [cases], [deaths] ) ) AS unpivoted /*會話上下文*/ CREATE OR ALTER VIEW cases AS SELECT * FROM openrowset( bulk 'https://pandemicdatalake.blob.core.windows.net/public/curated/covid-19/ecdc_cases/latest/ecdc_cases.parquet', format = 'parquet') as rows WHERE continent_exp = CAST(SESSION_CONTEXT(N'continent') AS VARCHAR(8000)) exec sp_set_session_context 'continent', 'Europe'; SELECT TOP 10 * FROM cases
缺點
不支持緩存,不支持查詢Azure SQL/PostgreSQL/SQL DW
//估計今年會支持這2大特性
Power BI組合
由於是按查詢量計費,目前版本沒有緩存,不適合高頻查詢。將數據全加載在Power BI內存模型,Power BI訪問是按用戶計費,可以無限查詢訪問,剛好解決此問題,定時刷新報告即可。還可利用Power BI的聚合表,復合模型特性功能。
聚合表
https://docs.microsoft.com/zh-cn/power-bi/transform-model/desktop-aggregations
復合模型
Power BI本身可以直接查詢Azure Data Lake,不需要通過Azure Synapse Analytics Serverless,兩者的比較可以查看相關文章。
- 推薦使用Parquet,支持下壓
- 直接查詢Serverless沒有速度優勢
- 在有轉換邏輯下有query folding情況下Serverless會更快
https://datamonkeysite.com/2021/01/07/pushdown-filters-in-synapse-serverless-from-powerbi/
另外Power BI已支持Parquet文件。
SSAS組合
SSAS模型中表的不同分區可以是不同數據源,做冷熱分離。
Azure SQL組合
有許多情況下,您可能需要從 Azure SQL 數據庫訪問放置在 Azure 數據湖上的外部數據,但Azure SQL目前不支持Polybase虛擬化查詢外表(SQL Server可以)。可以通過Synapse Analytics Serverless間接實現。
/*Synapse中創建外表*/ CREATE EXTERNAL TABLE csv.YellowTaxi ( pickup_datetime DATETIME2, dropoff_datetime DATETIME2, passenger_count INT, ... ) WITH ( data_source= MyAdls, location = '/**/*.parquet', file_format = ParquetFormat); /*Azure SQL中建外部數據源*/ CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'put some strong password here'; GO CREATE DATABASE SCOPED CREDENTIAL SynapseSqlCredential WITH IDENTITY = '<synapse sql username>', SECRET = '<synapse sql password>'; GO CREATE EXTERNAL DATA SOURCE SynapseSqlDataSource WITH ( TYPE = RDBMS, LOCATION = '<synapse workspace>-ondemand.sql.azuresynapse.net', DATABASE_NAME = 'SampleDB', CREDENTIAL = SynapseSqlCredential ); GO /*Azure SQL中建Synapse外表*/ CREATE SCHEMA csv; GO CREATE EXTERNAL TABLE csv.YellowTaxi( vendor_id VARCHAR(100) COLLATE Latin1_General_BIN2, pickup_datetime DATETIME2, dropoff_datetime DATETIME2, passenger_count INT, trip_distance FLOAT, rate_code INT, store_and_fwd_flag VARCHAR(100) COLLATE Latin1_General_BIN2, pickup_location_id INT, dropoff_location_id INT, payment_type INT, fare_amount FLOAT, extra FLOAT, mta_tax FLOAT, tip_amount FLOAT, tolls_amount FLOAT, improvement_surcharge FLOAT, total_amount FLOAT ) WITH ( DATA_SOURCE = SynapseSqlDataSource );
https://devblogs.microsoft.com/azure-sql/read-azure-storage-files-using-synapse-sql-external-tables/
MPP始終會遇到數據傾斜問題,當前大部分關系數據庫已經支持列存儲,是否需要MPP數倉值得考慮。使用大數據Kimball模式,數據湖+數據集市。
Synapse Analytics Serverless+Azure SQL(列存儲表)就是此模式。SQL Server 2019的列存儲表已經非常完美。
- 對象存儲或Hive做ODS層,歸檔區
- 關系數據庫做數倉
學習材料
Azure Synapse Analytics默認開通服務器版本,不使用MPP SQL的情況下費用很低,推薦大家去體驗下,下面連接是官方學習課程。
Data Mesh
同時還有另外一種數據概念,數據網格,由Thoughtworks提出。可以查看這篇博客文章
https://www.jamesserra.com/archive/2021/02/data-mesh/
- Synapse serverless跨庫查詢Azure Data Lake
官方案例
https://azure.microsoft.com/zh-cn/blog/4-common-analytics-scenarios-to-build-business-agility/