Remití el sitio https://github.com/toddkitta/azure-content/blob/master/articles/data-lake-analytics/data-lake-analytics-get-started-net-sdk.md para enviar un trabajo U-SQL, pero la muestra de GitHub anterior muestra un error en la aplicación de consola en el método Authentication AcquireToken. ingrese la descripción de la imagen aquí

Sugierame una muestra para enviar un trabajo de U-SQL usando .Net SDK

enter image description here

Editado: PlatformParameters muestra un error en mi Visual Studio. Creo que olvidé incluir esa clase. ingrese la descripción de la imagen aquí

0
Arron 11 jul. 2017 a las 09:50

2 respuestas

La mejor respuesta

Como Rick van den Bosch mencionó que necesitamos usar el método AcquireTokenAsync, también sigo el documento para hacer una demostración. Y cambia un código en mi lado, entonces funciona correctamente en mi lado. Los siguientes son mis pasos detallados.

preparación

1.Registre una aplicación de AD nativa y agregue el permiso Windows Azure Service Management API ; más detalles, consulte Tutoriales oficiales de Azure. Después de eso, podemos obtener tenantId , appId , Redirect URI desde Azure Portal.

enter image description here

enter image description here

2.Cree una cuenta de Data Lake Analytics y Data Lake Store. Asigno permiso a la carpeta o archivo en la tienda de lago de datos, más detalles, consulte otro hilo SO.

3.Prepare un archivo de script en la carpeta local, obtengo el script de su documento.

C:\Tom\SampleUSQLScript.txt

4 Cargue SearchLog.tsv en la cuenta de almacenamiento de Azure y configúrelo como público

Pasos:

1.Cree un proyecto de consola y haga referencia al SDK correspondiente; los detalles, consulte la sección packages.config.

2.Agregue cómo obtener la función TokenCredentials

   public static TokenCredentials AuthenticateUser(string tenantId, string resource, string appClientId, Uri appRedirectUri, string userId = "")
        {
            var authContext = new AuthenticationContext("https://login.microsoftonline.com/" + tenantId);

            var tokenAuthResult = authContext.AcquireTokenAsync(resource, appClientId, appRedirectUri, new PlatformParameters(PromptBehavior.Auto),
                 UserIdentifier.AnyUser).Result;

            return new TokenCredentials(tokenAuthResult.AccessToken);
        }

Pruebe la función TokenCredentials

enter image description here

3.Añadir la función SetupClients

 public static void SetupClients(TokenCredentials tokenCreds, string subscriptionId)
    {
        _adlaClient = new DataLakeAnalyticsAccountManagementClient(tokenCreds) {SubscriptionId = subscriptionId};

        _adlaJobClient = new DataLakeAnalyticsJobManagementClient(tokenCreds);

        _adlaCatalogClient = new DataLakeAnalyticsCatalogManagementClient(tokenCreds);

        _adlsClient = new DataLakeStoreAccountManagementClient(tokenCreds) {SubscriptionId = subscriptionId};

        _adlsFileSystemClient = new DataLakeStoreFileSystemManagementClient(tokenCreds);
    }

4.Añadir la función SubmitJobByPath

 public static string SubmitJobByPath(string scriptPath, string jobName)
        {
            var script = File.ReadAllText(scriptPath);
            var jobId = Guid.NewGuid();
            var properties = new USqlJobProperties(script);
            var parameters = new JobInformation(jobName, JobType.USql, properties, priority: 1000, degreeOfParallelism: 1);
            var jobInfo = _adlaJobClient.Job.Create(_adlaAccountName,jobId, parameters);
            return jobId.ToString();
        }

5.Añadir otras funciones relacionadas

 public static void UploadFile(string srcFilePath, string destFilePath, bool force = true)
        {
            var parameters = new UploadParameters(srcFilePath, destFilePath, _adlsAccountName, isOverwrite: force);
            var frontend = new DataLakeStoreFrontEndAdapter(_adlsAccountName, _adlsFileSystemClient);
            var uploader = new DataLakeStoreUploader(parameters, frontend);
            uploader.Execute();
        }

        // Download file
  public static void DownloadFile(string srcPath, string destPath)
        {
            var stream = _adlsFileSystemClient.FileSystem.Open(srcPath, _adlsAccountName);
            var fileStream = new FileStream(destPath, FileMode.Create);

            stream.CopyTo(fileStream);
            fileStream.Close();
            stream.Close();
        }


 public static JobResult WaitForJob(string jobId)
        {
            var jobInfo = _adlaJobClient.Job.Get(_adlaAccountName,Guid.Parse(jobId));
            while (jobInfo.State != JobState.Ended)
            {
                jobInfo = _adlaJobClient.Job.Get(_adlaAccountName, Guid.Parse(jobId)); 
            }
            return jobInfo.Result.Value;
        }

public static void WaitForNewline(string reason, string nextAction = "")
        {
            if (!String.IsNullOrWhiteSpace(nextAction))
            {
                Console.WriteLine(reason + "\r\nPress ENTER to continue...");
                Console.ReadLine();
                Console.WriteLine(nextAction);
            }
            else
            {
                Console.WriteLine(reason + "\r\nPress ENTER to continue...");
                Console.ReadLine();
            }

6. Agregue el código de trabajo de envío de prueba.

 private static void Main(string[] args)
    {
        _adlsAccountName = "data lake store account"; // TODO: Replace this value with the name for a created Store account.
        _adlaAccountName = "data lake analytics"; // TODO: Replace this value with the name for a created Analytics account.
        string localFolderPath = @"C:\tom\"; // TODO: Make sure this exists and contains the U-SQL script.

        // Authenticate the user
        // For more information about applications and instructions on how to get a client ID, see: 
        // https://azure.microsoft.com/en-us/documentation/articles/resource-group-create-service-principal-portal/
        var tokenCreds = AuthenticateUser("common", "https://management.core.windows.net/",
            "application id", new Uri("http://localhost")); // TODO: Replace applicaion id and redirect url values.

        SetupClients(tokenCreds, "subscription id"); // TODO: Replace subscription value.

        // Run sample scenarios

        // Transfer the source file from a public Azure Blob container to Data Lake Store.
        CloudBlockBlob blob = new CloudBlockBlob(new Uri("https://tomnew.blob.core.windows.net/adls-sample-data/SearchLog.tsv"));
        blob.DownloadToFile(localFolderPath + "SearchLog.tsv", FileMode.Create); // from WASB
        UploadFile(localFolderPath + "SearchLog.tsv", "/mytempdir/SearchLog.tsv"); // to ADLS
        WaitForNewline("Source data file prepared.", "Submitting a job.");

        // Submit the job
        string jobId = SubmitJobByPath(localFolderPath + "SampleUSQLScript.txt", "My First ADLA Job");
        WaitForNewline("Job submitted.", "Waiting for job completion.");

        // Wait for job completion
        WaitForJob(jobId);
        WaitForNewline("Job completed.", "Downloading job output.");


    }

7.Debug desde el local y verifique el resultado desde el portal azure.

enter image description here

enter image description here

Paquetes.config

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="Microsoft.Azure.KeyVault.Core" version="1.0.0" targetFramework="net46" />
  <package id="Microsoft.Azure.Management.DataLake.Analytics" version="3.0.0" targetFramework="net46" />
  <package id="Microsoft.Azure.Management.DataLake.Store" version="1.0.4" targetFramework="net46" />
  <package id="Microsoft.Azure.Management.DataLake.StoreUploader" version="1.0.1-preview" targetFramework="net46" />
  <package id="Microsoft.Data.Edm" version="5.8.2" targetFramework="net46" />
  <package id="Microsoft.Data.OData" version="5.8.2" targetFramework="net46" />
  <package id="Microsoft.Data.Services.Client" version="5.8.2" targetFramework="net46" />
  <package id="Microsoft.IdentityModel.Clients.ActiveDirectory" version="3.14.1" targetFramework="net46" />
  <package id="Microsoft.Rest.ClientRuntime" version="2.3.8" targetFramework="net46" />
  <package id="Microsoft.Rest.ClientRuntime.Azure" version="3.3.7" targetFramework="net46" />
  <package id="Newtonsoft.Json" version="6.0.8" targetFramework="net46" />
  <package id="System.ComponentModel.EventBasedAsync" version="4.0.11" targetFramework="net46" />
  <package id="System.Dynamic.Runtime" version="4.0.0" targetFramework="net46" />
  <package id="System.Linq.Queryable" version="4.0.0" targetFramework="net46" />
  <package id="System.Net.Requests" version="4.0.11" targetFramework="net46" />
  <package id="System.Spatial" version="5.8.2" targetFramework="net46" />
  <package id="WindowsAzure.Storage" version="8.1.4" targetFramework="net46" />
</packages>

Actualización:

Si queremos usar el inicio de sesión silencioso, podríamos usar el siguiente código para obtener tokenCreds var tokenCreds = AuthenticateSlientUser("https://management.core.windows.net/", tenantId, applicationId, secretKey)

public static TokenCredentials AuthenticateSlientUser(string resource,string tenantId, string appClientId, string secretKey)
        {
            var authContext = new AuthenticationContext("https://login.microsoftonline.com/" + tenantId);

            var tokenAuthResult = authContext.AcquireTokenAsync(resource, new ClientCredential(appClientId, secretKey)).Result;

            return new TokenCredentials(tokenAuthResult.AccessToken);
        }
3
Tom Sun - MSFT 12 jul. 2017 a las 09:58

La muestra de msdn no tiene el método AcquireTokenAsync - Arron

A veces, la documentación se retrasa. Probablemente actualizaron el paquete, pero aún no han actualizado la documentación. Utilice el método Async, estará bien.

Podrías usar el método AcquireTokenAsync con la misma facilidad. Llámelo como se indica a continuación. Esto esperará el método async y devolverá el resultado, incluso en métodos sincrónicos.

var token = authContext.AcquireTokenAsync(parameters).Result;

Para conocer los parámetros que se utilizarán, consulte la documentación: autenticación Contexto . Adquirir simbólico asíncrono Método

Puede encontrar varios ejemplos de código de trabajo en línea. Aquí tienes un ejemplo.

0
rickvdbosch 11 jul. 2017 a las 07:13