Executar tarefas MapReduce com o SDK .NET do HDInsight
Saiba como submeter tarefas do MapReduce com o SDK .NET do HDInsight. Os clusters do HDInsight são fornecidos com um ficheiro jar com alguns exemplos do MapReduce. O ficheiro jar é /example/jars/hadoop-mapreduce-examples.jar
. Um dos exemplos é a contagem de palavras. Desenvolve uma aplicação de consola C# para submeter uma tarefa de conta de palavras. A tarefa lê o /example/data/gutenberg/davinci.txt
ficheiro e produz os resultados para /example/data/davinciwordcount
. Se quiser voltar a executar a aplicação, tem de limpar a pasta de saída.
Nota
Os passos neste artigo têm de ser executados a partir de um cliente Windows. Para obter informações sobre como utilizar um cliente Linux, OS X ou Unix para trabalhar com o Hive, utilize o seletor de separadores apresentado na parte superior do artigo.
Pré-requisitos
Um cluster do Apache Hadoop no HDInsight. Veja Criar clusters do Apache Hadoop com o portal do Azure.
Submeter tarefas do MapReduce com o SDK .NET do HDInsight
O SDK .NET do HDInsight fornece bibliotecas de cliente .NET, o que facilita o trabalho com clusters do HDInsight a partir do .NET.
Inicie o Visual Studio e crie uma aplicação de consola C#.
Navegue para Ferramentas>Consola do Gestor de Pacotes do Gestor > dePacotes NuGete introduza o seguinte comando:
Install-Package Microsoft.Azure.Management.HDInsight.Job
Copie o código abaixo para Program.cs. Em seguida, edite o código ao definir os valores para:
existingClusterName
,existingClusterPassword
,defaultStorageAccountName
,defaultStorageAccountKey
edefaultStorageContainerName
.using System.Collections.Generic; using System.IO; using System.Text; using System.Threading; using Microsoft.Azure.Management.HDInsight.Job; using Microsoft.Azure.Management.HDInsight.Job.Models; using Hyak.Common; using Microsoft.WindowsAzure.Storage; using Microsoft.WindowsAzure.Storage.Blob; namespace SubmitHDInsightJobDotNet { class Program { private static HDInsightJobManagementClient _hdiJobManagementClient; private const string existingClusterName = "<Your HDInsight Cluster Name>"; private const string existingClusterPassword = "<Cluster User Password>"; private const string defaultStorageAccountName = "<Default Storage Account Name>"; private const string defaultStorageAccountKey = "<Default Storage Account Key>"; private const string defaultStorageContainerName = "<Default Blob Container Name>"; private const string existingClusterUsername = "admin"; private const string existingClusterUri = existingClusterName + ".azurehdinsight.net"; private const string sourceFile = "/example/data/gutenberg/davinci.txt"; private const string outputFolder = "/example/data/davinciwordcount"; static void Main(string[] args) { System.Console.WriteLine("The application is running ..."); var clusterCredentials = new BasicAuthenticationCloudCredentials { Username = existingClusterUsername, Password = existingClusterPassword }; _hdiJobManagementClient = new HDInsightJobManagementClient(existingClusterUri, clusterCredentials); SubmitMRJob(); System.Console.WriteLine("Press ENTER to continue ..."); System.Console.ReadLine(); } private static void SubmitMRJob() { List<string> args = new List<string> { { "/example/data/gutenberg/davinci.txt" }, { "/example/data/davinciwordcount" } }; var paras = new MapReduceJobSubmissionParameters { JarFile = @"/example/jars/hadoop-mapreduce-examples.jar", JarClass = "wordcount", Arguments = args }; System.Console.WriteLine("Submitting the MR job to the cluster..."); var jobResponse = _hdiJobManagementClient.JobManagement.SubmitMapReduceJob(paras); var jobId = jobResponse.JobSubmissionJsonResponse.Id; System.Console.WriteLine("Response status code is " + jobResponse.StatusCode); System.Console.WriteLine("JobId is " + jobId); System.Console.WriteLine("Waiting for the job completion ..."); // Wait for job completion var jobDetail = _hdiJobManagementClient.JobManagement.GetJob(jobId).JobDetail; while (!jobDetail.Status.JobComplete) { Thread.Sleep(1000); jobDetail = _hdiJobManagementClient.JobManagement.GetJob(jobId).JobDetail; } // Get job output System.Console.WriteLine("Job output is: "); var storageAccess = new AzureStorageAccess(defaultStorageAccountName, defaultStorageAccountKey, defaultStorageContainerName); if (jobDetail.ExitValue == 0) { // Create the storage account object CloudStorageAccount storageAccount = CloudStorageAccount.Parse("DefaultEndpointsProtocol=https;AccountName=" + defaultStorageAccountName + ";AccountKey=" + defaultStorageAccountKey); // Create the blob client. CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient(); // Retrieve reference to a previously created container. CloudBlobContainer container = blobClient.GetContainerReference(defaultStorageContainerName); CloudBlockBlob blockBlob = container.GetBlockBlobReference(outputFolder.Substring(1) + "/part-r-00000"); using (var stream = blockBlob.OpenRead()) { using (StreamReader reader = new StreamReader(stream)) { while (!reader.EndOfStream) { System.Console.WriteLine(reader.ReadLine()); } } } } else { // fetch stderr output in case of failure var output = _hdiJobManagementClient.JobManagement.GetJobErrorLogs(jobId, storageAccess); using (var reader = new StreamReader(output, Encoding.UTF8)) { string value = reader.ReadToEnd(); System.Console.WriteLine(value); } } } } }
Prima F5 para executar a aplicação.
Para executar a tarefa novamente, tem de alterar o nome da pasta de saída da tarefa, no exemplo é /example/data/davinciwordcount
.
Quando a tarefa for concluída com êxito, a aplicação imprime o conteúdo do ficheiro part-r-00000
de saída .
Passos seguintes
Neste artigo, aprendeu várias formas de criar um cluster do HDInsight. Para saber mais, leia os artigos seguintes:
- Para submeter uma tarefa do Hive, veja Executar consultas do Apache Hive com o SDK .NET do HDInsight.
- Para criar clusters do HDInsight, veja Criar clusters do Apache Hadoop baseados em Linux no HDInsight.
- Para gerir clusters do HDInsight, veja Gerir clusters do Apache Hadoop no HDInsight.
- Para saber mais sobre o SDK .NET do HDInsight, veja Referência do SDK .NET do HDInsight.
- Para uma autenticação não interativa no Azure, veja Create non-interactive authentication .NET HDInsight applications (Criar aplicações .NET HDInsight de autenticação não interativa).