Hadoop(三)通过C#/python实现Hadoop MapReduce

MapReduce

Hadoop中将数据切分成块存在HDFS不同的DataNode中,如果想汇总,按照常规想法就是,移动数据到统计程序:先把数据读取到一个程序中,再进行汇总。

但是HDFS存的数据量非常大时,对汇总程序所在的服务器将产生巨大压力,并且网络IO也十分消耗资源。

为了解决这种问题,MapReduce提出一种想法:将统计程序移动到DataNode,每台DataNode(就近)统计完再汇总,充分利用DataNode的计算资源。YARN的调度决定了MapReduce程序所在的Node。

MapReduce过程

  1. 确保数据存在HDFS上

  2. MapReduce提交给ResourceManager(RM),RM创建一个Job。

  3. 文件分片,默认将一个数据块作为一个分片。

  4. Job提交给RM,RM根据Node状态选择一台合适的Node调度AM,AM向RM申请资源,RM调度合适的NM启动Container,Container执行Task。

  5. Map的输出放入环形内存缓冲区,缓存溢出时,写入磁盘,写入磁盘有以下步骤

    1. 默认根据Hash分区,分区数取决于Reduce Task的数,相同Key的记录被送到相同Reduce处理

    2. 将Map输出的结果排序

    3. 将Map数据合并

    4. MapTask处理后产生多个溢出文件,会将多个溢出文件合并,生成一个经过分区和排序的MapOutFile(MOF),这个过程称为Spill

  6. MOF输出到3%时开始进行Reduce Task

  7. MapTask与ReduceTask之间传输数据的过程称为Shuffle。

下面这个图描述了具体的流程

73295791af561e94b2b11b1c6f7ff21d.png

Hadoop Streaming

Hadoop中可以通过Java来编写MapReduce,针对不熟悉Java的开发者,Hadoop提供了通过可执行程序或者脚本的方式创建MapReduce的Hadoop Streaming。

Hadoop streaming处理步骤

hadoop streaming通过用户编写的map函数中标准输入读取数据(一行一行地读取),按照map函数的处理逻辑处理后,将处理后的数据由标准输出进行输出到下一个阶段。

reduce函数也是按行读取数据,按照函数的处理逻辑处理完数据后,将它们通过标准输出写到hdfs的指定目录中。

不管使用的是何种编程语言,在map函数中,原始数据会被处理成<key,value>的形式,但是key与value之间必须通过\t分隔符分隔,分隔符左边的是key,分隔符右边的是value,如果没有使用\t分隔符,那么整行都会被当作key

C#版MapReduce

首先,新增测试数据

vi mpdataI love Beijing
I love China
Beijing is the capital of China

然后,将文件上传到hdfs

[root@localhost ~]# hadoop fs -put mrdata /chesterdata

新建dotnet6的console项目mapper,修改Program.cs

using System;
using System.Text.RegularExpressions;namespace mapper
{class Program{static void Main(string[] args){string line;//Hadoop passes data to the mapper on STDINwhile((line = Console.ReadLine()) != null){// We only want words, so strip out punctuation, numbers, etc.var onlyText = Regex.Replace(line, @"\.|;|:|,|[0-9]|'", "");// Split at whitespace.var words = Regex.Matches(onlyText, @"[\w]+");// Loop over the wordsforeach(var word in words){//Emit tab-delimited key/value pairs.//In this case, a word and a count of 1.Console.WriteLine("{0}\t1",word);}}}}
}

发布mapper

cd /demo/dotnet/mapper/
dotnet publish  -c Release -r linux-x64 /p:PublishSingleFile=true

新建dotnet6的console项目reducer,修改Program.cs

using System;
using System.Collections.Generic;namespace reducer
{class Program{static void Main(string[] args){//Dictionary for holding a count of wordsDictionary<string, int> words = new Dictionary<string, int>();string line;//Read from STDINwhile ((line = Console.ReadLine()) != null){// Data from Hadoop is tab-delimited key/value pairsvar sArr = line.Split('\t');// Get the wordstring word = sArr[0];// Get the countint count = Convert.ToInt32(sArr[1]);//Do we already have a count for the word?if(words.ContainsKey(word)){//If so, increment the countwords[word] += count;} else{//Add the key to the collectionwords.Add(word, count);}}//Finally, emit each word and countforeach (var word in words){//Emit tab-delimited key/value pairs.//In this case, a word and a count of 1.Console.WriteLine("{0}\t{1}", word.Key, word.Value);}}}
}

发布reducer

/demo/dotnet/reducer
dotnet publish  -c Release -r linux-x64 /p:PublishSingleFile=true

执行mapepr reduce

hadoop jar /usr/local/hadoop323/hadoop-3.2.3/share/hadoop/tools/lib/hadoop-streaming-3.2.3.jar -input /chesterdata/mrdata -output /dotnetmroutput -mapper "./mapper" -reducer "./reducer" -file /demo/dotnet/mapper/bin/Release/net6.0/linux-x64/publish/mapper -f /demo/dotnet/reducer/bin/Release/net6.0/linux-x64/publish/reducer

查看mapreduce结果

[root@localhost reducer]# hadoop fs -ls /dotnetmroutput-rw-r--r--   1 root supergroup          0 2022-05-01 16:40 /dotnetmroutput/_SUCCESS
-rw-r--r--   1 root supergroup         55 2022-05-01 16:40 /dotnetmroutput/part-00000

查看part-00000内容

[root@localhost reducer]# hadoop fs -cat /dotnetmroutput/part-00000Beijing 2
China   2
I       2
capital 1
is      1
love    2
of      1
the     1

可以看到dotnet模式的Hadoop Streaming已经执行成功。

Python版MapReduce

使用与dotnet模式下同样的测试数据,编写mapper

# mapper.py
import sys
import re
p = re.compile(r'\w+')
for line in sys.stdin:words = line.strip().split(' ')for word in words:w = p.findall(word)if len(w) < 1:continues = w[0].strip().lower()if s != "":print("%s\t%s" % (s, 1))

编写reducer

# reducer.py
import sys
res = dict()
for word_one in sys.stdin:word, one = word_one.strip().split('\t')if word in res.keys():res[word] = res[word] + 1else:res[word] = 1
print(res)

执行mapreduce

hadoop jar /usr/local/hadoop323/hadoop-3.2.3/share/hadoop/tools/lib/hadoop-streaming-3.2.3.jar -input /chesterdata/mrdata -output /mroutput -mapper "python3 mapper.py" -reducer "python3 reducer.py" -file /root/mapper.py -file /root/reducer.py

查看mapreduce结果

[root@localhost lib]# hadoop fs -ls /mroutput-rw-r--r--   1 root supergroup          0 2022-05-01 05:00 /mroutput/_SUCCESS
-rw-r--r--   1 root supergroup         89 2022-05-01 05:00 /mroutput/part-00000

查看part-00000内容

[root@localhost lib]# hadoop fs -cat /mroutput/part-00000{'beijing': 2, 'capital': 1, 'china': 2, 'i': 2, 'is': 1, 'love': 2, 'of': 1, 'the': 1}

可以看到python模式的Hadoop Streaming已经执行成功。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/288196.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python简介及环境安装

Python的创始人为荷兰人吉多范罗苏姆 。1989年圣诞节期间&#xff0c;在阿姆斯特丹&#xff0c;Guido为了打发圣诞节的无趣&#xff0c;决心开发一个新的脚本解释程序&#xff0c;作为ABC语言的一种继承。 Python是一种跨平台的计算机程序设计语言。 是一个高层次的结合了解释…

晋中学院计算机考研,晋中学院有多少人死在考研路上

晋中学院有多少人死在考研路上(2011-05-23 20:34:30)标签&#xff1a;日记杂谈有一句话叫作&#xff1a;长江后浪推前浪,前浪死在沙滩上&#xff0c;用来形容少年老成与故人的可怜。转眼间到了谋取出路的时候了&#xff0c;班上几乎所有的人都在那里嚷嚷的要考研&#xff0c;但…

解决ArcGIS 9.3卸载时出现invalid install.log file的方法

地信君都知道,ArcGIS 9.3 License卸载时常出现“invalid install.log file”的错误提示,而导致卸载失败,如下:

使用virt-install安装kvm虚拟机时需要的问题

使用virt-install安装kvm虚拟机时需要的问题今天在做kvm的实验时&#xff0c;使用virt-install安装虚拟机的过程中遇到了一些问题&#xff0c;其中有一个问题弄了好久都没有弄好&#xff0c;不过现在已经好了。由于我使用virt-install命令安装虚拟机的&#xff0c;其命令如下&a…

从同步函数 hello-world-dotnet 开始探索OpenFunction

OpenFunction[1] 是一个现代化的云原生 FaaS&#xff08;函数即服务&#xff09;框架&#xff0c;它引入了很多非常优秀的开源技术栈&#xff0c;包括 Knative、Tekton、Shipwright、Dapr、KEDA 等&#xff0c;这些技术栈为打造新一代开源函数计算平台提供了无限可能&#xff1…

还不会制作游戏脚本解放双手?那是你不会超强自动化框架AirTest!

最近朋友问我能不能写一个自动化&#xff0c;帮他解放一下双手。我想了想&#xff0c;在我知识里很多辅助脚本制作工具&#xff0c;想想那些可能会有一堆局限性&#xff0c;想到了Python有自动化测试游戏框架或者工具&#xff0c;但是一直没有了解&#xff0c;搜了下资料&#…

AirTest 基本使用及框架浅剖析——五分钟上手制作游戏辅助

简介 Airtest Project 是为编写自动化脚本&#xff0c;达到提升测试效率的一整套解决方案。它可以轻松的扩展到多平台、多引擎上&#xff1b;如基础的 Android和IOS手机应用、App&#xff1b;Windows上的应用等。 学习使用 Airtest Project 很容易&#xff0c;由于 Airtest P…

计算机组成原理xchg,8088数据传送指令-计算机组成原理与汇编语言-电子发烧友网站...

3.2.1 数据传送指令1. MOVOPRD1,OPRD2MOV是操作码&#xff0c;OPRD1和OPRD2分别是目的操作数和源操作数。该指令可把一个字节或一个字操作数从源地址传送到目的地址。源操作数可以是累加器、寄存器、存贮器以及立即操作数&#xff0c;而目的操作数可以是累加器、寄存器和存贮器…

Facebook用户遭遇千年虫:瞬间有了46年老友

一些Facebook用户今天碰到了一个有趣的bug&#xff0c;系统提示他们与好友有了46年长的好友关系。要知道&#xff0c;Facebook还不到15岁&#xff0c;很多用户也没有46岁的高龄。Facebook一直没有透露产生这个bug的原因&#xff0c;但它说已经意识到该问题。“我们已经确定了这…

(上)python3 selenium3 从框架实现代码学习selenium让你事半功倍

本文感谢以下文档或说明提供的参考。 Selenium-Python中文文档 Selenium Documentation Webdriver 参考 如有错误欢迎在评论区指出&#xff0c;作者将即时更改。 环境说明 操作系统&#xff1a;Windows7 SP1 64python 版本&#xff1a;3.7.7浏览器&#xff1a;谷歌浏览器浏览…

.NET 7 中的 HostApplicationBuilder

.NET 7 Preview 3 引入的 HostApplicationBuilderIntro在 .NET 6 中&#xff0c;ASP.NET Core 引入了 Minimal API&#xff0c;对于简单的应用使用 Minimal API 我们可以使用非常精简的代码来实现我们的 API&#xff0c;在 .NET 7 Preview 3 中&#xff0c;引入了一个 HostAppl…

SQL Server 2008 R2 Developer Edition图文安装教程

本文主要以截图的方式,详细说明SQL Server 2008 R2 Developer Edition的安装过程。 1、双击安装包中的setup.exe,如下图,点击“安装”→“全新安装或现有安装添加功能”。 2、点击“确定”。 3、点击“下一步”。

新款ATM恶意软件Alice 可对抗动态分析 但目前需要物理接触主机

趋势科技&#xff08;Trend Micro&#xff09;安全公司的研究人员警告称&#xff0c;新发现的恶意软件家族主要针对ATM机&#xff08;自动取款机&#xff09;&#xff0c;唯一目的就是要掏空ATM机保险箱里的现金。 alice软件是什么 这款恶意软件被称为“Alice”&#xff0c;是迄…

(下)python3 selenium3 从框架实现代码学习selenium让你事半功倍

上一篇博文简要 在上一篇博文中已得知&#xff1a;使用 execute 向远程服务器发送请求会通过 webdriver 与浏览器交互&#xff0c;且发送已定义的命令常量可获得一些相关信息。 其中 execute 方法实现已经在上一篇博文中有实现说明。并且在我们已经知道 webdriver基类&#x…

【空间数据库技术】ArcSDE 10.1安装配置与企业级地理空间数据库的建立及连接

1、工具: (1)ArcGIS Desktop 10.1 (2)SQL Server 2008 R2 (3)ArcSDE 10.1 2、安装过程 (1)ArcGIS Desktop 10.1的安装 请参照:ArcGIS 10.2 Desktop完全破解图文安装教程 (2)SQL Server 2008 R2的安装 请参照:SQL Server 2008 R2 Developer Edition图文安装教…

点对点 客户端-服务器 聊天程序

服务器&#xff0c;客户端都是父进程、子进程分别负责发送、接收字符串。 另外使用了信号函数来发送和接收处理信号&#xff0c;比如当子进程结束时&#xff0c;传递一个信号给父进程&#xff0c;然后父进程会执行信号处理函数。 服务器端&#xff1a; 1 #include<stdio.h&g…

C# 使用压缩流和 Brotli

如前所述&#xff0c;流的一个特性是可以将它们链接起来。为了压缩流&#xff0c;只需要创建 DeflateStream&#xff0c;并给构造函数传递另一个流(在这个例子中&#xff0c;是写入文件的outputStream)&#xff0c;使用 CompressionMode. Compress 表示压缩。使用 Write方法或其…

高考610考哪个计算机学校,2019年高考成绩610分_615分左右能报考上什么学校 文科理科大学名单推荐...

一眨眼&#xff0c;高考已经结束一段时间了&#xff1b;早晨猛地一睁眼&#xff0c;还在抱怨妈妈怎么不叫你起床&#xff0c;才突然发现今天你已经不用去学校了,这场全国性的考试高考已经结束了&#xff1b;高考这个城门攻破之后&#xff0c;还有大把壁垒再等你去攻克&#xff…

Power的力量

ZD至顶网服务器频道 08月26日 新闻消息&#xff08;文/董培欣&#xff09;&#xff1a;谈到企业级服务器市场&#xff0c;人们首先想到的会是x86 E5、E7系列的CPU产品&#xff0c;IBM在企业级市场推出的Power Systems服务器产品很少会被用户了解。可是在今年春天举行的OpenPOWE…

C#语法糖系列 —— 第三篇:聊聊闭包的底层玩法

有朋友好奇为什么将 闭包 归于语法糖&#xff0c;这里简单声明下&#xff0c;C# 中的所有闭包最终都会归结于 类 和 方法&#xff0c;为什么这么说&#xff0c;因为 C# 的基因就已经决定了&#xff0c;如果大家了解 CLR 的话应该知道&#xff0c; C#中的类最终都会用 MethodTab…