Hadoop for .NET Developers(八):以编程方式将数据加载到HDFS

来源:互联网 发布:知乎 开源服务器监控 编辑:程序博客网 时间:2024/06/11 04:38

在本系列的最后一篇博文中,我们讨论了如何手动将数据加载到集群。虽然这对偶尔的需求是适用的,但是编程访问是更为方便,更为典型的方案。为了实现这一点,Hadoop在HTTP端口50070上提供了一个REST接口。当您可以直接对该接口编程数据加载时,.NET SDK可以使用WebHDFS客户端来简化此过程。

要使用WebHDFS客户端,您必须了解在加载数据的集群中使用哪个存储系统。默认情况下,WebHDFS客户端假定目标集群采用HDFS。 (如果您在Azure中加载到HDInsight,则AVS将在那里使用,并且客户端使用一些稍微不同的步骤来加载数据。使用WebHDFS在Azure中将数据加载到HDInsight的示例可以在线文档中获取。)在本文中,我们将重点关注使用WebHDFS客户端对本地桌面开发集群使用HDFS。只要集群使用HDFS,这些步骤同样适用于集群无论本地还是远程应用程序:

1.启动Visual Studio并创建一个新的C#控制台应用程序。

2.使用NuGet软件包管理器,将Hadoop WebClient软件包的Microsoft .NET API添加到您的项目中。

3.如果尚未打开,请打开Program.cs文件并添加以下指令:

using Microsoft.Hadoop.WebHDFS;

在main方法中添加如下代码:

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using Microsoft.Hadoop.WebClient;using Microsoft.Hadoop.WebHDFS;namespace MyApp{    class Program    {        static void Main(string[] args)        {                //设置变量                string srcFileName = @"E:\tmp\dku.txt";                string destFolderName = "/demo/dku/in";                string destFileName = "dku.txt";                //连接到hadoop集群                 Uri myUri = new Uri("http://localhost:50070");                string userName = "hadoop";                //hadoop用户是hadoop中的默认用户帐户,将被标识为我们上传的文件的“所有者”                //WebHDFSClient myClient = new WebHDFSClient(myUri, userName);                //由于把hdfs-site.xml配置文件中dfs.permissions属性 设置false               WebHDFSClient myClient = new WebHDFSClient(myUri, "");                //放置目标目录(如果存在)               //myClient.DeleteDirectory(destFolderName, true).Wait();               //创建目标目录                //myClient.CreateDirectory(destFolderName).Wait();                //将文件加载到目标目录                myClient.CreateFile(srcFileName, destFolderName + "/" + destFileName).Wait();                 //列出目标目录的文件内容                Console.WriteLine();                Console.WriteLine("Contents of " + destFolderName);                myClient.GetDirectoryStatus(destFolderName).ContinueWith(                     ds => ds.Result.Files.ToList().ForEach(                     f => Console.WriteLine("t" + f.PathSuffix)                     ));                //保持命令窗口打开,直到用户按下Enter键                Console.ReadLine();        }    }}

5.运行应用程序将文件加载到目标文件夹。

大多数代码很简单。它从连接到我们的本地集群开始,标识为http://localhost:50070。hadoop用户是hadoop中的默认用户帐户,将被标识为我们上传的文件的“所有者”。

一旦连接,就会发送删除目的地文件夹的指令,然后发出一条指令来创建目标文件夹。我们可以在这里更复杂,但这个简单的代码可以完成工作。

然后使用源文件的内容在HDFS中创建一个文件。当我们在本地桌面开发集群上运行时,源文件恰好驻留在名称节点上,但这不是必须的,对WebHDFS客户端来说。唯一的必须要求是我们的应用程序可以访问源文件,并且可以访问目标文件夹。

创建文件后,将检索目标文件夹的内容并将其打印到控制台屏幕中,以供我们查看。

该代码的唯一棘手因素是在各种调用上使用Wait方法。默认情况下,由WebHDFS客户端进行的REST调用是异步的,使用Wait方法会强制代码等待完成,然后再继续执行下一行。据我所知,在执行之前,您的代码不需要等待,但是由于此示例在执行中非常线性,所以等待有意义。有关并行任务执行和使用Wait方法的更多详细信息,请参见官方文档。

运行结果如图:

这里写图片描述


这里写图片描述

阅读全文
0 0
原创粉丝点击