共用方式為


串流分析的 Azure Blob 儲存體 和 Data Lake Storage Gen2 輸出

Azure Data Lake Storage Gen2 Azure 儲存體 在 Azure 上建置企業數據湖的基礎。 Data Lake Storage Gen2 的設計目的是為了服務數 PB 的資訊,同時維持數百 GB 的輸送量。 您可以使用它輕鬆地管理大量數據。 Data Lake Storage Gen2 的基本部分是將階層命名空間新增至 Azure Blob 儲存體。

Blob 記憶體提供符合成本效益且可調整的解決方案,可將大量的非結構化數據儲存在雲端中。 如需 Blob 記憶體及其用法的簡介,請參閱上傳、下載及列出具有 Azure 入口網站 的 Blob。

注意

如需 Avro 和 Parquet 格式特定行為的相關信息,請參閱概觀中的相關章節。

輸出設定

下表列出建立 Blob 或 Data Lake Storage Gen2 輸出的屬性名稱及其描述。

屬性名稱 描述
輸出別名 查詢中用來將查詢輸出導向至此 Blob 的易記名稱。
儲存體帳戶 您傳送輸出的儲存體帳戶名稱。
儲存體帳戶金鑰 與儲存體帳戶相關聯的密碼金鑰。
容器 儲存在 Blob 記憶體中的 Blob 邏輯群組。 當您將 blob 上傳至 Blob 儲存體時,必須指定該 blob 的容器。

動態容器名稱是選擇性的。 它只支援容器名稱中的一個和一個動態 {field} 。 欄位必須存在於輸出數據中,並遵循 容器名稱原則

欄位資料類型必須是 string。 若要使用多個動態欄位或結合靜態文字與動態欄位,您可以在查詢中使用內建字串函式來定義它,例如 CONCATLTRIM
事件序列化格式 輸出資料的序列化格式。 支援 JSON、CSV、Avro 和 Parquet。 Delta Lake 會列為這裡的選項。 如果已選取 Delta Lake,則資料會處於 Parquet 格式。 深入瞭解 Delta Lake
Delta 路徑名稱 當事件串行化格式為 Delta Lake 時需要。 用來在指定容器內寫入 Delta Lake 數據表的路徑。 其包含資料表名稱。 如需詳細資訊和範例,請參閱 寫入 Delta Lake 數據表
寫入模式 寫入模式會控制 Azure 串流分析寫入輸出檔案的方式。 只有在寫入模式為 [一次] 時,才會進行一次傳遞。 如需詳細資訊,請參閱一節。
資料分割資料行 選擇性。 要 {field} 分割之輸出數據的名稱。 僅支援一個分割區資料行。
路徑模式 當事件串行化格式為 Delta Lake 時需要。 用來在指定容器中寫入 Blob 的檔案路徑模式。

在路徑模式中,您可以選擇使用日期和時間變數的一或多個實例來指定寫入 Blob 的頻率: {date}{time}

如果您的寫入模式為 [一次],您必須同時使用 {date}{time}

您可以使用自定義 Blob 分割,從事件資料指定一個自定義 {field} 名稱來分割 Blob。 欄位名稱是英數字元,可以包含空格、連字號和底線。 自訂欄位的限制包含下列各項:
  • 如果您的寫入模式為 [一次],則不允許動態自定義 {field} 名稱。
  • 功能變數名稱不區分大小寫。 例如,服務無法區分資料列 ID 和資料列 id
  • 不允許使用巢狀欄位。 改為在作業查詢中使用別名來「壓平」欄位。
  • 運算式不能作為欄位名稱使用。

這項功能允許在路徑中使用自訂日期/時間格式的指定名稱設定。 自訂日期/時間格式必須一次指定一個,並以 關鍵詞括 {datetime:\<specifier>} 住。 允許輸入為、、、、ddMdHHH、、mm、、msssMMyyyy\<specifier> {datetime:\<specifier>}關鍵詞可以在路徑中多次使用,以形成自定義日期/時間組態。

例如:
  • 範例 1:cluster1/logs/{date}/{time}
  • 範例 2:cluster1/logs/{date}
  • 範例 3:cluster1/{client_id}/{date}/{time}
  • 範例 4: cluster1/{datetime:ss}/{myField} 查詢所在的位置 SELECT data.myField AS myField FROM Input;
  • 範例 5: cluster1/year={datetime:yyyy}/month={datetime:MM}/day={datetime:dd}

所建立資料夾結構的時間戳記遵循 UTC 而非當地時間。 System.Timestamp 是用於所有以時間為基礎的數據分割的時間。

檔案命名會使用下列慣例:

{Path Prefix Pattern}/schemaHashcode_Guid_Number.extension

在這裡, Guid 代表指派給內部寫入器的唯一標識符,該寫入器會寫入 Blob 檔案。 數位代表 Blob 區塊的索引。

範例輸出檔案︰
  • Myoutput/20170901/00/45434_gguid_1.csv
  • Myoutput/20170901/01/45434_gguid_1.csv

如需有關這項功能的詳細資訊,請參閱 Azure 串流分析自訂 Blob 輸出資料分割
日期格式 當事件串行化格式為 Delta Lake 時需要。 如果前置詞路徑中使用日期權杖,您可以選取組織檔案要用的日期格式。 例如 YYYY/MM/DD
時間格式 當事件串行化格式為 Delta Lake 時需要。 如果前置詞路徑中使用時間權杖,請指定組織檔案要用的時間格式。
資料列下限 這是每一批次中的資料列數目下限。 針對 Parquet,每個批次都會建立新的檔案。 目前的預設值為 2,000 個資料列,允許的上限為 10,000 個資料列。
時間上限 每個批次的等候時間上限。 在此時間後,即使未符合資料列下限需求,也會將批次寫入輸出。 目前的預設值為 1 分鐘,允許的上限為 2 小時。 如果您的 Blob 輸出具有路徑模式頻率,則等候時間不得高於分割區時間範圍。
編碼方式 如果您使用 CSV 或 JSON 格式,則必須指定編碼。 UTF-8 是目前唯一支援的編碼格式。
分隔符號 僅適用於 CSV 序列化。 串流分析可支援許多序列化 CSV 資料常用的分隔符號。 支援的值是逗號、分號、空格、索引標籤和分隔號。
格式 僅適用於 JSON 序列化。 分隔的行會指定輸出的格式化方式為利用新行分隔每個 JSON 物件。 如果您選取分隔的行,JSON 會一次讀取一個物件。 整個內容本身不是有效的 JSON。 陣列會指定輸出將會格式化為 JSON 物件的陣列。 只有在作業停止或串流分析已移動到下一個時間範圍時,才會關閉這個陣列。 一般而言,最好使用以行分隔的 JSON,因為輸出檔仍在寫入時不需要任何特殊處理。

完全一次傳遞 (公開預覽)

讀取任何串流輸入時,端對端完全一次傳遞表示處理過的數據會寫入 Data Lake Storage Gen2 輸出一次,而不會重複。 啟用此功能時,串流分析作業保證不會遺失任何數據,也不會在使用者起始的上次輸出時間重新啟動時產生任何重複專案。 它不需要實作和疑難解答重複數據刪除邏輯,即可簡化串流管線。

寫入模式

串流分析有兩種方式會寫入您的 Blob 記憶體或 Data Lake Storage Gen2 帳戶。 其中一種方式是將結果附加至相同的檔案,或附加至結果傳入的檔案序列。 另一種方式是在時間分割的所有結果之後寫入,當時間數據分割的所有數據都可供使用時。 當寫入模式為 [一次] 時,就會啟用正好一次傳遞。

Delta Lake 沒有寫入模式選項。 不過,Delta Lake 輸出也會使用 Delta 記錄提供完全相同的一次保證。 它不需要時間分割,而且會根據使用者定義的批處理參數持續寫入結果。

注意

如果您不想對一次傳遞使用預覽功能,請選取 [ 附加為結果送達]。

組態

若要接收 Blob 記憶體或 Data Lake Storage Gen2 帳戶的完全一次傳遞,您需要設定下列設定:

  • 針對您的 [寫入模式] 選取 [時間分割區的所有結果可供使用之後一次]
  • 提供{date} {time} 指定的路徑模式
  • 指定 [日期格式] 和 [時間格式]

限制

  • 不支援子串流
  • 路徑模式會變成必要的屬性,而且必須同時包含 {date}{time}。 不允許動態自定義 {field} 名稱。 深入了解自訂路徑模式
  • 如果在上次輸出時間之前或之後的自定義時間啟動作業,則檔案可能會遭到覆寫。 例如,當時間格式設定為 HH,會每小時產生檔案。 如果您在上午 8:15 停止作業,並在上午 8:30 重新啟動作業,則從上午 8 點到上午 9 點之間產生的檔案只會涵蓋上午 8:30 到上午 9 點的數據。 從上午 8 點到上午 8:15 的數據會在覆寫時遺失。

Blob 輸出檔案

當您使用 Blob 記憶體做為輸出時,會在下列情況下在 Blob 中建立新的檔案:

  • 檔案超過允許的區塊數目上限 (目前為 50,000 個)。 您可以達到允許的最大區塊數目,而未達到允許的 Blob 大小上限。 比方說,如果輸出速率很高,您可看到每個區塊有更多位元組,且檔案大小更大。 如果輸出速率很低,每個區塊都會具有較少的資料,且檔案大小會較小。
  • 輸出中有架構變更,而輸出格式需要固定架構 (CSV、Avro 或 Parquet)。
  • 作業會在外部重新啟動,使用者將其停止並啟動,或是在內部進行系統維護或錯誤復原。
  • 完全分割查詢,而系統會為每個輸出分割區建立新檔案。 它來自相容性層級 1.2導入的 using PARTITION BY 或 native parallelization。
  • 使用者刪除儲存體帳戶的檔案或容器。
  • 使用路徑前置詞模式將輸出進行時間分割,則會在查詢移至下一個小時的時候使用新的 Blob。
  • 輸出是由自訂欄位進行分割,系統會針對每個分割區索引鍵建立新的 blob (若不存在的話)。
  • 輸出是由自訂欄位進行分割,其中分割區索引鍵基數超過 8000,則系統可能會針對每個分割區索引鍵建立新的 Blob。

資料分割

針對分割區索引鍵,請在 {date} 路徑模式中使用 和 {time} 來自事件欄位的令牌。 選擇日期格式, 例如 YYYY/MM/DDDD/MM/YYYYMM-DD-YYYYHH 用於時間格式。 Blob 輸出可以透過單一自定義事件屬性 {fieldname}{datetime:\<specifier>}來分割。 輸出寫入器的數目會遵循可完全平行化查詢的輸入資料分割。

輸出批次大小

如需訊息大小上限,請參閱 Azure Storage 限制。 Blob 區塊大小上限為 4 MB,Blob 區塊計數上限為 50,000。

限制

  • 如果在路徑模式中使用正斜線符號 (/例如/folder2/folder3,),則會建立空白資料夾,而且它們不會顯示在 儲存體總管 中。
  • 串流分析會在不需要新的 Blob 檔案的情況下,附加至相同的檔案。 如果設定 Azure 事件方格 等 Azure 服務在 Blob 檔案更新上觸發,可能會產生更多觸發程式。
  • 串流分析預設會附加至 Blob。 當輸出格式是 JSON 陣列時,它會在關機時完成檔案,或當輸出移至下一次分割區以進行時間分割輸出時。 在某些情況下,例如不完全重新啟動,JSON 陣列的右方括弧 (]) 可能會遺失。