這很重要
Azure Data Lake Analytics 於 2024 年 2 月 29 日淘汰。 透過此公告深入了解。
針對數據分析,您的組織可以使用 Azure Synapse Analytics 或 Microsoft Fabric。
開發U-SQL腳本時,通常會先在本機執行及測試U-SQL腳本,再將其提交至雲端。 Azure Data Lake 針對此案例提供名為 Azure Data Lake U-SQL SDK 的 NuGet 套件,讓您可以輕鬆地調整 U-SQL 執行和測試。 您也可以將此 U-SQL 測試與 CI (持續整合) 系統整合,以自動化編譯和測試。
如果您關心如何使用 GUI 工具手動執行 U-SQL 腳本並對其進行偵錯,您可以使用適用於 Visual Studio 的 Azure Data Lake Tools。 您可以 從這裡深入瞭解。
安裝 Azure Data Lake U-SQL SDK
您可以在 Nuget.org 這裡取得 Azure Data Lake U-SQL SDK。在使用之前,請確保您已確認以下相依項目。
依賴
Data Lake U-SQL SDK 需要下列相依性:
Microsoft Visual C++ 14 和 Windows SDK 10.0.10240.0 或更新版本(本文中稱為 CppSDK)。 有兩種方式可取得 CppSDK:
安裝 Visual Studio Community Edition。 您在 Program Files 資料夾下會有 \Windows Kits\10 資料夾,例如 C:\Program Files (x86)\Windows Kits\10。 您也會在 \Windows Kits\10\Lib 下找到 Windows 10 SDK 版本。 如果您沒有看到這些資料夾,請重新安裝Visual Studio,並確定在安裝期間選取 Windows 10 SDK。 如果您已安裝 Visual Studio,U-SQL 本機編譯程式會自動找到它。
安裝 Data Lake Tools for Visual Studio。 您可以在 找到預先封裝的 Visual C++ 和 Windows SDK 檔案
C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\Extensions\Microsoft\ADL Tools\X.X.XXXX.X\CppSDK.在此情況下,U-SQL 本機編譯程式無法自動找到相依性。 您必須指定 CppSDK 路徑。 您可以將檔案複製到另一個位置,或依目前方式使用它。
瞭解基本概念
資料根目錄
數據根資料夾是本機計算帳戶的「本地存儲」。 它相當於 Data Lake Analytics 帳戶的 Azure Data Lake Store 帳戶。 切換至不同的數據根資料夾就像切換至不同的存放區帳戶一樣。 如果您想要存取具有不同資料根資料夾的常用共享資料,您必須在腳本中使用絕對路徑。 或者,在數據根資料夾底下建立文件系統符號連結(例如,NTFS 上的 mklink ),以指向共享數據。
資料根資料夾可用來:
- 儲存本機元數據,包括資料庫、數據表、數據表值函式(TVF)和元件。
- 查閱 U-SQL 中定義為相對路徑的輸入和輸出路徑。 使用相對路徑可讓您更輕鬆地將U-SQL專案部署至 Azure。
U-SQL 中的檔案路徑
您可以在 U-SQL 腳本中使用相對路徑和本機絕對路徑。 相對路徑相對於指定的數據根資料夾路徑。 我們建議您使用 「/」 作為路徑分隔符,讓您的腳本與伺服器端相容。 以下是相對路徑及其對等絕對路徑的一些範例。 在這些範例中,C:\LocalRunDataRoot 是數據根資料夾。
| 相對路徑 | 絕對路徑 |
|---|---|
| /abc/def/input.csv | C:\LocalRunDataRoot\abc\def\input.csv |
| abc/def/input.csv | C:\LocalRunDataRoot\abc\def\input.csv |
| D:/abc/def/input.csv | D:\abc\def\input.csv |
工作目錄
在本機執行 U-SQL 腳本時,會在目前執行目錄中的編譯期間建立工作目錄。 除了編譯輸出之外,本機執行所需的運行時間檔案也會陰影複製到此工作目錄。 工作目錄根資料夾稱為 「ScopeWorkDir」,工作目錄下的檔案如下所示:
| 目錄/檔案 | 目錄/檔案 | 目錄/檔案 | 定義 | 說明 |
|---|---|---|---|---|
| C6A101DDCB470506 | 運行時間版本的哈希字串 | 需要本機執行的執行階段檔案的陰影副本 | ||
| Script_66AE4909AA0ED06C | 文稿名稱 + 文稿路徑的哈希字串 | 編譯輸出和執行步驟記錄 | ||
| _script_.abr | 編譯程序輸出 | 代數檔案 | ||
| _ScopeCodeGen_.* | 編譯程序輸出 | 產生的管理程式碼 | ||
| _ScopeCodeGenEngine_.* | 編譯程序輸出 | 生成的原生碼 | ||
| 參考的元件 | 組件參考 | 參考的元件檔案 | ||
| 已部署資源 | 資源部署 | 資源部署檔案 | ||
| xxxxxxxx.xxx[1..n]_*.* | 執行記錄 | 執行步驟的記錄 |
從命令行使用 SDK
協助應用程式的命令行介面
SDK 目錄\build\runtime, LocalRunHelper.exe 是命令列輔助應用程式,可為大部分常用的本機執行函式提供介面。 命令和參數選項都區分大小寫。 若要叫用它:
LocalRunHelper.exe <command> <Required-Command-Arguments> [Optional-Command-Arguments]
在不帶參數或帶有 help 選項的情況下執行 LocalRunHelper.exe 以顯示幫助資訊:
> LocalRunHelper.exe help
Command 'help' : Show usage information
Command 'compile' : Compile the script
Required Arguments :
-Script param
Script File Path
Optional Arguments :
-Shallow [default value 'False']
Shallow compile
在幫助說明中:
- 命令 會提供命令的名稱。
- 必要自變數 會列出必須提供的自變數。
- 選擇性自變數 會列出具有預設值的選擇性自變數。 選擇性布爾自變數沒有參數,其外觀表示預設值為負值。
傳回值和記錄
協助程式應用程式會傳回 0 表示成功, 而 -1 則傳回失敗。 根據預設,協助程式會將所有訊息傳送至目前的控制台。 不過,大部分的命令都支援 -MessageOut path_to_log_file 選擇性自變數,將輸出重新導向至記錄檔。
環境變數設定
U-SQL 本機執行需要指定的數據根目錄作為本機存儲帳戶,以及指定的 CppSDK 路徑來處理依賴項。 您可以在命令行中設定 自變數,或為它們設定環境變數。
設定 SCOPE_CPP_SDK 環境變數。
如果您透過安裝 Data Lake Tools for Visual Studio 取得 Microsoft Visual C++ 和 Windows SDK,請確認您擁有下列資料夾:
C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\Extensions\Microsoft\Microsoft Azure Data Lake Tools for Visual Studio 2015\X.X.XXXX.X\CppSDK定義名為 SCOPE_CPP_SDK 的新環境變數,以指向此目錄。 或將資料夾複製到其他位置,並將 SCOPE_CPP_SDK 指定為 。
除了設定環境變數之外,您也可以在使用命令行時指定 -CppSDK 自變數。 此自變數會覆寫您的預設 CppSDK 環境變數。
設定 LOCALRUN_DATAROOT 環境變數。
定義名為 LOCALRUN_DATAROOT 的新環境變數,指向數據根目錄。
除了設定環境變數之外,您還可以在使用命令行時,使用數據根路徑指定 -DataRoot 自變數。 此自變數會覆寫您的預設數據根環境變數。 您必須將此自變數新增至您執行的每個命令行,以便覆寫所有作業的預設數據根環境變數。
SDK 命令行使用範例
編譯和執行
run 命令可用來編譯腳本,然後執行編譯的結果。 其命令列參數是來自編譯和執行的參數組合。
LocalRunHelper run -Script path_to_usql_script.usql [optional_arguments]
以下是 run 的選擇性參數:
| 論點 | 預設值 | 說明 |
|---|---|---|
| -CodeBehind | 否 | 腳本後置.cs程序代碼 |
| -CppSDK | CppSDK 目錄 | |
| -DataRoot | DataRoot 環境變數 | 本機執行的 DataRoot,預設為 『LOCALRUN_DATAROOT』 環境變數 |
| -MessageOut | 將終端上的訊息輸出到檔案 | |
| -平行 | 1 | 使用指定的平行處理原則執行計劃 |
| -引用 | 列出額外參考元件或後端程式碼資料檔的路徑,以「;」分隔 | |
| -UdoRedirect | 否 | 產生Udo組件重新導向配置 |
| -UseDatabase | 大師 | 用於臨時組件註冊背景程式碼的資料庫 |
| -Verbose | 否 | 顯示運行時間的詳細輸出 |
| -WorkDir | 目前目錄 | 編譯器使用和輸出的目錄 |
| -RunScopeCEP | 0 | 要使用的範圍CEP模式 |
| -ScopeCEPTempPath | 溫度 | 用於串流數據的暫存路徑 |
| -OptFlags | 以逗號分隔的優化工具旗標清單 |
以下為範例:
LocalRunHelper run -Script d:\test\test1.usql -WorkDir d:\test\bin -CodeBehind -References "d:\asm\ref1.dll;d:\asm\ref2.dll" -UseDatabase testDB –Parallel 5 -Verbose
除了合併編譯和執行之外,您還可以個別編譯和執行已編譯的可執行檔。
編譯 U-SQL 腳本
編譯命令是用來將U-SQL腳本編譯為可執行檔。
LocalRunHelper compile -Script path_to_usql_script.usql [optional_arguments]
以下是 編譯時可選的參數:
| 論點 | 說明 |
|---|---|
| -CodeBehind [預設值 'False'] | 腳本有後置的.cs程式碼 |
| -CppSDK [預設值 ''] | CppSDK 目錄 |
| -DataRoot [預設值 'DataRoot 環境變數'] | 本機執行的 DataRoot,預設為 『LOCALRUN_DATAROOT』 環境變數 |
| -MessageOut [預設值 ''] | 將主控台上的訊息導出到檔案 |
| -引用 [預設值 ''] | 額外參考元件或程式碼後置資料檔的路徑清單,以「;」分隔。 |
| -Shallow [預設值「False」] | 淺層編譯 |
| -UdoRedirect [預設值 '假'] | 產生Udo組件重新導向配置 |
| -UseDatabase [預設值 '主資料庫'] | 用於臨時組件註冊之程式碼的資料庫 |
| -WorkDir [預設值 'Current Directory'] | 編譯器使用方式與輸出檔案的目錄 |
| -RunScopeCEP [預設值 '0'] | 所需使用的ScopeCEP模式 |
| -ScopeCEPTempPath [預設值 'temp'] | 用於串流數據的暫存路徑 |
| -OptFlags [預設值 ''] | 以逗號分隔的優化工具旗標清單 |
以下是一些使用範例。
編譯 U-SQL 腳本:
LocalRunHelper compile -Script d:\test\test1.usql
編譯 U-SQL 腳本並設定數據根資料夾。 這會覆寫設定的環境變數。
LocalRunHelper compile -Script d:\test\test1.usql –DataRoot c:\DataRoot
編譯 U-SQL 腳本並設定工作目錄、參考元件和資料庫:
LocalRunHelper compile -Script d:\test\test1.usql -WorkDir d:\test\bin -References "d:\asm\ref1.dll;d:\asm\ref2.dll" -UseDatabase testDB
執行編譯的結果
execute 命令是用來執行編譯的結果。
LocalRunHelper execute -Algebra path_to_compiled_algebra_file [optional_arguments]
以下是 執行的可選參數:
| 論點 | 預設值 | 說明 |
|---|---|---|
| -DataRoot | (空白) | 元數據執行的數據根目錄。 預設為 LOCALRUN_DATAROOT 環境變數。 |
| -MessageOut | (空白) | 將控制臺上的訊息匯出到檔案中。 |
| -平行 | '1' | 使用指定的平行處理原則層級執行所產生本機執行步驟的指標。 |
| -Verbose | 假 | 顯示執行時詳細輸出的指標。 |
以下是使用範例︰
LocalRunHelper execute -Algebra d:\test\workdir\C6A101DDCB470506\Script_66AE4909AA0ED06C\__script__.abr –DataRoot c:\DataRoot –Parallel 5
搭配程式設計介面使用SDK
程序設計介面全都位於 LocalRunHelper.exe中。 您可以使用它們來整合U-SQL SDK和 C# 測試架構的功能,以調整U-SQL腳本本機測試。 在本文中,我將使用標準 C# 單元測試項目來示範如何使用這些介面來測試 U-SQL 腳本。
步驟 1:建立 C# 單元測試專案和組態
在 > 檔案 > 新增 > 專案 > Visual C# > 測試 單元測試專案中建立 C# 單元測試專案。
將 LocalRunHelper.exe 新增為項目的參考。 LocalRunHelper.exe 位於 NuGet 套件中的 \build\runtime\LocalRunHelper.exe。
U-SQL SDK 僅 支援 x64 環境,請務必將建置平臺目標設定為 x64。 您可以透過 Project 屬性 > 建置 > 平台目標來設定。
請務必將測試環境設定為 x64。 在 Visual Studio 中,您可以透過測試 > 測試設定 > 預設處理器架構 > x64 加以設定。
請務必將 NugetPackage\build 底下的所有相依性檔案\runtime\ 複製到專案工作目錄,這通常位於 ProjectFolder\bin\x64\Debug 底下。
步驟 2:建立 U-SQL 腳本測試案例
以下是U-SQL腳本測試的範例程式代碼。 若要進行測試,您必須準備腳本、輸入檔案和預期的輸出檔案。
using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.IO;
using System.Text;
using System.Security.Cryptography;
using Microsoft.Analytics.LocalRun;
namespace UnitTestProject1
{
[TestClass]
public class USQLUnitTest
{
[TestMethod]
public void TestUSQLScript()
{
//Specify the local run message output path
StreamWriter MessageOutput = new StreamWriter("../../../log.txt");
LocalRunHelper localrun = new LocalRunHelper(MessageOutput);
//Configure the DateRoot path, Script Path and CPPSDK path
localrun.DataRoot = "../../../";
localrun.ScriptPath = "../../../Script/Script.usql";
localrun.CppSdkDir = "../../../CppSDK";
//Run U-SQL script
localrun.DoRun();
//Script output
string Result = Path.Combine(localrun.DataRoot, "Output/result.csv");
//Expected script output
string ExpectedResult = "../../../ExpectedOutput/result.csv";
Test.Helpers.FileAssert.AreEqual(Result, ExpectedResult);
//Don't forget to close MessageOutput to get logs into file
MessageOutput.Close();
}
}
}
namespace Test.Helpers
{
public static class FileAssert
{
static string GetFileHash(string filename)
{
Assert.IsTrue(File.Exists(filename));
using (var hash = new SHA1Managed())
{
var clearBytes = File.ReadAllBytes(filename);
var hashedBytes = hash.ComputeHash(clearBytes);
return ConvertBytesToHex(hashedBytes);
}
}
static string ConvertBytesToHex(byte[] bytes)
{
var sb = new StringBuilder();
for (var i = 0; i < bytes.Length; i++)
{
sb.Append(bytes[i].ToString("x"));
}
return sb.ToString();
}
public static void AreEqual(string filename1, string filename2)
{
string hash1 = GetFileHash(filename1);
string hash2 = GetFileHash(filename2);
Assert.AreEqual(hash1, hash2);
}
}
}
LocalRunHelper.exe 中的程序設計介面
LocalRunHelper.exe 提供U-SQL 本機編譯、執行等的程式設計介面。介面如下所示。
建構函式
public LocalRunHelper([System.IO.TextWriter messageOutput = null])
| 參數 | 類型 | 說明 |
|---|---|---|
| 訊息輸出 | System.IO.TextWriter | 將輸出訊息設定為 null,以使用控制台 |
性能
| 財產 | 類型 | 說明 |
|---|---|---|
| AlgebraPath | 字符串 | 代數檔案的路徑(代數檔案是其中一個編譯結果) |
| CodeBehindReferences | 字符串 | 如果腳本有其他程式代碼後置參考,請指定以 『;』 分隔的路徑 |
| CppSdkDir | 字符串 | CppSDK 目錄 |
| CurrentDir | 字符串 | 目前目錄 |
| DataRoot | 字符串 | 數據根路徑 |
| DebuggerMailPath | 字符串 | 偵錯mailslot的路徑 |
| GenerateUdoRedirect | 布爾 (bool) | 如果我們想要產生組件載入重定向覆寫設定 |
| HasCodeBehind | 布爾 (bool) | 如果腳本有後端程式碼 |
| InputDir | 字符串 | 輸入資料的目錄 |
| MessagePath | 字符串 | 訊息傾印檔案路徑 |
| OutputDir | 字符串 | 輸出資料的目錄 |
| 平行性 | 整數 (int) | 平行運算以執行代數 |
| ParentPid | 整數 (int) | 服務監視結束之父系的 PID,設定為 0 或負數以忽略 |
| 結果路徑 | 字符串 | 結果轉存檔案路徑 |
| RuntimeDir | 字符串 | 執行階段目錄 |
| ScriptPath | 字符串 | 在哪裡尋找腳本 |
| 淺 | 布爾 (bool) | 淺層編譯或否 |
| TempDir | 字符串 | 暫存目錄 |
| UseDataBase | 字符串 | 根據預設,指定要用於暫存組件註冊過程中程式碼的資料庫,預設為主資料庫。 |
| WorkDir | 字符串 | 慣用的工作目錄 |
方法
| 方法 | 說明 | 返回 | 參數 |
|---|---|---|---|
| public bool DoCompile() | 編譯 U-SQL 腳本 | 成功時為 True | |
| public bool DoExec() | 執行編譯的結果 | 成功時為 True | |
| public bool DoRun() | 執行 U-SQL 文稿 (編譯 + 執行) | 成功時為 True | |
| public bool IsValidRuntimeDir(string path) | 檢查指定的路徑是否為有效的運行時間路徑 | True 表示為有效 | 執行時目錄的路徑 |
常見問題
錯誤 1
E_CSC_SYSTEM_INTERNAL:內部錯誤! 無法載入檔案或元件 'ScopeEngineManaged.dll' 或其其中一個相依性。 找不到指定的模組。
請檢查下列項目:
- 請確定您有 x64 環境。 建置目標平臺和測試環境應該是 x64,請參閱上述 步驟 1:建立 C# 單元測試專案和組態 。
- 請確定您已將 NugetPackage\build 底下的所有相依性檔案\runtime\ 複製到專案工作目錄。
後續步驟
- 若要瞭解 U-SQL,請參閱 開始使用 Azure Data Lake Analytics U-SQL 語言。
- 若要記錄診斷資訊,請參閱 為 Azure Data Lake Analytics 存取診斷記錄。
- 若要查看更複雜的查詢,請參閱 使用 Azure Data Lake Analytics 分析網站記錄。
- 若要檢視 Azure Data Lake Analytics 作業的詳細資訊,請參閱 作業瀏覽器及作業檢視。
- 若要使用頂點執行檢視,請參閱在 Data Lake Tools for Visual Studio 中使用頂點執行檢視。