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方法的更多详细信息,请参见官方文档。
运行结果如图:
- Hadoop for .NET Developers(八):以编程方式将数据加载到HDFS
- Hadoop for .NET Developers(七):手动加载数据到Hadoop
- Hadoop for .NET Developers
- Hadoop for .NET Developers(十四):了解MapReduce和Hadoop流
- Hadoop for .NET Developers(十二):实现简单的MapReduce作业
- 将HDFS数据导出到MongoDB中
- Spark将HDFS数据导入到HBase
- Spark将HDFS数据导入到HBase
- Spark将HDFS数据导入到HBase
- vb.net 将DataGridView数据导入到Excel的方式
- Debugging Strategies For .NET Developers
- linux hadoop mount 加载HDFS到本地文件系统
- hadoop创建文件夹及将本地文件移动到hdfs中
- talend 将本地文件或者mysql文件上传到hadoop/hdfs
- 如何以编程方式将一个 IMG 元素复制到剪贴板
- 如何以编程方式将一个 IMG 元素复制到剪贴板
- 通过交换分区的方式将数据以累加的形式添加到分区表中
- 通过交换分区的方式将数据以累加的形式添加到分区表中
- 通过Cookie存放用户登录信息以及安全性问题
- 16秋计算机JAVA第一节课作业(曾祥桓)
- Qt 学习之路 2(8):添加动作
- 以太网之物理层
- yii自带表单常用与ArrayHelper
- Hadoop for .NET Developers(八):以编程方式将数据加载到HDFS
- mysql 自定义函数declare group_concat()、find_in_set()
- 分库与分表带来的分布式困境与应对之策
- spring和hibernate注解整合
- 回文数
- 文件及IO流
- Openlayers系列(一)关于地图投影相关错误的解决方案
- Spring容器实例Bean的三种方法(IOC三种方法)
- TortoiseGit连接github出现disconnected no supported错误解决办法