Azure Synapse Analytics Serverless


數據湖倉

自從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架構

 

https://docs.microsoft.com/en-us/power-bi/guidance/center-of-excellence-business-intelligence-solution-architecture

 

數據湖倉定義

數據湖倉庫可以分解為兩種類型的架構:

第一種是數據湖(以使用讀取存儲模式的形式),稱之為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

 

 

PPT

 

使用場景

  • 數據湖探索 - 快速探索 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

https://techcommunity.microsoft.com/t5/blogs/blogarticleprintpage/blog-id/AzureSynapseAnalyticsBlog/article-id/175

缺點

不支持緩存,不支持查詢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

復合模型

https://docs.microsoft.com/zh-cn/power-bi/connect-data/desktop-directquery-datasets-azure-analysis-services

 Power BI本身可以直接查詢Azure Data Lake,不需要通過Azure Synapse Analytics Serverless,兩者的比較可以查看相關文章。

  • 推薦使用Parquet,支持下壓
  • 直接查詢Serverless沒有速度優勢
  • 在有轉換邏輯下有query folding情況下Serverless會更快

https://blog.crossjoin.co.uk/2021/01/24/comparing-the-performance-of-importing-data-into-power-bi-from-adlsgen2-direct-and-via-azure-synapse-analytics-serverless/

https://blog.crossjoin.co.uk/2021/01/31/comparing-the-performance-of-importing-data-into-power-bi-from-adlsgen2-direct-and-via-azure-synapse-analytics-serverless-part-2-transformations/

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的情況下費用很低,推薦大家去體驗下,下面連接是官方學習課程。

https://docs.microsoft.com/zh-cn/learn/paths/build-data-analytics-solutions-using-azure-synapse-serverless-sql-pools/

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/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM