NET实现Hadoop增删改查

简介:

packages.config

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="Microsoft.AspNet.WebApi.Client" version="4.0.20505.0" targetFramework="net46" />
  <package id="Microsoft.Data.Edm" version="5.2.0" targetFramework="net46" />
  <package id="Microsoft.Data.OData" version="5.2.0" targetFramework="net46" />
  <package id="Microsoft.Hadoop.WebClient" version="0.12.5126.42915" targetFramework="net46" />
  <package id="Microsoft.Net.Http" version="2.0.20505.0" targetFramework="net46" />
  <package id="Microsoft.WindowsAzure.ConfigurationManager" version="1.8.0.0" targetFramework="net46" />
  <package id="Newtonsoft.Json" version="4.5.11" targetFramework="net46" />
  <package id="System.Spatial" version="5.2.0" targetFramework="net46" />
  <package id="WindowsAzure.Storage" version="2.0.4.1" targetFramework="net46" />
</packages>

HDFSAccess.cs

using Microsoft.Hadoop.WebHDFS;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;

namespace Physical
{
    public sealed class HDFSAccess
    {
        private readonly WebHDFSClient webHDFSClient;

        public HDFSAccess(string uriString, string userName)
        {
            this.webHDFSClient = new WebHDFSClient(new Uri(uriString), userName);
        }

        public List<string> GetDirectories(string path)
        {
            var directoryStatus = this.webHDFSClient.GetDirectoryStatus(path).Result;

            return directoryStatus.Directories.Select(d => d.PathSuffix).ToList();
        }

        public List<string> GetFiles(string path)
        {
            var directoryStatus = this.webHDFSClient.GetDirectoryStatus(path).Result;

            return directoryStatus.Files.Select(d => d.PathSuffix).ToList();
        }

        public bool CreateDirectory(string path)
        {
            // 传入路径不包含根目录时,预设会在根目录「/」底下
            return this.webHDFSClient.CreateDirectory(path).Result;
        }

        public bool DeleteDirectory(string path)
        {
            // 传入路径不包含根目录时,预设会在根目录「/」底下
            return this.webHDFSClient.DeleteDirectory(path).Result;
        }

        public string CreateFile(string localFile, string remotePath)
        {
            // 传入远端路径不包含根目录时,预设会在根目录「/」底下
            return this.webHDFSClient.CreateFile(localFile, remotePath).Result;
        }

        public bool DeleteFile(string path)
        {
            // 传入路径不包含根目录时,预设会在根目录「/」底下
            return this.webHDFSClient.DeleteDirectory(path).Result;
        }

        public HttpResponseMessage OpenFile(string path)
        {
            // 传入路径不包含根目录时,预设会在根目录「/」底下
            return this.webHDFSClient.OpenFile(path).Result;
        }
    }
}

Program.cs

using Physical;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MyTest
{
    class Program
    {
        // HDFS cluster 客户端进入端点设定于 主机上
        // 预设端点:http://[主机名称]:50070
        // 预设帐号:Wu
        private static HDFSAccess access = new HDFSAccess(@"http://127.0.0.1:50070", "Wu");

        static void Main(string[] args)
        {
            GetDirectoriesTest();
            Console.WriteLine("----------------------------------------------");
            GetFilesTest();
            Console.WriteLine("----------------------------------------------");
            DirectoryTest();
            Console.WriteLine("----------------------------------------------");
            FileTest();
            Console.WriteLine("----------------------------------------------");
            OpenFileTest();
            Console.ReadKey();
        } 

        public void TestCleanup()
        {
            //取得根目录资料夹
            var directories = access.GetDirectories(@"/");

            // 移除预设目录:tmp、user 外的目录
            foreach (var directory in directories)
            {
                if ("tmp".Equals(directory) || "user".Equals(directory))
                {
                    continue;
                }
                else
                {
                    access.DeleteDirectory(directory);
                }
            }

            // 取得根目录档案
            var files = access.GetFiles(@"/");

            // 移除所有档案
            foreach (var file in files)
            {
                access.DeleteFile(file);
            }

            // 移除 OpenFile 转存档案
            File.Delete(Path.Combine(Directory.GetCurrentDirectory(), "Test.jpg"));
        }

        //_传入根目录_预期回传预设目录
        public static void GetDirectoriesTest()
        {
            // 预设根目录下有两个目录:tmp、user
            var expected = new List<string>() { "tmp", "user", };

            var actual = access.GetDirectories(@"/");

            foreach (var item in actual)
            {
                Console.WriteLine(item);
            }
           
        }

        //_传入根目录_预期回传空集合
        public static void GetFilesTest()
        {
            // 预设根目录下没有档案
            var expected = new List<string>();

            var actual = access.GetFiles(@"/");
            foreach (var item in actual)
            {
                Console.WriteLine(item);
            }

        }

        //_建立zzz目录_预期成功_预期根目录下有zzz目录_删除zzz目录_预期成功_预期根目录下无zzz目录
        public static void DirectoryTest()
        {
            var directoryName = "zzz";

            // 建立zzz目录
            var boolCreateDirectory = access.CreateDirectory(directoryName);

            Console.WriteLine("建立zzz目录_预期成功:"+boolCreateDirectory);
           
            // 建立zzz目录_预期成功_预期根目录下有zzz目录
            // 预设根目录下有三个目录:tmp、user、zzz
            var expectedCreateDirectory = new List<string>() { "tmp", "user", directoryName, };

            var actualCreateDirectory = access.GetDirectories(@"/");


            foreach (var item in actualCreateDirectory)
            {
                Console.WriteLine(item);
            }

            Console.WriteLine("********************************************");
            // 删除zzz目录
            var boolDeleteDirectory = access.DeleteDirectory(directoryName);

            Console.WriteLine("删除zzz目录_预期成功:" + boolDeleteDirectory);
            

            // 删除zzz目录_预期成功_预期根目录下无zzz目录
            // 预设根目录下有两个目录:tmp、user
            var expectedDeleteDirectory = new List<string>() { "tmp", "user", };

            var actualDeleteDirectory = access.GetDirectories(@"/");

            foreach (var item in actualDeleteDirectory)
            {
                Console.WriteLine(item);
            }
        }

        //_建立Test档案_预期根目录下有Test档案_删除Test档案_预期成功_预期根目录下无Test档案
        public static void FileTest()
        {
            var localFile = Path.Combine(Directory.GetCurrentDirectory(), "TestFolder", "Test.jpg");

            var remotePath = "Test.jpg";

            // 建立Test档案
            var boolCreateFile = access.CreateFile(localFile, remotePath);

            // 建立Test档案_预期根目录下有Test档案
            var expectedCreateFile = new List<string>() { remotePath, };

            var actualCreateFile = access.GetFiles(@"/");

            foreach (var item in actualCreateFile)
            {
                Console.WriteLine(item);
            }
            Console.WriteLine("********************************************");
            // 删除Test档案
            var boolDeleteFile = access.DeleteDirectory(remotePath);

            Console.WriteLine("删除Test档案_预期成功:"+boolDeleteFile);

            // 删除Test档案_预期成功_预期根目录下无Test档案
            var expectedDeleteFile = new List<string>();

            var actualDeleteFile = access.GetFiles(@"/");

            foreach (var item in actualDeleteFile)
            {
                Console.WriteLine(item);
            }
        }

        //_建立Test档案_预期根目录下有Test档案_取得Test档案_预期成功_预期回传Test档案Stream并转存成功
        public static void OpenFileTest()
        {
            var localFile = Path.Combine(Directory.GetCurrentDirectory(), "TestFolder", "Test.jpg");
            var remotePath = "Test.jpg";
            var saveFile = Path.Combine(Directory.GetCurrentDirectory(), "Test.jpg");

            Console.WriteLine("saveFile:" + saveFile);
            Console.WriteLine("********************************************");
            // 建立Test档案
            var boolCreateFile = access.CreateFile(localFile, remotePath);

            // 建立Test档案_预期根目录下有Test档案
            var expectedCreateFile = new List<string>() { remotePath, };

            var actualCreateFile = access.GetFiles(@"/");

            foreach (var item in actualCreateFile)
            {
                Console.WriteLine(item);
            }
            

            Console.WriteLine("********************************************");
            // 取得Test档案
            var response = access.OpenFile(remotePath);

            // 取得Test档案_预期成功
            response.EnsureSuccessStatusCode();

            // 取得Test档案_预期成功_预期回传Test档案Stream并转存成功
            using (var fs = File.Create(saveFile))
            {
                response.Content.CopyToAsync(fs).Wait();
            }

            Console.WriteLine(File.Exists(saveFile));
          
        }
    }
}

运行结果如图:

这里写图片描述

相关文章
|
2月前
|
SQL 开发框架 .NET
ASP.NET Web——GridView完整增删改查示例(全篇幅包含sql脚本)大二结业考试必备技能
ASP.NET Web——GridView完整增删改查示例(全篇幅包含sql脚本)大二结业考试必备技能
33 0
|
开发框架 前端开发 .NET
ASP.NET MVC增删改查带图片路径读取
ASP.NET MVC增删改查带图片路径读取
144 0
ASP.NET MVC增删改查带图片路径读取
|
开发框架 前端开发 .NET
[原创]Asp.net MVC 学习之路-003(增删改查,后端手工,前端生成)
[原创]Asp.net MVC 学习之路-003(增删改查,后端手工,前端生成)
[原创]Asp.net MVC 学习之路-003(增删改查,后端手工,前端生成)
|
关系型数据库 测试技术 API
asp.net core webapi 使用ef 对mysql进行增删改查,并生成Docker镜像构建容器运行
1.构建运行mysql容器,添加数据库user 参考Docker创建运行多个mysql容器,地址 http://www.cnblogs.com/heyangyi/p/9288402.html 添加user数据库,添加tbusers表 2.
2960 0
|
Web App开发 前端开发 .NET
ASP.NET MVC Web API 学习笔记---联系人增删改查
本章节简单介绍一下使用ASP.NET MVC Web API 做增删改查。目前很多Http服务还是通过REST或者类似RESP的模型来进行数据操作的。下面我们通过创建一个简单的Web API来管理联系人          说明:为了方便数据不使用真正的数据库,而是通过内存数据模拟    1.
1094 0
|
Web App开发 JavaScript 数据库
.NET Core实战项目之CMS 第十五章 各层联动工作实现增删改查业务
连着两天更新叙述性的文章大家可别以为我转行了!哈哈!今天就继续讲讲我们的.NET Core实战项目之CMS系统的教程吧!这个系列教程拖得太久了,所以今天我就以菜单部分的增删改查为例来讲述下我的项目分层之间的协同工作吧!如果你觉得文中有任何不妥的地方还请留言或者加入DotNetCore实战千人交流群637326624跟大伙进行交流讨论吧! 本文已收录至《.
2084 0
|
.NET 数据库 开发框架
ASP.NET CORE系列【二】使用Entity Framework Core进行增删改查
原文:ASP.NET CORE系列【二】使用Entity Framework Core进行增删改查 介绍 EntityFrameworkCore EF core 是一个轻量级的,可扩展的EF的跨平台版本。
1620 0
|
.NET 开发框架 中间件
ASP.NET CORE系列【三】使用Entity Framework Core进行增删改查
原文:ASP.NET CORE系列【三】使用Entity Framework Core进行增删改查 身份验证 以前我们熟悉的web.config中配置的form验证,现在没有了。我们来看看在Core里面如何配置; 首先需要NuGet安装一个包:Microsoft.
1753 0
|
SQL Oracle 关系型数据库

相关实验场景

更多