Köra och testa U-SQL med Azure Data Lake U-SQL SDK

Viktigt

Azure Data Lake Analytics drog sig tillbaka den 29 februari 2024. Läs mer med det här meddelandet.

För dataanalys kan din organisation använda Azure Synapse Analytics eller Microsoft Fabric.

När du utvecklar U-SQL-skript är det vanligt att köra och testa U-SQL-skript lokalt innan du skickar det till molnet. Azure Data Lake tillhandahåller ett NuGet-paket med namnet Azure Data Lake U-SQL SDK för det här scenariot, där du enkelt kan skala U-SQL-körning och -test. Det går också att integrera det här U-SQL-testet med CI-systemet (kontinuerlig integrering) för att automatisera kompilering och testning.

Om du bryr dig om hur du manuellt kör och felsöker U-SQL-skript med GUI-verktyg kan du använda Azure Data Lake Tools för Visual Studio för det. Du kan lära dig mer härifrån.

Installera Azure Data Lake U-SQL SDK

Du kan hämta Azure Data Lake U-SQL SDK här på Nuget.org. Och innan du använder det måste du se till att du har beroenden på följande sätt.

Beroenden

Data Lake U-SQL SDK kräver följande beroenden:

  • Microsoft .NET Framework 4.6 eller senare.

  • Microsoft Visual C++ 14 och Windows SDK 10.0.10240.0 eller senare (som kallas CppSDK i den här artikeln). Det finns två sätt att hämta CppSDK:

    • Installera Visual Studio Community Edition. Du har en \Windows Kits\10-mapp under mappen Programfiler, till exempel C:\Program Files (x86)\Windows Kits\10. Du hittar även Windows 10 SDK-versionen under \Windows Kits\10\Lib. Om du inte ser dessa mappar installerar du om Visual Studio och väljer Windows 10 SDK under installationen. Om du har det installerat med Visual Studio hittar den lokala U-SQL-kompilatorn den automatiskt.

      Data Lake Tools för lokal Windows 10 SDK för Visual Studio

    • Installera Data Lake Tools för Visual Studio. Du hittar förpaketerade Visual C++ och Windows SDK filer påC:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\Extensions\Microsoft\ADL Tools\X.X.XXXX.X\CppSDK.

      I det här fallet kan den lokala U-SQL-kompilatorn inte hitta beroendena automatiskt. Du måste ange CppSDK-sökvägen för den. Du kan antingen kopiera filerna till en annan plats eller använda dem som de är.

Förstå grundläggande begrepp

Datarot

Datarotsmappen är ett "lokalt arkiv" för det lokala beräkningskontot. Det motsvarar Azure Data Lake Store-kontot för ett Data Lake Analytics konto. Att växla till en annan datarotsmapp är precis som att byta till ett annat lagringskonto. Om du vill komma åt vanliga delade data med olika datarotsmappar måste du använda absoluta sökvägar i skripten. Eller skapa symboliska länkar för filsystemet (till exempel mklink på NTFS) under mappen datarot för att peka på delade data.

Datarotsmappen används för att:

  • Lagra lokala metadata, inklusive databaser, tabeller, tabellvärdesfunktioner (TVF:er) och sammansättningar.
  • Leta upp de indata- och utdatasökvägar som definieras som relativa sökvägar i U-SQL. Med relativa sökvägar blir det enklare att distribuera dina U-SQL-projekt till Azure.

Filsökväg i U-SQL

Du kan använda både en relativ sökväg och en lokal absolut sökväg i U-SQL-skript. Den relativa sökvägen är relativ till den angivna sökvägen till datarotsmappen. Vi rekommenderar att du använder "/" som sökvägsavgränsare för att göra skripten kompatibla med serversidan. Här är några exempel på relativa sökvägar och motsvarande absoluta sökvägar. I de här exemplen är C:\LocalRunDataRoot mappen data-root.

Relativ sökväg Absolut sökväg
/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

Arbetskatalog

När du kör U-SQL-skriptet lokalt skapas en arbetskatalog under kompileringen under den aktuella katalogen som körs. Förutom kompileringsutdata kopieras de nödvändiga körningsfilerna för lokal körning till den här arbetskatalogen. Arbetskatalogens rotmapp kallas "ScopeWorkDir" och filerna under arbetskatalogen är följande:

Katalog/fil Katalog/fil Katalog/fil Definition Description
C6A101DDCB470506 Hash-sträng för körningsversion Skuggkopia av körningsfiler som behövs för lokal körning
Script_66AE4909AA0ED06C Skriptnamn + hashsträng för skriptsökväg Kompileringsutdata och körningsstegsloggning
_script_.abr Kompilatorutdata Algebra-fil
_ScopeCodeGen_.* Kompilatorutdata Genererad hanterad kod
_ScopeCodeGenEngine_.* Kompilatorutdata Genererad intern kod
refererade sammansättningar Sammansättningsreferens Refererade sammansättningsfiler
deployed_resources Resursdistribution Resursdistributionsfiler
xxxxxxxx.xxx[1..n]_*.* Körningslogg Logg för körningssteg

Använda SDK:et från kommandoraden

Hjälpprogrammets kommandoradsgränssnitt

Under SDK-katalogen\build\runtime är LocalRunHelper.exe kommandoradshjälpprogrammet som tillhandahåller gränssnitt till de flesta av de vanliga lokalkörningsfunktionerna. Både kommandot och argumentväxlarna är skiftlägeskänsliga. Så här anropar du den:

LocalRunHelper.exe <command> <Required-Command-Arguments> [Optional-Command-Arguments]

Kör LocalRunHelper.exe utan argument eller med hjälpväxlingen för att visa hjälpinformationen:

> 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

I hjälpinformationen:

  • Kommandot anger kommandots namn.
  • Obligatoriskt argument listar argument som måste anges.
  • Valfritt argument visar argument som är valfria med standardvärden. Valfria booleska argument har inte parametrar och deras utseenden betyder negativt för deras standardvärde.

Returnera värde och loggning

Hjälpprogrammet returnerar 0 för lyckat resultat och -1 för fel. Som standard skickar hjälpkomponenten alla meddelanden till den aktuella konsolen. De flesta kommandon har dock stöd för det valfria argumentet -MessageOut path_to_log_file som omdirigerar utdata till en loggfil.

Konfigurera miljövariabel

Lokal U-SQL-körning behöver en angiven datarot som lokalt lagringskonto och en angiven CppSDK-sökväg för beroenden. Du kan båda ange argumentet i kommandoraden eller ange miljövariabeln för dem.

  • Ange miljövariabeln SCOPE_CPP_SDK .

    Om du får Microsoft Visual C++ och Windows SDK genom att installera Data Lake Tools för Visual Studio kontrollerar du att du har följande mapp:

    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

    Definiera en ny miljövariabel med namnet SCOPE_CPP_SDK så att den pekar på den här katalogen. Eller kopiera mappen till den andra platsen och ange SCOPE_CPP_SDK .

    Förutom att ange miljövariabeln kan du ange argumentet -CppSDK när du använder kommandoraden. Det här argumentet skriver över din CppSDK-standardmiljövariabel.

  • Ange miljövariabeln LOCALRUN_DATAROOT .

    Definiera en ny miljövariabel med namnet LOCALRUN_DATAROOT som pekar på dataroten.

    Förutom att ange miljövariabeln kan du ange argumentet -DataRoot med datarotsökvägen när du använder en kommandorad. Det här argumentet skriver över standardvariabeln för datarotsmiljön. Du måste lägga till det här argumentet på varje kommandorad som du kör så att du kan skriva över standardvariabeln för datarotsmiljön för alla åtgärder.

Användningsexempel för SDK-kommandorad

Kompilera och kör

Körningskommandot används för att kompilera skriptet och sedan köra kompilerade resultat. Dess kommandoradsargument är en kombination av dem från kompilera och köra.

LocalRunHelper run -Script path_to_usql_script.usql [optional_arguments]

Följande är valfria argument för körning:

Argument Standardvärde Beskrivning
-Codebehind Falskt Skriptet har .cs bakom sig
-CppSDK CppSDK-katalog
-DataRoot Miljövariabeln DataRoot DataRoot för lokal körning, som standard är miljövariabeln "LOCALRUN_DATAROOT"
-MessageOut Dumpa meddelanden på konsolen till en fil
-Parallell 1 Kör planen med den angivna parallelliteten
-Referenser Lista över sökvägar till extra referenssammansättningar eller datafiler med bakomliggande kod, avgränsade med ";"
-UdoRedirect Falskt Generera omdirigeringskonfiguration för Udo-sammansättning
-UseDatabase master Databas som ska användas för kod bakom tillfällig sammansättningsregistrering
-Utförlig Falskt Visa detaljerade utdata från körning
-WorkDir Aktuell katalog Katalog för kompilatoranvändning och utdata
-RunScopeCEP 0 ScopeCEP-läge som ska användas
-ScopeCEPTempPath temp Temporär sökväg att använda för strömmande data
-OptFlags Kommaavgränsad lista över optimizerflaggor

Här är ett exempel:

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

Förutom att kombinera kompilera och köra kan du kompilera och köra de kompilerade körbara objekten separat.

Kompilera ett U-SQL-skript

Kompileringskommandot används för att kompilera ett U-SQL-skript till körbara filer.

LocalRunHelper compile -Script path_to_usql_script.usql [optional_arguments]

Följande är valfria argument för kompilering:

Argument Description
-CodeBehind [standardvärdet 'False'] Skriptet har .cs bakom sig
-CppSDK [standardvärde ''] CppSDK-katalog
-DataRoot [standardvärdet "DataRoot environment variable"] DataRoot för lokal körning, som standard är miljövariabeln "LOCALRUN_DATAROOT"
-MessageOut [standardvärde ''] Dumpa meddelanden på konsolen till en fil
-Referenser [standardvärde ''] Lista över sökvägar till extra referenssammansättningar eller datafiler med bakomliggande kod, avgränsade med ";"
-Shallow [standardvärdet 'False'] Ytlig kompilering
-UdoRedirect [standardvärdet "False"] Generera omdirigeringskonfiguration för Udo-sammansättning
-UseDatabase [standardvärdet "master"] Databas som ska användas för kod bakom tillfällig sammansättningsregistrering
-WorkDir [standardvärdet "Current Directory"] Katalog för kompilatoranvändning och utdata
-RunScopeCEP [standardvärdet '0'] ScopeCEP-läge som ska användas
-ScopeCEPTempPath [standardvärdet temp] Temporär sökväg att använda för strömmande data
-OptFlags [standardvärde ''] Kommaavgränsad lista över optimizerflaggor

Här följer några användningsexempel.

Kompilera ett U-SQL-skript:

LocalRunHelper compile -Script d:\test\test1.usql

Kompilera ett U-SQL-skript och ange datarotmappen. Detta skriver över den angivna miljövariabeln.

LocalRunHelper compile -Script d:\test\test1.usql –DataRoot c:\DataRoot

Kompilera ett U-SQL-skript och ange en arbetskatalog, referenssammansättning och databas:

LocalRunHelper compile -Script d:\test\test1.usql -WorkDir d:\test\bin -References "d:\asm\ref1.dll;d:\asm\ref2.dll" -UseDatabase testDB

Köra kompilerade resultat

Körningskommandot används för att köra kompilerade resultat.

LocalRunHelper execute -Algebra path_to_compiled_algebra_file [optional_arguments]

Följande är valfria argument för körning:

Argument Standardvärde Beskrivning
-DataRoot '' Datarot för metadatakörning. Standardinställningen är LOCALRUN_DATAROOT miljövariabeln.
-MessageOut '' Dumpa meddelanden i konsolen till en fil.
-Parallell '1' Indikator för att köra de genererade lokala körningsstegen med den angivna parallellitetsnivån.
-Utförlig "Falskt" Indikator för att visa detaljerade utdata från körning.

Här är ett användningsexempel:

LocalRunHelper execute -Algebra d:\test\workdir\C6A101DDCB470506\Script_66AE4909AA0ED06C\__script__.abr –DataRoot c:\DataRoot –Parallel 5

Använda SDK med programmeringsgränssnitt

Alla programmeringsgränssnitt finns i LocalRunHelper.exe. Du kan använda dem för att integrera funktionerna i U-SQL SDK och C#-testramverket för att skala ditt lokala U-SQL-skripttest. I den här artikeln ska jag använda C#-standardenhetens testprojekt för att visa hur du använder dessa gränssnitt för att testa ditt U-SQL-skript.

Steg 1: Skapa C#-enhetstestprojekt och konfiguration

  • Skapa ett C#-enhetstestprojekt via File > New > Project > Visual C# > Test > Unit Test Project.

  • Lägg till LocalRunHelper.exe som referens för projektet. LocalRunHelper.exe finns på \build\runtime\LocalRunHelper.exe i NuGet-paketet.

    Lägg till referens för Azure Data Lake U-SQL SDK

  • U-SQL SDK stöder endast x64-miljö, se till att ange byggplattformsmålet som x64. Du kan ange det via Project Property > Build > Platform-målet.

    Azure Data Lake U-SQL SDK Konfigurera x64-projekt

  • Se till att ange testmiljön som x64. I Visual Studio kan du ange den via Test > testinställningar > Standardprocessorarkitektur > x64.

    Azure Data Lake U-SQL SDK Konfigurera x64-testmiljö

  • Se till att kopiera alla beroendefiler under NugetPackage\build\runtime\ till projektarbetskatalogen, som vanligtvis finns under ProjectFolder\bin\x64\Debug.

Steg 2: Skapa U-SQL-skripttestfall

Nedan visas exempelkoden för U-SQL-skripttest. För testning måste du förbereda skript, indatafiler och förväntade utdatafiler.

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);
        }
    }
}

Programmeringsgränssnitt i LocalRunHelper.exe

LocalRunHelper.exe tillhandahåller programmeringsgränssnitten för lokal U-SQL-kompilering, körning osv. Gränssnitten visas på följande sätt.

Konstruktor

public LocalRunHelper([System.IO.TextWriter messageOutput = null])

Parameter Typ Description
messageOutput System.IO.TextWriter för utdatameddelanden ställer du in på null för att använda konsolen

Egenskaper

Egenskap Typ Description
AlgebraPath sträng Sökvägen till algebrafilen (algebrafilen är ett av kompileringsresultaten)
CodeBehindReferences sträng Om skriptet har annan kod bakom referenser anger du sökvägarna avgränsade med ";"
CppSdkDir sträng CppSDK-katalog
CurrentDir sträng Aktuell katalog
DataRoot sträng Datarotsökväg
DebuggerMailPath sträng Sökvägen till felsökaren mailslot
GenerateUdoRedirect boolesk Om vi vill generera konfigurationen för omdirigering av sammansättningsinläsning åsidosättning
HasCodeBehind boolesk Om skriptet har bakomliggande kod
InputDir sträng Katalog för indata
MessagePath sträng Sökväg till meddelandedumpfil
OutputDir sträng Katalog för utdata
Parallellitet int Parallellitet för att köra algebran
ParentPid int PID för den överordnade som tjänsten övervakar att avsluta, inställd på 0 eller negativ att ignorera
Resultpath sträng Sökväg till resultatdumpfil
RuntimeDir sträng Körningskatalog
ScriptPath sträng Var du hittar skriptet
Grunt boolesk Ytlig kompilering eller inte
TempDir sträng Temp-katalog
UseDataBase sträng Ange den databas som ska användas för kod bakom tillfällig sammansättningsregistrering, huvudserver som standard
WorkDir sträng Önskad arbetskatalog

Metod

Metod Beskrivning Returnera Parameter
public bool DoCompile() Kompilera U-SQL-skriptet Sant om framgång
public bool DoExec() Kör det kompilerade resultatet Sant om framgång
public bool DoRun() Kör U-SQL-skriptet (Kompilera + kör) Sant om framgång
public bool IsValidRuntimeDir(strängsökväg) Kontrollera om den angivna sökvägen är giltig körningssökväg Sant för giltigt Sökvägen till körningskatalogen

Vanliga frågor och svar om vanliga problem

Fel 1

E_CSC_SYSTEM_INTERNAL: Internt fel! Det gick inte att läsa in filen eller sammansättningen "ScopeEngineManaged.dll" eller något av dess beroenden. Det gick inte att hitta den angivna modulen.

Kontrollera följande:

  • Kontrollera att du har x64-miljön. Byggmålplattformen och testmiljön ska vara x64, se Steg 1: Skapa C#-enhetstestprojekt och konfiguration ovan.
  • Kontrollera att du har kopierat alla beroendefiler under NugetPackage\build\runtime\ till projektarbetskatalogen.

Nästa steg