Hadoop for .NET Developers(十二):实现简单的MapReduce作业

【Hadoop】Hadoop 机架感知配置、原理 Hadoop机架感知1.背景Hadoop在设计时考虑到数据的安全与高效,数据文件默认在HDFS上存放三份,存储策略为本地一份,同机架内其它某一节点上一份,不同机架的某一节点上一份。这样如果本地数据损坏,节点可以从同一机架内的相邻节点拿到数据,速度肯定比从跨机架节点上拿数据要快;同时,如果整个机架的网络出现异常,也能保证在其它机架的节点上找到数据。为了降低整体的带宽消耗和读取延时,HDFS会尽量让读... 阅读详情

在本练习中,我们将使用C#和.NET SDK编写并执行非常简单的MapReduce作业。本练习的目的是说明MapReduce背后的最基本概念。

我们将创建的作业将在以前的博客文章中加载到本地桌面开发环境的integers.txt示例文件中运行。您可能会记得该文件由1到10,000之间的整数值列表组成,每个整数占据自己的行。

我们将写的map函数将接受一行(一个整数),确定该值是偶数还是奇数,并相应地发出一个“even”或“odd”的整数值。我们将写的reduce函数将接受与给定键相关联的所有整数值,即“even”或“odd”,然后对这些值进行计数和求和。然后,reduce函数将再次以“even”或“odd”的键值格式发出结果,并将相关的计数和和作为值分隔为简单选项卡。

要开始,请执行以下步骤:

  1. 启动Visual Studio并打开一个新的C#控制台应用程序项目。
  2. 使用NuGet将以下软件包添加到项目中:
Microsoft .NET Map Reduce API forHadoop
Microsoft ASP.NET Web API

3.如果Program.cs文件尚未打开,请打开它。

4.将以下指令添加到程序中:

using Microsoft.Hadoop;
using Microsoft.Hadoop.MapReduce;
using Microsoft.Hadoop.WebClient.WebHCatClient;

现在环境准备好编写MapReduce例程。 我们的下一步将是写一个Mapper类:

1.在程序中,导航到定义程序类结束的大括号。

2.将以下类添加到代码中:

using Microsoft.Hadoop.MapReduce;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MyApp
{
    public class MySimpleMapper : MapperBase
    {

        public override void Map(string inputLine, MapperContext context)
        {

            //将传入的行解释为整数值
            int value = int.Parse(inputLine);

            //确定值是偶数还是奇数

            string key = (value % 2 == 0) ? "even" : "odd";

            //输出键分配值

            context.EmitKeyValue(key, value.ToString());

        }

    }
}

在这段代码中,你会注意到Mapper类继承了MapperBase类。我们覆盖该类的Map方法来编写我们自己的Map方法。 Map方法接受来自输入文件的数据作为字符串和对MapperContext对象的引用,这是我们将通信回到MapReduce环境的手段。

由于输入数据由单个整数值组成,所以我们简单地将其转换为int数据类型,然后使用简单的模数计算来确定该值是偶数还是奇数,将“偶数”或“奇数”写入键字符串变量基于结果。该键值与原始整数值一起通过使用EmitKeyValue函数的上下文对象返回给MapReduce环境。请注意,EmitKeyValue函数仅接受字符串,以便将整数值转换为字符串数据类型作为调用的一部分。

现在我们将编写reduce函数:

  1. 在程序中,导航到定义Mapper类的结尾的大括号。
  2. 将以下类添加到代码中:
using Microsoft.Hadoop.MapReduce;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MyApp
{
    public class MySimpleReducer : ReducerCombinerBase
    {
        public override void Reduce(string key, IEnumerable<string> values, ReducerCombinerContext context)
        {

            //初始化计数器

            int myCount = 0;

            int mySum = 0;


            //计算和汇总输入值

            foreach (string value in values)
            {

                mySum += int.Parse(value);

                myCount++;

            }


            //输出结果

            context.EmitKeyValue(key, myCount + "t" + mySum);

        }
    }
}

我们的Reducer类继承ReducerCombiner类并覆盖Reduce方法。 Reduce方法接受单个键值(作为字符串)和其关联值的无数集合。 Reduce方法还通过上下文对象接收对MapReduce环境的引用。

Reduce方法中的代码非常简单。 我们循环遍历值的集合,递增计数并在循环时加起值。 一旦完成,原始键值将与我们之前计算的计数和总和值一起返回。 请注意,myCount和mySum变量未显式转换为字符串。 通过将这些值与tab-string分隔符相连,+运算符对我们执行隐式转换。

现在我们已经定义了Mapper和Reducer类,我们可以创建一个MapReduce作业。 为此,请按照下列步骤操作:

  1. 导航到Program类中的Main方法。
  2. 为该类添加以下代码:
using Microsoft.Hadoop.MapReduce;
using Microsoft.Hadoop.WebClient.WebHCatClient;
using Microsoft.Hadoop.WebHDFS;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MyApp
{
     public class SimpleMapReduceJob
    {
         public void test()
         {
             //建立作业配置

             HadoopJobConfiguration myConfig = new HadoopJobConfiguration();

             myConfig.InputPath = "/demo/simple/in";

             myConfig.OutputFolder = "/demo/simple/out";


             //连接到集群

             Uri myUri = new Uri("http://localhost:50070");

             //string userName = "hadoop";
             string userName = "hadoop";

             string passWord = null;

             //IHadoop myCluster = Hadoop.Connect(myUri, "", "");
              IHadoop myCluster = Hadoop.Connect();


             //执行mapreduce作业

             MapReduceResult jobResult = myCluster.MapReduceJob.Execute<MySimpleMapper, MySimpleReducer>(myConfig);



             //将作业结果写入控制台

             int exitCode = jobResult.Info.ExitCode;



             string exitStatus = "Failure";

             if (exitCode == 0)
             {
                 exitStatus = "Success";
             }

             exitStatus = exitCode + " (" + exitStatus + ")";

             Console.WriteLine();

             Console.Write("Exit Code = " + exitStatus);

             Console.Read();

         }
    }
}

在代码的顶部,我们定义一个HadoopJobConfiguration对象来保存作业配置信息,例如保存输入文件的文件夹和文件夹到输出应该被引导到的位置。请注意,默认情况下,MapReduce作业将访问输入文件夹中的所有文件,并删除目标文件夹中的所有文件。因此,最好的做法是使用文件夹结构和命名方案,将输入文件保存在一起,并将不同作业的输出隔离。

接下来,我们连接到我们本地的Hadoop集群。连接非常简单,在这个例子中,我们仅使用默认用户hadoop,它具有空密码。

接下来,我们在集群上执行MapReduceJob,并将Mapper和Reducer类识别为Map和Reduce方法的源。 Execute方法有一些实现,允许我们仅使用Mapper,Mapper和Reducer,或Mapper,Reducer或Combiner。对于这个简单的工作,我们需要使用Mapper和Reducer的版本。配置信息被传递给Execute方法,结果由MapReduceResult对象捕获。

剩下的代码仅供演示用途。我们检查作业的退出代码,将其发送到我们的控制台,并将控制台固定位置,直到用户按下一个键。

准备:

hadoop fs -rmdir --ignore-fail-on-non-empty /user

hadoop fs -rm -r -f /tmp

hadoop fs -put "E:\integers.txt" /demo/simple/in

hadoop fs -chmod -R 755 /tmp

integers.txt里面是1到2000行对应的行号数字,每个数字一行

现在是时候运行这个作业:

1.从Visual Studio,单击开始按钮。

2.几秒钟后,控制台应该出现。

3.作业完成后,请查看控制台以验证作业已成功完成。

这里写图片描述


这里写图片描述


这里写图片描述


这里写图片描述


现在工作完成了,现在是检查结果的时候了:

这里写图片描述

1.从桌面启动Hadoop命令提示符。

2.使用ls函数检查/demo/simple/out文件夹的内容,如上一篇文章所述。

3.使用cat功能检查/demo/simple/out/part-00000文件的内容,如上一篇文章所述。

hadoop fs -cat / demo / simple /out/ part - 00000

这里写图片描述

在此示例中,MapReduce确定单个reduce任务足以执行此作业的该阶段。 因此,输出文件夹中只有一个部分文件。

【信息科学与工程学】计算机科学与自动化 第二百三十三篇 凤凰架构01 编号类型领域系统软件/硬件或系统集成方案及系统架构模块子模块函数名称/算法名称算法的数学分析及计算机体系架构及数据结构与算法详细设计及参数列表及数值范围设计关联知识1共识算法分布式基石状态机复制架构:Proposer/Acceptor/Learner 多节点角色模型,基于操作转移(Operation Transfer)分布式共识PaxosPaxos 协议(Prepare/Promise/Accept/Accepted 两阶段)数学基础:多数派(Quorum)投票,基于鸽巢原理保证 W+R>N 时读写集合必有 阅读详情

相关推荐

MapReduce:在C#中

MapReduce 原则 map() : part of object -> list<(key, value)> return list<(key, value)> combine() : hash<key>> foreach ((key,value) in list<(key, value)>) { hash<key>>[key].Add(value) } return hash<key>> partition() : hash<partitionIndex>>> reduce() : hash<key> foreach ((key,values) in hash<key>>) { fore

.Net Core 操作 Hadoop HDFS --- 学习记录

Nuget 安装包 Hadoop.WebHdfs.Client 以下代码仅仅在dfs.permissions.enabled = false 的情况下做了简单测试,仅作为备忘录。 上传文件代码 public void UploadFileTest() { string srcPath = @"D:\素材\logo\linux.jpg"; string destPath = "/TestPhoto/linux.jpg"; .

HongzhuoO的专栏 2225

Yolov5 多边形标签转换,所有json文件自动转成txt格式[详细过程]

注:labelme是麻省理工(MIT)的计算机科学和人工智能实验室(CSAIL)研发的图像标注工具,人们可以使用该工具创建定制化标注任务或执行图像标注,项目源代码已经开源。通过labelme对图进行标注后,得到的是json文件,而Yolov5对数据进行模型构建的时候,读取需要的是txt格式的文件。txt_outer_path——保存txt文本的文件夹的绝对路径。json_name——json_name是json文本的名字。json_floder——读取json的文件夹的绝对路径。

Pandas_007的博客 1万+

Hadoop for .NET Developers(十四):了解MapReduce和Hadoop流

在Hadoop中,通过MapReduce作业解决数据处理。作业由基本配置信息组成,例如输入文件和输出文件夹的路径,由Hadoop的MapReduce层执行一系列任务。这些任务负责首先执行map和reduce功能,以便将输入数据转换为输出结果。为了说明MapReduce如何工作,请考虑一个简单的输入文件,其中包含制表符分隔的记录(在下图的最左侧)。为了说明的目的,每一行将被标记为A到F。MapRedu

极客神殿 2478

TI电量计BQ40Z50R2循环学习实战:从量产文件生成到关键标志位解析

本文详细解析了TI电量计BQ40Z50R2的循环学习实战流程,从量产文件生成到关键标志位解析。通过实战案例和易错分析,帮助工程师避开常见陷阱,提升电量计配置效率。重点介绍了循环学习前的准备工作、量产文件生成步骤及关键标志位的深度解读,适用于电池管理系统开发人员。

weixin_30505225的博客 439

密码学小白必看:三大顶级会议论文下载与阅读指南(附完整资源链接)

本文为密码学初学者提供了系统获取和阅读三大顶级会议(Crypto、Eurocrypt、Asiacrypt)论文的实战指南。详细介绍了通过IACR官方渠道、ePrint预印本等权威资源免费下载论文的方法,并分享了高效筛选、精读核心章节及构建个人知识体系的具体策略,帮助读者快速切入密码学研究前沿。

weixin_28363123的博客 389

如何使用.NET/C通过hive与Hadoop连接

连接到蜂巢中的数据库 介绍 在我开始告诉你我的问题之前,我已经把某些与我的问题相关的术语写下来了。所有的定义基本上都是维基百科的摘录。 什么是大数据? 大数据是收集如此庞大和复杂的数据集的术语,因此很难使用手动数据库管理工具或传统数据处理应用程序进行处理。挑战包括捕获、策划、存储、搜索、共享、传输、分析和可视化。大数据很难与使用大多数关系数据库管理系统以及桌面统计和可视化包配合使用,而是需要在数十台、数百台甚至数千台服务器上运行大规模并行软件。 什么是哈杜普? 哈多普是阿帕奇软件基金会的开源框架。它成为存储

Maynor的博客 1622

作为一名爬虫人如何实现千万级数据爬取?

爬虫门槛不高,高就高在往后余生的每一次实操都随时会让你崩溃!Bro

吴秋霖的博客 1万+

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" versi

极客神殿 2047

MTK 平台功耗优化策略全解析:Clock 管控、GPU 同步与 Preview 降帧实战方案

在中高端移动终端影像系统中,Camera 模块已成为功耗的关键来源之一,尤其是在高帧率拍摄、AI 模式实时预览等场景下,ISP、Sensor、GPU 与 SoC 时钟频率的大幅提升极易引发系统发热与续航瓶颈。MTK 平台基于多级功耗控制机制,构建了包括 Clock Gate 管理、GPU 时序协同、预览流降帧、Pipeline 低功耗切换等在内的影像功耗优化策略。本文聚焦于 MTK Camera 系统中的核心功耗控制点,基于实际项目部署案例,系统拆解其在不同模式下的节能路径设计与调试方法,为终端厂商与影像系

努力分享一些人工智能、计算机视觉、影像等相关的知识干货! 2521

飞腾平台(FT2000/4 D2000/8)配置GPIO引脚

飞腾平台配置CPU的引脚为GPIO工作模式的方式有永久型和暂时型: - 永久型是通过UEFI中的MmioWrite32函数来实现的,该方法可以在UEFI阶段就对复用引脚的工作模式配置为GPIO,并且在进入操作系统后仍然不会发生便会; - 临时型是通过rw工具,在系统下手动修改复用引脚的工作模式,该方法在系统重启后会失效,所以是暂时型的。

qq_30135687的博客 5612

Hadoop for .NET Developers(十三):实施更复杂的MapReduce作业

在我们的第一个MapReduce练习中,我们使用针对本地开发集群的.NET SDK实现了一个有目的的简单MapReduce作业。 在本练习中,我们将使用相同的SDK实现稍微更复杂的MapReduce作业,但不使用我们的基于Azure的远程群集。对于本练习,我们将使用ufo_awesome.tsv数据文件中显示的UFO Sightings数据库。 该文件由制表符分隔的数据行组成,包含以下字段:Date

极客神殿 1755

22、光无线通信调制技术详解

本文详细介绍了光无线通信中的多种调制技术,包括开关键控(OOK)、脉冲位置调制(PPM)、数字脉冲间隔调制(DPIM)、副载波强度调制(SCM)、相移键控(PSK)、正交幅度调制(QAM)以及多载波调制(MCM)如OFDM和MSIM。文章分析了各类调制技术在带宽需求、功率效率、传输容量、传输速率和PAPR等方面的性能差异,并通过Matlab仿真展示了其在AWGN信道下的误码率表现。同时,对比了不同技术的适用场景,提出了调制选择流程,并结合室内光通信与自由空间光通信的应用案例,展望了未来调制技术向高频谱效率、

net55的博客 116

Hadoop for .NET Developers

Hadoop 介绍 英文翻译

极客神殿 3209

MiniQMT国债逆回购策略Python代码全解析

通过本文的介绍,我们不仅学习了如何在MiniQMT平台上使用Python编写国债逆回购策略,还对策略的逻辑构建、代码实现以及风险管理有了深入的了解。国债逆回购策略是一种适合初学者的低风险投资方式,希望本文能帮助你在量化交易的道路上迈出坚实的一步。

木头大左的博客 1918

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Hadoop for .NET开发方式将数据加载到HDFS

Hadoop for .NET开发方式将数据加载到HDFS 参考文章:https://blog.csdn.net/WuLex/article/details/78069478 启动Visual Studio并创建一个新的C#控制台应用程序 使用NuGet软件包管理器, 将Microsoft.Hadoop.WebClient软件包的Microsoft .NET API添加到您的项目中 包括...

hsg77的专栏 4287

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

C#版的MapReduce

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace mapReduce { public static class helper { public static Dictionary MapReduce(

大龙的编程学习笔记 1942

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

C#码农的大数据之路 - 使用C#编写MR作业

写在前面 从Hadoop出现至今,大数据几乎就是Java平台专属一般。虽然Hadoop或Spark也提供了接口可以与其他语言一起使用,但作为基于JVM运行的框架,Java系语言有着天生优势。而且能找到的与大数据框架如Hadoop等使用介绍的文章也都以Java语言作为示例居多。许多C#er为了转投大数据怀抱也开始学习Java。微软为了拥抱大数据在这方面也做了许多,提供了一些工具及库使C#可以更好的

dotNET跨平台 1856

C# MapReduce 实现

public static class MapReduce{         public static Task Start(Func map, Func reduce, params TInput[] inputs)         {             var mapTasks = CreateMapTasks(map, inputs);             var r

Seven Blog 2138

谈谈 在 .Net 生态里为什么没有 Hadoop 系列 ?

在 .Net 生态里为什么没有 Hadoop 系列 ? 有需要 有 Hadoop 系列 吗 ? 转载于:https://www.cnblogs.com/KSongKing/p/9574482.html

weixin_34067980的博客 754

Hadoop安装(比较简单,适合刚入门的小伙伴)

本文介绍了Hadoop的安装,比较适合初学者,可以不用把时间浪费在这种无意义的安装上,把精力投入到实操环节

qq_63187057的博客 1265
上一篇: 从零自学Hadoop(13):Hadoop命令下
下一篇: Hadoop for .NET Developers(十三):实施更复杂的MapReduce作业
.NET跨平台
博客等级 码龄15年 6066粉丝 738原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值