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,一经查实,立即删除!

相关文章

EntityFramework 动态构造排序 FuncIQueryableT, IOrderedQueryableT Dynamic

using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Reflection; using System.Text; /*** * jackchain * QQ:710782046* 2017-08-31* 动态构造OrderBy Linq序列* */namespace UFX.Tools {public class Convert…

hdu 5310 Souvenir

http://acm.hdu.edu.cn/showproblem.php?pid5310 题意&#xff1a;今天是BestCoder一周年纪念日. 比赛管理员Soda想要给每个参赛者准备一个纪念品. 商店里纪念品的单价是p 元, 同时也可以花q 元购买纪念品套装, 一个套装里有m 个纪念品. 今天总共有n 个参赛者, Soda想要知道最…

ArcGIS 10.2中栅格数据的属性表问题

什么条件下我们能在ArcGIS中看到栅格数据的属性表呢? 网上的说法是:对于单波段的整型ESRI GRID数据,如果它的像元值范围小于10万(max-min<1000000),并且少于500条唯一值,那么软件会为它创建一个“真正”的属性表存储在INFO文件夹的grid.VAT表格中。对于不满足上述条…

python简介及环境安装

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

剑指offer之求两个数之和(不能使用四则运算)

1 题目 剑指offer之求两个数之和(不能使用四则运算) 2 代码实现 #include<stdio.h>int add(int num1, int num2) {int sum1;int carry;do{sum1 (num1 ^ num2);carry (num1 & num2) << 1;num1 sum1;num2 carry;} while (carry ! 0);return num1; }int mai…

ZOJ 3879 Capture the Flag(模拟)

思路&#xff1a;恶心模拟...照着题目怎么说就怎么做就好了 #include<bits/stdc.h> using namespace std; const int maxn 100000; #define exp 1e-5 struct Node {int id,rank;double score; }nodes[105];int vis[105][105][105]; int visit[105]; bool cmp1(Node a,No…

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

晋中学院有多少人死在考研路上(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”的错误提示,而导致卸载失败,如下:

Nodejs前端服务器压缩图片

Nodejs作为前端服务器&#xff0c;自然能承担处理图片的能力&#xff0c; 使用GM for nodejs 作为图片处理器&#xff0c;调用ImageMagick处理图片 使用ImageMagick var imageMagick gm.subClass({ imageMagick: true }); 然后就像文档中使用gm那样使用ImageMagick即可 &#…

人工神经网络心得体会_卷积神经网络学习心得

萌新小白一只&#xff0c;刚刚接触AI&#xff0c;在遍历人工智能发展时就看到了“卷积神经网络”&#xff0c;顿时想到了去年被概率论支配的恐惧&#xff0c;因此想在这里分享一点经验来帮助大家更好理解。所谓“卷积神经网络”&#xff0c;就是结合卷积公式&#xff0c;建立类…

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

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

样式和主题的区别(Styles and Themes)

参考资料&#xff1a; http://www.tuicool.com/articles/VfiUba http://android.blog.51cto.com/268543/303728/转载于:https://www.cnblogs.com/8dull/p/5387072.html

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

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

剑指offer之股票的最大利润

1 问题 求股票的最大利润&#xff0c;简言之就是求一个数组里面元素差的最大值&#xff0c;要求时间复杂度O(n) 2 代码实现 #include <stdio.h> #include <stdlib.h>int maxDiff(int *number, int length) {if (NULL number || length < 2){return 0;}int mi…

【ArcGIS风暴】ArcGIS 10.2栅格计算器实用公式大全(经典珍藏版)

栅格计算器(Raster Calculator) 是一种空间分析函数工具,可以输入地图代数表达式,使用运算符和函数来做数学计算,建立选择查询,或键入地图代数语法。只有熟练的运用并记忆一些常用的公式,才能很好的运用栅格计算器。本文将常见的及一些容易出错的公式予以总结,方便学习…

试卷代号6098计算机应用基础,2231电大《Visual Basic程序设计》试题和答案200507

试卷代号&#xff1a;2231座位号口口中央广播电视大学2004-2005学年度第二学期"开放专科"期末考试计算(应)、软件信息软 件 网 站 专业 VisualBasic程序设计 试题2005年7月题 号一二三四五总 分分 数得 分评卷人一&#xff0c;单项选择题(每小题2分&#xff0c;共30分…

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

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

[js高手之路]使用原型对象(prototype)需要注意的地方

我们先来一个简单的构造函数原型对象的小程序 1 function CreateObj( uName, uAge ) {2 this.userName uName;3 this.userAge uAge;4 }5 CreateObj.prototype.showUserName function () {6 return this.userNa…

python 虚拟环境原理_Python 虚拟环境

建议在开发环境和生产环境下都使用虚拟环境来管理项目的依赖。 - Flask背景Python 应用通常会使用一些第三方的软件包和模块。不同的应用可能会依赖不同版本的同一个软件包&#xff0c;或者依赖不同的 Python 版本。设想这样的场景:小白之前有一个 Flask 0.10 做的网站并且一直…

pullToRefresh下拉刷新上拉加载

PullToRefresh 是一个第三方的工程。 之前的自定义下拉刷新控件貌似不太好用&#xff0c;于是网上找了这个。 参考&#xff1a;http://www.cnblogs.com/summers/p/4343964.html 主要是一些功能都提供了接口&#xff0c;不需要自己再写了。 废话不多说&#xff0c;上干货。 1、布…