適用於 Azure Cosmos DB 的 Azure Synapse Link 中的自訂資料分割

適用於:NoSQL MongoDB Gremlin

自訂資料分割可讓您依照欄位來分割分析存放區資料,這些欄位通常會在分析查詢中用來作為篩選條件,進而改善查詢效能。

在本文中,您會了解如何使用對分析工作負載而言很重要的索引鍵,在 Azure Cosmos DB 分析存放區中分割資料。 此外,文中也會說明如何善加利用因為分割區剪除而提升的查詢效能。 您還會了解工作負載有大量更新或刪除時,自訂資料分割如何提升查詢效能。

注意

Azure Cosmos DB 帳戶和容器應該已啟用 Azure Synapse Link,才能利用自訂資料分割。

如何運作?

分析存放區的資料分割與交易式存放區中的資料分割無關。 預設不會分割分析存放區。 如果您想要根據各種欄位 (例如日期、時間、類別等) 頻繁地查詢分析存放區,則可以使用自訂資料分割,以根據這些索引鍵個別建立經過分割的存放區。 您可以從資料集選擇單一欄位或一組欄位來作為分析存放區的分割區索引鍵。

您可以使用 Azure Synapse Link,從 Azure Synapse Spark 筆記本觸發資料分割。 您可以將其排程為以背景作業執行 (一天一次或兩次,但也可以視需要更頻繁地執行)。

注意

經過分割的存放區會指向與 Azure Synapse 工作區連結的 ADLS Gen2 主要儲存體帳戶。

Architecture of partitioned store in Azure Synapse Link for Azure Cosmos DB

經過分割的存放區會包含截至上次執行分割作業的時間戳記為止的 Azure Cosmos DB 分析資料。 當您使用分割區索引鍵篩選來查詢分析資料時,Synapse Link 會自動合併經過分割的存放區資料與分析存放區中的最新變更。 如此一來,您就能獲得最新的查詢結果。 雖然其會在查詢前合併資料,但差異的部分並不會寫回到經過分割的存放區。 當分析存放區和經過分割的存放區所含的資料差異變大,針對經過分割的資料來進行查詢時,所需的時間可能會發生變化。 更頻繁地觸發資料分割作業會減少此差異。 每次執行分割作業時,都只會處理分析存放區中的增量變更,而不會處理整個資料集。

使用時機

在 Azure Cosmos DB 中查詢分析資料時,可選擇是否使用經過分割的存放區。 您可以使用 Synapse Link 與現有的分析存放區,直接查詢相同的資料。 如果您有下列需求,則可以開啟經過分割的存放區:

  • 可作為分割區資料行的通用分析查詢篩選條件
  • 低基數分割區資料行
  • 分割區資料行會將資料平均分散到各個分割區
  • 大量的更新或刪除作業
  • 資料擷取緩慢

如果您要使用與分割區索引鍵不同的查詢篩選來查詢即時資料,則建議您直接查詢分析存放區。

福利

減少分割區剪除所引發的資料掃描

由於對應到每個唯一分割區索引鍵的資料都會共置於經過分割的存放區中,因此當您使用分割區索引鍵作為查詢篩選條件時,便會在執行查詢時剪除基礎資料,並只掃描所需的資料。 由於掃描的資料有限,因此資料分割剪除可提升分析查詢效能。

可彈性地分割分析資料

您可以為給定的分析存放區容器準備多個資料分割策略。 您可以根據查詢需求,使用複合或個別的分割區索引鍵。

查詢效能的提升

除了分割區剪除所帶來的查詢效能提升外,自訂資料分割也會導致下列工作負載的查詢效能有所提升:

  • 更新/刪除大量的工作負載 - 經過分割的存放區不會在分析存放區中追蹤記錄的多個版本並在每次執行查詢時加以載入,而是只會包含最新版本的資料。 當您有更新/刪除大量工作負載時,此功能可大幅提升查詢效能。

  • 資料擷取速度緩慢的工作負載 - 資料分割可壓縮分析資料,因此,如果您的工作負載有速度緩慢的資料擷取作業,此壓縮功能可提升查詢效能

交易保證

請務必注意,自訂資料分割可確保完整的交易保證。 正在執行資料分割時,不會封鎖查詢路徑。 每個查詢執行都會從上一次成功的資料分割讀取經過分割的資料。 其會讀取分析存放區中的最新資料,確保查詢一律會傳回使用經過分割的存放區時可用的最新資料。

安全性

如果您已針對分析存放區設定受控私人端點,則建議也針對經過分割的存放區新增受控私人端點。 經過分割的存放區是與 Synapse 工作區相關聯的主要儲存體帳戶。

同樣地,如果您已在分析存放區上設定客戶自控金鑰,則也必須在 Synapse 工作區的主要儲存體帳戶 (也就是經過分割的存放區) 上直接予以啟用。

資料分割策略

您可以針對分析資料使用一或多個分割區索引鍵。 如果您要使用多個分割區索引鍵,則以下是有關如何分割資料的一些建議:

  • 使用複合索引鍵:

    假設您想要根據 Key1 和 Key2 頻繁地進行查詢。

    例如,「查詢 ReadDate = ‘2021-10-08’ 且 Location = ‘Sydney’ 的所有記錄」。

    在此情況下,使用複合索引鍵更有效率地查閱符合 ReadDate 的所有記錄,以及符合該 ReadDate 中 Location 的記錄。

    樣本設定選項:

    .option("spark.cosmos.asns.partition.keys", "ReadDate String, Location String") \
    .option("spark.cosmos.asns.basePath", "/mnt/CosmosDBPartitionedStore/") \
    

    現在可以根據 "Location" 篩選進行查詢:

    • 您可以直接查詢分析存放區。 經過分割的存放區會先依 ReadDate、再依 Location 來掃描所有記錄。 因此,視工作負載以及分析資料的基數而定,您可以藉由直接查詢分析存放區而獲得更好的結果。
    • 您還可以執行另一個分割作業,也根據同一個經過分割的存放區上的「Location」進行分割。
  • 個別使用多個索引鍵:

    假設您想要有時根據「ReadDate」、有時根據「Location」來頻繁地進行查詢。

    例如,

    • 查詢 ReadDate =「2021-10-08」的所有記錄
    • 查詢 Location =「Sydney」的所有記錄

    針對此情節,需要執行兩個具有下面所定義分割區索引鍵的分割作業:

    作業 1:

    .option("spark.cosmos.asns.partition.keys", "ReadDate String") \
    .option("spark.cosmos.asns.basePath", "/mnt/CosmosDBPartitionedStore/") \
    

    作業 2:

    .option("spark.cosmos.asns.partition.keys", "Location String") \
    .option("spark.cosmos.asns.basePath", "/mnt/CosmosDBPartitionedStore/") \
    

    請注意,在上面的資料分割上,現在同時根據 "ReadDate" 和 "Location" 篩選來頻繁地進行查詢就不是很有效率了。 在該情況下,複合索引鍵可提供更好的查詢效能。

限制

  • 自訂資料分割僅適用於 Azure Synapse Spark。 無伺服器 SQL 集區目前不支援自訂資料分割。

  • 經過分割的存放區目前只能指向與 Synapse 工作區相關聯的主要儲存體帳戶。 目前不支援選取自訂儲存體帳戶。

  • 自訂資料分割僅適用於 Azure Cosmos DB 中的 API for NoSQL。 API for MongoDB、Gremlin 和 Cassandra 目前處於預覽狀態。

定價

除了 Azure Synapse Link 價格之外,使用自訂資料分割時還會產生下列費用:

  • 在分析存放區上執行資料分割作業時,必須針對 Synapse Apache Spark 集區的使用量支付費用

  • 經過分割的資料會儲存在與 Azure Synapse Analytics 工作區相關聯的主要 Azure Data Lake Storage Gen2 帳戶中。 您會產生與使用 ADLS Gen2 儲存體和交易相關聯的費用。 這些費用分別取決於經過分割的分析資料所需的儲存體,以及針對 Synapse 中的分析查詢所處理的資料。 如需定價的詳細資訊,請造訪 Azure Data Lake Storage 定價頁面

常見問題集

應該以何種頻率執行自訂的資料分割作業?

有幾個因素 (例如增量資料量、查詢延遲需求等) 會決定該以何種頻率執行自訂的資料分割作業。 可以一天執行一次,也可以每隔幾小時就執行一次。 如果傳入的資料量很大,預期的查詢延遲很低,則可以將資料分割作業排程為更頻繁地執行。 您也必須先在分析存放區中累積增量資料,分割區剪除才會有效。

資料分割作業正在執行時,查詢結果中是否會包含最新的資料?

是,自訂資料分割可提供完整的交易保證。 因此,任何時間點的查詢結果都會合併現有經過分割的資料與末尾的資料 (末尾資料會傳回最新的分析存放區資料集)。

自訂資料分割是否可以在 Azure Synapse Analytics 上使用連結服務驗證?

是,連結服務驗證可用於分析存放區資料分割。

我可以在以後變更給定容器的分割區索引鍵嗎?

是,您可以變更給定容器的分割區索引鍵,新的分割區索引鍵定義會建立新的經過分割的存放區。

注意

分割區索引鍵定義是經過分割的存放區路徑的一部分。

不同的分割區索引鍵是否可以指向相同的 BasePath?

是,您可以在相同的經過分割的存放區上指定多個分割區索引鍵,如下所示:

.option("spark.cosmos.asns.partition.keys", "ReadDate String, Location String") \
.option("spark.cosmos.asns.basePath", "/mnt/CosmosDBPartitionedStore/") \

下一步

若要深入了解,請參閱下列文件: