2017-06-23 114 views
1

我有一個很大的blob存儲空間,其中包含許多日誌文件,這些日誌文件按照其級別進行組織:存儲庫,分支,內部版本號,構建步驟號。Azure數據湖中的增量負載

這些是包含對象數組的JSON文件,每個對象都有一個timestampentry值。我已經實現了一個自定義提取器(擴展爲IExtractor),它接受輸入流並生成許多純文本行。

初始負載

現在我試圖加載所有的數據到ADL商店。我創建了一個查詢,看起來類似於這樣:

@entries = 
    EXTRACT 
    repo string, 
    branch string, 
    build int, 
    step int, 
    Line int, 
    Entry string 
    FROM @"wasb://my.blob.core.windows.net/{repo}/{branch}/{build}/{step}.json" 
    USING new MyJSONExtractor(); 

當我運行此提取查詢我得到一個編譯錯誤 - 它超過25分鐘的編譯時間的限制。我的猜測是:太多的文件。所以,我在INSERT INTO查詢添加一個WHERE條款:

INSERT INTO Entries 
(Repo, Branch, Build, Step, Line, Entry) 
SELECT * FROM @entries 
WHERE (repo == "myRepo") AND (branch == "master"); 

仍然沒有運氣 - 編譯器超時。

(它的工作,然而,當我處理一個單一的構建,使{步}作爲唯一的通配符,進行硬編碼名稱的其餘部分。)

問:是否有辦法在許多作業中執行這樣的負載 - 但不需要顯式(手動)「分區」輸入文件列表?

增量負載

假設爲我成功地加載這些文件片刻。但是,從現在起幾天我需要執行更新 - 我該如何指定文件列表?我有一個保留所有元數據的SQL Server數據庫,並且我可以提取確切的日誌文件路徑 - 但U-SQL的EXTRACT查詢強制我提供一個指定輸入數據的靜態字符串。

一個簡單的方案是爲每個日期定義一個頂級目錄並逐日處理它們。但系統設計的方式使得這非常困難,如果不是不可能的話。

問題:有沒有一種方法來識別文件的創建時間?或者,也許有一種方法可以將查詢與提取查詢結合到SQL Server數據庫中?

回答

0

爲了解決第二個問題:

你可以使用一個聯合查詢的SQL Server數據庫中讀取數據,然後利用這些信息與您從文件集創建虛擬列的連接。問題在於,只有在執行時才知道這些值,而不是在編譯時,所以你不會減少訪問的文件。

或者,您可以編寫一個SQL查詢來獲取所需的數據,然後參數化您的U-SQL腳本,以便將該信息傳遞到U-SQL腳本中。

至於基於創建時間選擇文件的能力:這是我們積壓的功能。我會建議upvote並添加評論以下功能請求:https://feedback.azure.com/forums/327234-data-lake/suggestions/10948392-support-functionality-to-handle-file-properties-fr並添加一個評論,你也想通過文件集查詢他們。

+1

這正是我們現在計劃要做的事情:擁有一個C#服務,用於查詢我們的SQL Server並生成包含硬編碼文件路徑的U-SQL腳本。它沒有一個腳本來完成這項工作的優雅,但肯定是可行的。 – lbartnik

1

對於您的第一個問題:聽起來像您的FileSet模式正在生成大量的輸入文件。爲了解決這個問題,你可能想嘗試這是在U型SQL預覽文件的文件集V2預覽功能在部分: https://github.com/Azure/AzureDataLake/blob/master/docs/Release_Notes/2017/2017_04_24/USQL_Release_Notes_2017_04_24.md

輸入文件秤幅​​度較好(選擇在聲明順序現在提供 )

之前,EXTRACT表達式上的U-SQL文件集模式在編譯時間超時時間爲 時會超過800到5000個文件。

U-SQL的文件集模式現在可擴展到更多文件並生成更高效的計劃。

例如,爲U-SQL腳本查詢我們的遙測 系統超過2500個文件,以前需要花費10分鐘來編譯,現在編譯於1 分鐘和腳本使用在第9分鐘,現在執行35 分鐘,而不是少得多的AU。我們還編譯了腳本,可以訪問30'000個文件。

SET @@ FeaturePreviews = 「FileSetV2Dot5:在」

預覽功能,可以通過添加以下語句 到你的腳本被打開;

如果您想要根據文件路徑的分區生成多個提取語句,那麼必須使用一些可生成一個或多個U-SQL腳本的外部代碼來執行此操作。

我對你的第二個問題沒有很好的回答,所以我會讓同事回覆。希望第一部分能夠讓你現在暢通無阻。

+0

嘿,謝謝!我試了一下,它確實修復了編譯超時。我現在正在運行這個工作,並且在最後一次處理Azure Blob存儲的數據超過2GB。有什麼方法可以將執行節點添加到該作業中嗎?我知道我可以設置虛擬機的限制和「並行性」 - 但我沒有看到如何提升特定工作的說明。 – lbartnik

+0

當您提交查詢(作業)時,您可以指定並行度單位。在Visual Studio中,你可以選擇提交按鈕旁邊的下拉菜單,選擇「高級...」,你會看到一個並行滑塊。在Powershell中,您可以使用「-DegreeOfParallelism」選項並指定一個int(請參閱https://docs.microsoft.com/en-us/powershell/module/azurerm.datalakeanalytics/Submit-AzureRmDataLakeAnalyticsJob?view=azurermps-4.1.0 )。 – OmidA