將數據從 Azure Cosmos DB 內嵌至 Azure 數據總管
Azure 數據總管支援使用變更摘要從適用於 NoSql 的 Azure Cosmos DB 擷取數據。 Cosmos DB 變更摘要數據連線是一個擷取管線,可接聽 Cosmos DB 變更摘要,並將數據內嵌至數據總管數據表。 變更摘要會接聽新的和更新的檔,但不會記錄刪除。 如需 Azure 數據總管中數據擷取的一般資訊,請參閱 Azure 數據總管數據擷取概觀。
每個數據連接都會接聽特定的 Cosmos DB 容器,並將數據內嵌到指定的數據表中(一個以上的連接可以在單一數據表中內嵌)。 擷取方法支援串流擷取(啟用時)和佇列擷取。
在本文中,您將瞭解如何設定 Cosmos DB 變更摘要數據連線,以使用系統受控識別將數據內嵌至 Azure 數據總管。 開始之前,請先檢閱 考慮 事項。
使用下列步驟來設定連接器:
步驟 1: 選擇 Azure 數據總管數據表並設定其數據表對應
步驟 2: 建立 Cosmos DB 數據連線
步驟 3: 測試數據連線
必要條件
建立數據連線之前,請先建立數據表,在其中儲存內嵌的數據,並套用符合來源 Cosmos DB 容器中架構的對應。 如果您的案例需要多個字段的簡單對應,您可以使用 更新原則來轉換和對應從變更摘要擷取的數據 。
以下顯示 Cosmos DB 容器中專案的範例架構:
{
"id": "17313a67-362b-494f-b948-e2a8e95e237e",
"name": "Cousteau",
"_rid": "pL0MAJ0Plo0CAAAAAAAAAA==",
"_self": "dbs/pL0MAA==/colls/pL0MAJ0Plo0=/docs/pL0MAJ0Plo0CAAAAAAAAAA==/",
"_etag": "\"000037fc-0000-0700-0000-626a44110000\"",
"_attachments": "attachments/",
"_ts": 1651131409
}
使用下列步驟建立資料表並套用資料表對應:
在 Azure 數據總管 Web UI 中,從左側導覽功能表中選取 [查詢],然後選取您要在其中建立數據表的資料庫。
執行下列命令以建立名為 TestTable 的數據表。
.create table TestTable(Id:string, Name:string, _ts:long, _timestamp:datetime)
執行下列命令來建立數據表對應。
此命令會將Cosmos DB JSON 檔案中的自訂屬性對應至TestTable資料表中的數據行,如下所示:
Cosmos DB 屬性 |
資料表資料行 |
轉換 |
id |
Id |
無 |
name |
名稱 |
無 |
_ts |
_ts |
無 |
_ts |
_時間戳 |
使用 DateTimeFromUnixSeconds 將_ts (UNIX 秒) 轉換為_timestamp (datetime )) |
注意
我們建議使用下列時間戳數據行:
- _ts:使用此數據行來協調 Cosmos DB 的數據。
- _timestamp:使用此數據行在 Kusto 查詢中執行有效率的時間篩選。 如需詳細資訊,請參閱 查詢最佳做法。
.create table TestTable ingestion json mapping "DocumentMapping"
```
[
{"column":"Id","path":"$.id"},
{"column":"Name","path":"$.name"},
{"column":"_ts","path":"$._ts"},
{"column":"_timestamp","path":"$._ts", "transform":"DateTimeFromUnixSeconds"}
]
```
如果您的案例需要多個字段的簡單對應,您可以使用更新原則來轉換和對應從變更摘要擷取的數據。
更新原則 是將數據擷取到數據表時轉換數據的方式。 它們是以 Kusto 查詢語言 撰寫,並在擷取管線上執行。 它們可用來從 Cosmos DB 變更摘要擷取轉換數據,例如在下列案例中:
- 您的檔案包含數位,如果陣列是使用
mv-expand
運算元在多個數據列中轉換,則比較容易查詢。
- 您要篩選出檔案。 例如,您可以使用 運算符,依類型
where
篩選出檔。
- 您有無法在數據表對應中表示的複雜邏輯。
如需如何建立和管理更新原則的資訊,請參閱 更新原則概觀。
步驟 2:建立 Cosmos DB 數據連線
您可以使用下列方法來建立資料連接器:
在 [Azure 入口網站] 中,移至叢集概觀頁面,然後選取 [開始使用] 索引標籤。
在 [數據擷取] 圖格上,選取 [建立數據連線>Cosmos DB]。
在 [Cosmos DB 建立數據連線 ] 窗格中,以數據表中的資訊填寫表單:
欄位 |
描述 |
資料庫名稱 |
選擇您要在其中內嵌數據的 Azure 數據總管資料庫。 |
數據連線名稱 |
指定數據連線的名稱。 |
訂用帳戶 |
選取包含Cosmos DB NoSQL 帳戶的訂用帳戶。 |
Cosmos DB 帳戶 |
選擇您要從中擷取數據的 Cosmos DB 帳戶。 |
SQL 資料庫 |
選擇您要從中擷取資料的 Cosmos DB 資料庫。 |
SQL 容器 |
選擇您要從中擷取資料的 Cosmos DB 容器。 |
資料表名稱 |
指定要內嵌數據的 Azure 資料 總管資料表名稱 。 |
對應名稱 |
選擇性地指定要 用於數據連線的對應名稱 。 |
或者,在 [ 進階設定 ] 區段下,執行下列動作:
指定事件擷 取開始日期。 這是連接器開始擷取數據的時間。 如果您未指定時間,連接器會從您建立數據連線時開始擷取數據。 建議的日期格式是 ISO 8601 UTC 標準,如下所示: yyyy-MM-ddTHH:mm:ss.fffffffZ
。
選取 [ 用戶指派] ,然後選取身分識別。 根據預設, 聯機會使用系統指派的 受控識別。 如有必要,您可以使用 使用者指派的 身分識別。
選取 [建立 ] 以建立數據連線。
使用下列範例 ARM 範本作為建立您自己的數據連線範本的基礎,然後在 Azure 入口網站 中部署它。
若要設定 Cosmos DB 連線:
設定 Cosmos DB 連線驗證的系統受控識別 。
- 在 Azure 數據總管 Web UI 中,從左側導覽功能表中選取 [查詢 ],然後選取數據連線的叢集或資料庫。
授與數據連線許可權,以存取 Cosmos DB 帳戶。 提供 Cosmos DB 的數據連線存取權,可讓您從資料庫存取和擷取數據。 您將需要叢集的主體標識碼,您可以在 Azure 入口網站 中找到此標識碼。 如需詳細資訊,請參閱 設定叢集的受控識別。
使用下列其中一個選項來授與 Cosmos DB 帳戶的存取權:
使用 Azure CLI 授與存取權:使用下表中的資訊執行 CLI 命令,以適當的值取代佔位元:
az cosmosdb sql role assignment create --account-name <CosmosDbAccountName> --resource-group <CosmosDbResourceGroup> --role-definition-id 00000000-0000-0000-0000-000000000001 --principal-id <ClusterPrincipalId> --scope "/"
az role assignment create --role fbdf93bf-df7d-467e-a4d2-9458aa1360c8 --assignee <ClusterPrincipalId> --scope <CosmosDBAccountResourceId>
預留位置 |
描述 |
<CosmosDBAccountName> |
Cosmos DB 帳戶的名稱。 |
<CosmosDBResourceGroup> |
包含 Cosmos DB 帳戶的資源群組名稱。 |
<CosmosDBAccountResourceId> |
Cosmos DB 帳戶的 Azure 資源識別碼(從 開始 subscriptions/ )。 |
<ClusterPrincipalId> |
指派給叢集之受控識別的主體標識符。 您可以在 Azure 入口網站 中找到叢集的原則標識碼。 如需詳細資訊,請參閱 設定叢集的受控識別。 |
使用 ARM 範本授與存取權:在 Cosmos DB 帳戶資源群組中部署下列範本:
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"clusterPrincipalId": {
"type": "string",
"metadata": { "description": "The principle ID of your cluster." }
},
"cosmosDbAccount": {
"type": "string",
"metadata": { "description": "The name of your Cosmos DB account." }
},
"cosmosDbAccountResourceId": {
"type": "string",
"metadata": { "description": "The resource ID of your Cosmos DB account." }
}
},
"variables": {
"cosmosDataReader": "00000000-0000-0000-0000-000000000001",
"dataRoleDefinitionId": "[format('/subscriptions/{0}/resourceGroups/{1}/providers/Microsoft.DocumentDB/databaseAccounts/{2}/sqlRoleDefinitions/{3}', subscription().subscriptionId, resourceGroup().name, parameters('cosmosDbAccount'), variables('cosmosDataReader'))]",
"roleAssignmentId": "[guid(parameters('cosmosDbAccountResourceId'), parameters('clusterPrincipalId'))]",
"rbacRoleDefinitionId": "[format('/subscriptions/{0}/providers/Microsoft.Authorization/roleDefinitions/{1}', subscription().subscriptionId, 'fbdf93bf-df7d-467e-a4d2-9458aa1360c8')]"
},
"resources": [
{
"type": "Microsoft.DocumentDB/databaseAccounts/sqlRoleAssignments",
"apiVersion": "2022-08-15",
"name": "[concat(parameters('cosmosDbAccount'), '/', guid(parameters('clusterPrincipalId'), parameters('cosmosDbAccount')))]",
"properties": {
"principalId": "[parameters('clusterPrincipalId')]",
"roleDefinitionId": "[variables('dataRoleDefinitionId')]",
"scope": "[resourceId('Microsoft.DocumentDB/databaseAccounts', parameters('cosmosDbAccount'))]"
}
},
{
"type": "Microsoft.Authorization/roleAssignments",
"apiVersion": "2022-04-01",
"name": "[variables('roleAssignmentId')]",
"scope": "[format('Microsoft.DocumentDb/databaseAccounts/{0}', parameters('cosmosDbAccount'))]",
"properties": {
"description": "Giving RBAC reader on Cosmos DB",
"principalId": "[parameters('clusterPrincipalId')]",
"principalType": "ServicePrincipal",
"roleDefinitionId": "[variables('rbacRoleDefinitionId')]"
}
}
]
}
部署下列 ARM 範本以建立 Cosmos DB 數據連線。 將佔位元取代為適當的值。
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"kustoClusterName": {
"type": "string",
"metadata": { "description": "Kusto Cluster name" }
},
"kustoDbName": {
"type": "string",
"metadata": { "description": "Kusto Database name" }
},
"kustoConnectionName": {
"type": "string",
"metadata": { "description": "Kusto Database connection name" }
},
"kustoLocation": {
"type": "string",
"metadata": { "description": "Location (Azure Region) of the Kusto cluster" }
},
"kustoTable": {
"type": "string",
"metadata": { "description": "Kusto Table name where to ingest data" }
},
"kustoMappingRuleName": {
"type": "string",
"defaultValue": "",
"metadata": { "description": "Mapping name of the Kusto Table (if omitted, default mapping is applied)" }
},
"managedIdentityResourceId": {
"type": "string",
"metadata": { "description": "ARM resource ID of the managed identity (cluster resource ID for system or user identity)" }
},
"cosmosDbAccountResourceId": {
"type": "string",
"metadata": { "description": "ARM resource ID of Cosoms DB account" }
},
"cosmosDbDatabase": {
"type": "string",
"metadata": { "description": "Cosmos DB Database name" }
},
"cosmosDbContainer": {
"type": "string",
"metadata": { "description": "Cosmos DB container name" }
},
"retrievalStartDate": {
"type": "string",
"defaultValue": "",
"metadata": { "description": "Date-time at which to start the data retrieval; default: 'now' if not provided. Recommended format: yyyy-MM-ddTHH:mm:ss.fffffffZ" }
}
},
"variables": { },
"resources": [{
"type": "Microsoft.Kusto/Clusters/Databases/DataConnections",
"apiVersion": "2022-11-11",
"name": "[concat(parameters('kustoClusterName'), '/', parameters('kustoDbName'), '/', parameters('kustoConnectionName'))]",
"location": "[parameters('kustoLocation')]",
"kind": "CosmosDb",
"properties": {
"tableName": "[parameters('kustoTable')]",
"mappingRuleName": "[parameters('kustoMappingRuleName')]",
"managedIdentityResourceId": "[parameters('managedIdentityResourceId')]",
"cosmosDbAccountResourceId": "[parameters('cosmosDbAccountResourceId')]",
"cosmosDbDatabase": "[parameters('cosmosDbDatabase')]",
"cosmosDbContainer": "[parameters('cosmosDbContainer')]",
"retrievalStartDate": "[parameters('retrievalStartDate')]"
}
}]
}
步驟 3:測試數據連線
在 Cosmos DB 容器中,插入下列檔:
{
"name":"Cousteau"
}
在 Azure 數據總管 Web UI 中,執行下列查詢:
TestTable
結果集應顯示下列圖片:
注意
Azure 數據總管具有佇列數據擷取的匯總(批處理)原則,其設計目的是優化擷取程式。 默認批處理原則設定為一旦批次的下列其中一個條件成立,就會封存批次:延遲時間上限為 5 分鐘、總大小為 1 GB 或 1000 個 Blob。 因此,您可能會遇到延遲。 如需詳細資訊,請參閱 批處理原則。 若要減少延遲,請將數據表設定為支援串流。 請參閱 串流原則。
考量
下列考慮適用於 Cosmos DB 變更摘要:
變更摘要不會公開 刪除 事件。
Cosmos DB 變更摘要只會包含新的和更新的文件。 如果您需要知道已刪除的文件,可以設定讓摘要使用軟標記,以將 Cosmos DB 文件標示為已刪除。 屬性會新增至更新事件,指出檔是否已刪除。 然後,您可以在查詢中使用 where
運算符來篩選出它們。
例如,如果您將已刪除的屬性對應至名為 IsDeleted 的數據表資料行,您可以使用下列查詢來篩選出已刪除的檔案:
TestTable
| where not(IsDeleted)
變更摘要只會公開 檔的最新 更新。
若要瞭解第二個考慮的影響,請檢查下列案例:
Cosmos DB 容器包含 A 和 B 檔。下表顯示對稱為 foo 之屬性的變更:
文件識別碼 |
屬性 foo |
活動 |
檔案時間戳 (_ts) |
A |
紅色 |
建立 |
10 |
B |
藍色 |
建立 |
20 |
A |
Orange |
更新 |
30 |
A |
粉紅色 |
更新 |
40 |
B |
紫 |
更新 |
50 |
A |
洋紅色 |
更新 |
50 |
B |
NeonBlue |
更新 |
70 |
變更摘要 API 會定期由數據連接器輪詢,通常是每隔幾秒鐘。 每個輪詢都包含在呼叫之間容器中發生的變更, 但每個檔只有最新版本的變更。
為了說明此問題,請考慮具有時間戳 15、35、55 和 75 的 API 呼叫序列,如下表所示:
API 呼叫時間戳 |
文件識別碼 |
屬性 foo |
檔案時間戳 (_ts) |
15 |
A |
紅色 |
10 |
35 |
B |
藍色 |
20 |
35 |
A |
Orange |
30 |
55 |
B |
紫 |
50 |
55 |
A |
洋紅色 |
60 |
75 |
B |
NeonBlue |
70 |
比較 API 結果與 Cosmos DB 檔案中所做的變更清單,您會發現它們不相符。 記錄 A 的更新事件,在時間戳 40 的變更數據表中反白顯示,不會出現在 API 呼叫的結果中。
為了瞭解事件為何未出現,我們將檢查 API 呼叫在時間戳 35 和 55 之間的檔 A 變更。 在這兩個呼叫之間,檔 A 已變更兩次,如下所示:
文件識別碼 |
屬性 foo |
活動 |
檔案時間戳 (_ts) |
A |
粉紅色 |
更新 |
40 |
A |
洋紅色 |
更新 |
50 |
在時間戳 55 進行 API 呼叫時,變更摘要 API 會傳回檔的最新版本。 在此情況下,最新版的檔 A 是時間戳 50 的更新,這是從 Pink 到 Carmine 之屬性 foo 的更新。
由於此案例,數據連接器可能會遺漏一些中繼文件變更。 例如,如果數據連線服務關閉幾分鐘,或文件變更的頻率高於 API 輪詢頻率,可能會遺漏某些事件。 不過,會擷取每個檔的最新狀態。
不支援刪除和重新建立 Cosmos DB 容器
Azure 資料總管會藉由檢查摘要中的「位置」來追蹤變更摘要。 這會在容器的每個實體分割區上使用接續權杖來完成。 刪除/重新建立容器時,這些接續權杖會無效因此不會重設:您必須刪除並重新建立資料連線。
估計成本
使用 Cosmos DB 數據連線對 Cosmos DB 容器 的要求單位 (RU) 使用量有何影響?
連接器會在容器的每個實體分割區上叫用 Cosmos DB 變更摘要 API,最多一秒。 下列成本會與這些調用相關聯:
成本 |
描述 |
固定成本 |
固定成本大約是每秒每個實體分割區 2 個 RU。 |
變動成本 |
可變成本大約是用來撰寫檔的 RU 的 2%,但視您的案例而定,這可能會有所不同。 例如,如果您將 100 份檔寫入 Cosmos DB 容器,則撰寫這些檔的成本為 1,000 RU。 使用連接器讀取這些文件的對應成本約為寫入成本的 2%,大約是 20 個 RU。 |
相關內容