Share via


來自 Azure 串流分析的 Blob 儲存體和 Azure Data Lake Gen 2 輸出

Data Lake Storage Gen2 讓 Azure 儲存體成為在 Azure 上打造企業 Data Lake 的基礎。 Data Lake Storage Gen2 從一開始就設計為服務數 PB 的資訊,同時可以維持數百 GB 的輸送量,可讓您輕鬆地管理大量資料。 Data Lake Storage Gen2 的基礎部分是新增至 Blob 儲存體的階層命名空間。

若要將大量非結構化資料儲存於雲端,Azure Blob 儲存體提供具有成本效益且可擴充的解決方案。 如需 Blob 儲存體及其使用方式的簡介,請參閱使用 Azure 入口網站上傳、下載及列出 Blob

注意

針對 AVRO 和 Parquet 格式的特定行為,如需詳細資訊,請參閱概觀中的相關章節。

輸出設定

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

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

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

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

在路徑模式中,您可以選擇使用日期時間變數的一或多個執行個體,來指定 blob 的寫入頻率:{date}、{time}。

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

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

這項功能允許在路徑中使用自訂日期/時間格式的指定名稱設定。 自訂日期和時間格式一次只能指定一項,兩側必須加上 {datetime:<specifier>} 關鍵字。 允許輸入的 <specifier> 為 yyyy、MM、M、dd、d、HH、H、mm、m、ss 或 s。 {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 時間可用於所有以時間為基礎的資料分割。

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

{路徑前置詞模式}/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,因為其不需要任何特殊處理,同時仍會寫入輸出檔案。

一次傳遞 (公開預覽)

讀取任何串流輸入時,端對端只會傳遞一次,表示處理過的資料將會寫入 Azure Data Lake Storage Gen2 輸出一次,而不會重複。 啟用此功能時,串流分析作業保證不會遺失任何資料,也不會從上次輸出時間在使用者起始的重新啟動之間產生任何重複項目。 其可大幅簡化串流管線,也就是不需要實作重複資料刪除邏輯並進行疑難排解。

寫入模式

串流分析會以兩種方式寫入 Blob 儲存體或 ADLS Gen2 帳戶。 其中一個是將結果附加至相同的檔案或一連串檔案,因為結果會傳入。 另一個則是在時間分割區的所有資料可用時,在時間分割區的所有結果之後寫入。 [寫入模式] 為 [一次] 時,會啟用 [一次傳遞]。

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

注意

如果您不想只針對一次傳遞使用預覽功能,請選取 [結果抵達時附加]

組態

若要只接收 Blob 儲存體或 ADLS 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)。
  • 工作已重新啟動,無論是由使用者於外部停止並啟動它,或是於內部重新啟動以進行系統維護或錯誤復原。
  • 完全分割查詢,而系統會為每個輸出分割區建立新檔案。 其由來是使用了 PARTITION BY,或是相容性層級 1.2 中引進的原生平行處理
  • 使用者刪除儲存體帳戶的檔案或容器。
  • 使用路徑前置詞模式將輸出進行時間分割,則會在查詢移至下一個小時的時候使用新的 Blob。
  • 輸出是由自訂欄位進行分割,系統會針對每個分割區索引鍵建立新的 blob (若不存在的話)。
  • 輸出是由自訂欄位進行分割,其中分割區索引鍵基數超過 8000,則系統可能會針對每個分割區索引鍵建立新的 Blob。

資料分割

針對分割區索引鍵,使用來自路徑模式中事件欄位的 {date} 和 {time} 權杖。 選擇日期格式,例如 YYYY/MM/DD、DD/MM/YYYY、MM-DD-YYYY。 HH 用於時間格式。 您可依照單一自訂事件屬性 {fieldname} 或 {datetime:<specifier>} 分割 Blob 輸出。 輸出寫入器的數目會遵循可完全平行化查詢的輸入資料分割。

輸出批次大小

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

限制

  • 如果在路徑模式中使用斜線符號 / (例如 /folder2/folder3),就會建立空的資料夾,而且不會顯示在儲存體總管中
  • 在不需要新 Blob 檔案的情況下,Azure 串流分析會附加至相同的檔案。 如果事件方格之類的 Azure 服務受到設定為在 Blob 檔案更新上觸發,其可能會導致產生更多的觸發程序。
  • 根據預設,Azure 串流分析會附加至 Blob。 如果輸出格式為 Json 陣列,在關機時,或在輸出為了進行時間分割輸出而移至下個時間分割區時,該服務會完成檔案。 在某些情況下 (例如未整理的重新開機) JSON 陣列的結尾「]」會不見。

下一步