資料流程圖是一種可配置的管線,會在資料在 Azure IoT 操作 中處理。 標準 的資料流程 遵循固定的豐富、篩選、映射序列,但資料流程圖則允許你以任意順序組合轉換、分支成平行路徑,並依時間窗彙整資料。
DataflowGraph Kubernetes 的自訂資源定義了一個資料流程圖。 在資源內部,你會將來源、轉換和目的地連接起來,建立符合你情境的處理流程。
這很重要
目前資料流程圖僅支援 MQTT、Kafka 及 OpenTelemetry 端點。 其他端點類型如 資料湖、Microsoft Fabric OneLake、Azure Data Explorer 及本地儲存則不被支援。
資料流與資料流圖的比較
Azure IoT 操作 提供兩種處理管線資料的方式:
| 能力 | 數據流 | 資料流程圖 |
|---|---|---|
| 管線形狀 | 固定:增強、篩選、映射 | 彈性:任何順序、分支、合併 |
| 轉換類型 | 映射、篩選、增強 | 映射、篩選、分支、串接、視窗化、節流、擴充 |
| 基於時間的聚合 | 無法提供 | 使用輪轉視窗的視窗轉換 |
| 條件路由 | 無法提供 | 分支與串接轉換 |
| 端點支援 | 所有端點類型 | 僅限 MQTT、Kafka 和 OpenTelemetry |
對於使用支援端點類型的新專案,我們建議使用資料流程圖。 資料流在所有情境中始終全面提供支援,並支援端點類型的完整範圍。
可用的變換
每個轉換都是預先建置的處理步驟,你可以用規則配置,並與資源內 DataflowGraph 的其他轉換串連起來。
| 轉換 | 成品 | 說明 |
|---|---|---|
| 地圖 | azureiotoperations/graph-dataflow-map:1.0.0 |
重新命名、重組、計算及複製欄位。 |
| 篩選 | azureiotoperations/graph-dataflow-filter:1.0.0 |
捨棄符合條件的訊息。 |
| 分支 | azureiotoperations/graph-dataflow-branch:1.0.0 |
根據條件將每個訊息路由到 true 一個或 false 路徑。 |
| Concatenate | azureiotoperations/graph-dataflow-concatenate:1.0.0 |
將兩條或以上路徑合併回一條。 |
| 窗 | azureiotoperations/graph-dataflow-window:1.0.0 |
在一段時間內收集訊息,然後彙整。 |
| 節流 | azureiotoperations/graph-dataflow-throttle:1.0.0 |
限制每個 MQTT 主題模式的訊息速率。 |
所有轉換都共享一種用於運算子、函數和欄位參考的表達式語言。 您也可以在對應、篩選和分支轉換中,使用來自狀態存放區的外部資料來擴充訊息。
Tip
表達式使用位置變數,因此 $1 是第一個輸入, $2 是第二個,依此類推。
Expressions 參考資料列出了內建函式,如 cToF 和 涵蓋所有可用於轉換的運算子、函數及元資料欄位。
資料流程圖中轉換的組合方式
轉換在資源 DataflowGraph 內依序連接:來源端 > 轉換 A > 轉換 B > ... > 目的端。
分支轉換將流程分割成平行路徑,而串接轉換則將它們合併回來。
你可以以任意順序串接任意數量的轉換。 只包含單一 map 轉換的管線,和先篩選、分支、對每個路徑以不同方式對應、再合併,最後在時間視窗上彙總的管線一樣有效。
資料流程圖配置的運作方式
資料流程圖中的每個轉換都參考一個從容器登錄檔拉取的預先建構工件。 你透過圖表資源的 configuration 區段以 JSON 傳遞規則來配置轉換。
當你部署 Azure IoT 操作 時,它會自動建立一個預設登錄端點,名稱default為 mcr.microsoft.com。 內建轉換會使用此端點,從 Microsoft Container Registry 提取成品。 你不需要額外的登錄檔設定。
資料流程圖資源定義了三種元素——來源、一個或多個轉換(每個轉換點為 nodeType: Graph),以及一個目的地——以及一組 nodeConnections 描述資料如何在它們之間流動的元素。 每個轉換 configuration 都會以 JSON 字串的形式在鍵下 rules 傳遞規則。
若要參考完整且可執行的範例,能讀取溫度資料,將攝氏轉換為華氏度並透過地圖轉換,並發布結果——在 Operations 體驗、Azure CLI、Bicep 與 Kubernetes 中——請參見建立資料流程圖。 在接下來的操作指南文章中,範例會聚焦於轉換規則本身。
在節點連接上配置結構
資料流程圖處理結構的方式與資料流不同。 您不是在來源或轉換上設定結構描述,而是在圖表中各節點之間的節點連線上設定結構描述。 分支與過濾器轉換可選擇性地驗證執行時資料與連接節點連接的結構。
陣列中的nodeConnections每個項目都可以在連接的側邊包含 。schemafrom 此結構描述了這兩個節點之間資料流動的預期格式:
nodeConnections: [
{
from: {
name: 'source'
schema: {
schemaRef: 'aio-sr://my-namespace/sensor-data:1'
serializationFormat: 'Json'
}
}
to: {
name: 'transform'
}
}
]
該 schemaRef 值使用格式, aio-sr://<namespace>/<name>:<version> 並指向儲存在 結構登錄檔中的結構。 由於資料流程圖僅支援 MQTT、Kafka 和 OpenTelemetry 端點,因此支援的序列化格式為 Json。
下表總結了資料流與資料流圖間結構配置的差異:
| 層面 | 數據流 | 資料流程圖 |
|---|---|---|
| 架構位置 | 關於源(sourceSettings.schemaRef)與轉換(builtInTransformationSettings.schemaRef) |
節點連接(nodeConnections[].from.schema) |
| 支援的目的地格式 | JSON, Parquet, Delta | JSON |
| 執行階段驗證 | 不支援原始碼結構 | 節點連接時可選,透過分支與濾波器轉換 |
Note
對於資料流程圖,儘管 REST API 參考文件中列出的格式,但目前 JSON 是唯一支援的目的地格式。
關於訊息結構的定義、格式以及如何上傳結構,請參見「了解訊息結構」。
內建轉換與 WASM 轉換
資料流程圖支援兩種轉換:
- 內建轉換由 Microsoft 預先建置(map、filter、branch、concatenate、window、throttle)。 你用規則來設定它們。 不需要寫程式。
- WASM 轉換 是開發者自行建置與部署的自訂 WebAssembly 模組。 當你需要內建轉換無法涵蓋的邏輯時,使用它們。
這兩種轉換都運行在同一 DataflowGraph 個資源中,你可以在同一條管線中混合使用。 關於建置與部署自訂轉換的資訊,請參見 「在資料流程圖中使用 WASM 轉換」。
資料流圖中的錯誤處理
當轉換在處理訊息時遇到錯誤(例如缺少欄位或無效表達式),轉換會丟棄該訊息並記錄錯誤。 管線會持續處理後續訊息。
處理錯誤的常見原因:
- 規則
inputs中引用的欄位在訊息中不存在。 - 濾波器或分支表達式會回傳非布林值。
- 表達式會參考不相容的資料型別(例如算術中的 JSON 物件)。
- 用於擴充的狀態存放區無法連線。
若要監視處理錯誤,請檢查資料流圖的 Pod 記錄,或使用計量端點。 欲了解更多資訊,請參閱 「配置可觀察性與監控」。
有狀態圖的縮放限制
這很重要
視窗與油門轉換是 有狀態的。 每個實例都維持自己的狀態,實例之間不會共享這個狀態。 當資料流剖面 實例數 大於一時, 共享訂閱 會在實例間分配訊息,因此每個實例只看到訊息的子集。 視窗 轉換會 計算部分資料集上的平均值、求和值和計數等彙總值,而 節流 轉換則在每個實例中獨立強制執行設定速率限制,而非整個管線。
將任何使用視窗或油門轉換的資料流量圖,將資料流剖面實例計數設 為 1 。 僅使用映射、篩選、分支及串接轉換的無狀態資料流圖,可以安全地使用更高的實例數量來提升吞吐量。
資料流程圖的效能指引
管線中的每個轉換都會增加處理負荷。 請記住以下指引:
- 偏好較少的變身和更多規則。 如果你有許多轉換規則都在同一結構上,建議把它們放在同一張地圖轉換裡,而不是為每條規則分別建立不同的轉換。
- 當邏輯明確區分時,請使用多個轉換。 當不同的處理步驟根本不同(過濾、映射、聚合)時,分開轉換是有意義的。
- 請將相關規則放在一起。 單一映射轉換可同時處理欄位重命名、重組、計算欄位及元資料轉換。