python mapreduce框架_Python实现mapreduce程序

2023-05-16

一:目的

之前面试曾遇到面试官让用python代码实现mapreduce中最简单的demo WordCount,由于之前一直用java来写hadoop程序,突然转到python,是我产生了质疑,python与hadoop应该是不兼容的,即使写出来程序,到时候怎么运行?一头雾水最后导致面试失败。后来通过查阅资料,研究mapreduce的底层实现,发现尽管Hadoop框架是用Java编写的,但是为Hadoop编写的程序不必非要Java写,还可以使用其他语言开发,比如Python或C++(Haoop在0.14.1版本提供C++ API),而mapreduce只是一种思想,跟语言无关。$HADOOP_HOME/src/examples/python/WordCount.py,你就可以明白我的意思了。

现在将会采用python语言实现wordcount并在hadoop上运行实现。

二:Python代码

map实现:

下面Python代码的一个“窍门”是我们将使用Hadoop流API(可以看下相关的维基条目)来帮助我们通过STDIN(标准输入)和STDOUT(标准输出)在Map和Reduce代码间传递数据。我们只是使用Python的sys.stdin读取输入数据和打印输出到sys.stdout。这就是我们需要做的,因为Hadoop流将处理好一切。将下面的代码保存在文件 /home/hduser/mapper.py 中。它将从STDIN读取数据,拆分为单词并输出一组映射单词和它们数量(中间值)的行到STDOUT。尽管这个Map脚本不会计算出单词出现次数的总和(中间值)。相反,它会立即输出( 1)元组的形式——即使某个特定的单词可能会在输入中出现多次。在我们的例子中,我们让后续的Reduce做最终的总和计数。当然,你可以按照你的想法在你自己的脚本中修改这段代码,但是,由于教学原因,我们在本教程中就先这样做。:-)

请确保该文件具有可执行权限(chmod +x /home/hduser/mapper.py ),否则你会遇到问题。

13446_0.jpg

reduce实现:

将下面的代码保存在文件 /home/hduser/reducer.py 中。它将从STDIN读取mapper.py的结果(因此mapper.py的输出格式和reducer.py预期的输入格式必须匹配),然后统计每个单词出现的次数,最后将结果输出到STDOUT中。

请确保该文件具有可执行权限(chmod +x /home/hduser/reducer.py ),否则你会遇到问题。

13446_1.jpg

代码测试(cat data | map | sort | reduce):

在MapReduce作业中使用它们之前,我建议先在本地测试你的mapper.py和reducer.py脚本。否则,你的作业可能成功完成了但没有作业结果数据或得到了不是你想要的结果。如果发生这种情况,很有可能是你(或我)搞砸了。这里有一些想法,关于如何测试这个Map和Reduce脚本的功能。

13446_2.jpg

运行代码:

下载示例输入数据

下载每个文件为纯文本文件,以UTF-8编译并且将这些文件存储在一个临时目录中,如/tmp/gutenberg。

说明:你将需要在你的Cloudera虚拟机中打开浏览器。选择适当的文件下载(UTF-8 版本),它将显示在你的浏览器中。点击鼠标右键按钮来保存该文件。给它一个合适的名称(如”Ulysses”),并注意它将保存在下载目录中。

13446_3.jpg

将本地示例数据拷贝到HDFS

在我们运行实际的MapReduce作业前,我们首先必须从我们本地文件系统中拷贝文件到Hadoop的HDFS内。

*说明:

我们假设你是在你的下载目录中。我们必须在HDFS中创建一个子目录,然后拷贝文件过来。最后,我们验证拷贝文件成功。

首先,我们在HDFS中创建子目录MyFirst:

[cloudera@quickstart Downloads]$ hadoop fs -mkdir MyFirst

然后,我们拷贝文件。注意,三个文件以.txt结尾:

[cloudera@quickstart Downloads]$ hadoop fs -copyFromLocal *.txt MyFirst

最后,我们验证拷贝成功:

[cloudera@quickstart Downloads]$ hadoop fs -ls MyFirst

Found 3 items

-rw-r–r– 1 cloudera cloudera 1423803 2014-11-30 08:02 MyFirst/Leonardo.txt

-rw-r–r– 1 cloudera cloudera 674570 2014-11-30 08:02 MyFirst/OutlineOfScience.txt

-rw-r–r– 1 cloudera cloudera 1573150 2014-11-30 08:02 MyFirst/Ulysses.txt

13446_4.jpg

运行MapReduce作业

*说明:

运行MapReduce作业,敲入如下命令:

[cloudera@quickstart ~]$ hadoop jar /usr/lib/hadoop-0.20-mapreduce/contrib/streaming/hadoop-streaming.jar -file mapper.py -mapper mapper.py

-file reducer.py -reducer reducer.py -input MyFirst/* -output MyFirst4-output

你会收到有关文件被弃用的警告,不用担心。重要的是:当你发出这条命令时,输出目录(在这个示例中是MyFirst-output)不存在。

验证这个程序工作正常。首先,输入命令:hadoop fs -ls MyFirst4-output

[cloudera@quickstart ~]$ hadoop fs -ls MyFirst4-output

Found 2 items

-rw-r–r– 1 cloudera cloudera 0 2014-11-30 09:23 MyFirst4-output/_SUCCESS

-rw-r–r– 1 cloudera cloudera 880829 2014-11-30 09:23 MyFirst4-output/part-00000

然后,查看输出文件:

[cloudera@quickstart ~]$ hadoop fs -cat MyFirst4-output/part-00000

将文件从HDFS中拷入到你本地文件系统中:

[cloudera@quickstart ~]$ hadoop fs -copyToLocal MyFirst4-output/part-00000

MyFirstOutputLocal.txt

现在,一切都准备好了,我们终于可以在Hadoop集群上运行我们的Python MapReduce作业了。如上所述,我们使用Hadoop流API通过STDIN和STDOUT在Map和Reduce间传递数据。

13446_5.jpg

如果你想要在运行的时候修改Hadoop参数,如增加Reduce任务的数量,你可以使用-D选项:

hduser@ubuntu:/usr/local/hadoop$ bin/hadoop jar contrib/streaming/hadoop-streaming.jar -D mapred.reduce.tasks=16 …

关于mapred.map.tasks说明:Hadoop does not honor mapred.map.tasks beyond considering it a hint。但是,Hadoop接受用户指定mapred.reduce.tasks并且不操作。你不能强制指定mapred.map.tasks,但可以指定mapred.reduce.tasks。

这个任务将读取HDFS目录/user/hduser/gutenberg中的所有文件,处理它们,并将结果存储在HDFS目录/user/hduser/gutenberg-output中。一般情况下,Hadoop对每个reducer产生一个输出文件;在我们的示例中,然而它将只创建单个文件因为输入的文件都很小。

在终端中前一个命令的输出示例︰

13446_6.jpg

使用Python语言写Hadoop MapReduce程序

**译者说明:截图中的命令不完整,完整命令如下:

hduser@ubuntu:/usr/local/hadoop$ bin/hadoop jar contrib/streaming/hadoop-streaming.jar -mapper /home/hduser/mapper.py -reducer /home/hduser/reducer.py -input /user/hduser/gutenberg/* -output /user/hduser/gutenberg-output

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python mapreduce框架_Python实现mapreduce程序 的相关文章

  • 检测骰子的上侧

    是否可以检测骰子的上面 虽然从顶部看这将是一项简单的任务 但从许多角度来看 可以看到多个侧面 Here is an example of a dice feel free to take your own pictures 您通常想知道自己
  • Python 3.6 DateTime Strptime 返回错误,而 Python 3.7 运行良好

    我刚刚为日期数据创建了一个数据类型 它返回一个datetime datetime object 这是代码 import datetime class Date def new cls dateTime args kwargs return
  • Python 函数句柄 ala Matlab

    在 MATLAB 中可以创建function handles http www mathworks co uk help techdoc ref function handle html与类似的东西 myfun arglist body 这
  • 将 Poetry 与 PyEnv 一起使用并遇到 Python 版本问题

    我正在使用 WSL2 Ubuntu 我一直在学习使用 Fastapi 进行后端 API 开发的课程 我相信我的 Ubuntu 默认 python 是 3 8 我正在尝试使用 python 3 10 0 进行开发 我做了以下事情 pyenv安
  • 如何使用 .pth 文件添加 Python 导入路径

    如果我将 pth 文件放入 site packages 中 则会给出一个ImportError 我不知道如何通过创建 pth 文件来导入 指在Python中导入 https stackoverflow com questions 69728
  • python blpapi安装错误

    我试图根据 README 中的说明为 python 安装 blpapi 3 5 5 但是在运行时 python setup py install 我收到以下错误 running install running build running b
  • 从 Django 基于类的视图的 form_valid 方法调用特殊(非 HTTP)URL

    如果你这样做的话 有一个 HTML 技巧 a href New SMS Message a 点击新短信打开手机的本机短信应用程序并预 先填写To包含所提供号码的字段 在本例中为 1 408 555 1212 以及body与提供的消息 Hel
  • 如何使用 Twython 将 oauth_callback 值传递给 oauth/request_token

    Twitter 最近刚刚强制执行以下规定 1 您必须通过oauth callbackoauth request token 的值 这不是可选的 即使您已经在 dev twitter com 上设置了一个 如果您正在执行带外 OAuth 请通
  • 如何使用 python http.server 运行 CGI“hello world”

    我使用的是 Windows 7 和 Python 3 4 3 我想在浏览器中运行这个简单的 helloworld py 文件 print Content Type text html print print print print h2 H
  • Scrapy Splash,如何处理onclick?

    我正在尝试抓取以下内容 我能够收到响应 但我不知道如何访问以下项目的内部数据以抓取它 我注意到访问这些项目实际上是由 JavaScript 和分页处理的 这种情况我该怎么办 下面是我的代码 import scrapy from scrapy
  • 如何计算查询集中每个项目的两个字段的总和

    假设我有以下模型结构 class SomeModel Model base price DecimalField commision DecimalField 我不想存储total price在我的数据库中为了数据一致性并希望将其计算为ba
  • 如何在seaborn中绘制离散变量的分布图

    当我画画的时候displot对于离散变量 分布可能不像我想象的那样 例如 We can find that there are crevices in the barplot so that the curve in kdeplot is
  • Python ElementTree 获取带有命名空间的属性

    我试图访问 XML 中的 def 所以在这个例子中我会得到Evolus Common PlainTextV2作为输出 我似乎无法弄清楚如何获取具有名称空间的属性 如果我想得到id它工作得很好 Python for content ns in
  • Python:绘制甘特图的模块

    有没有一个好的Python绘图模块甘特图 http en wikipedia org wiki Gantt chart 我试过了开罗情节 http linil wordpress com 2008 09 16 cairoplot 11 但它
  • python lxml 使用iterparse编辑并输出xml

    我已经在 lxml 库上摆弄了一段时间了 也许我没有正确理解它 或者我错过了一些东西 但我似乎无法弄清楚在捕获某个 xpath 后如何编辑文件并且然后能够在逐个元素解析时将其写回到 xml 中 假设我们有这个 xml 作为示例
  • 在 Qt 5 中嵌入 Python

    我想将 Python 解释器嵌入到 Qt 5 应用程序中 我在 Qt 5 中有一个工作应用程序 但是当我把 include
  • 向结构化 numpy 数组添加字段

    将字段添加到结构化 numpy 数组的最简洁方法是什么 是否可以破坏性地完成 或者是否有必要创建一个新数组并复制现有字段 每个字段的内容是否连续存储在内存中 以便可以有效地完成此类复制 如果您使用 numpy 1 3 还有 numpy li
  • 从 python 文件调用 Julia 函数

    我能够创建一个 docker 环境 然后按照这个线程我有一个用 Julia 编写的高性能函数 如何从 Python 中使用它 https stackoverflow com questions 64241264 i have a high
  • 具有行业级约束的 SciPy 投资组合优化

    尝试在这里优化投资组合权重分配 通过限制风险来最大化我的回报函数 我可以毫无问题地通过简单的约束 所有权重之和等于 1 找到产生我的回报函数的优化权重 并做出另一个约束 即我的总风险低于目标风险 我的问题是 如何为每个组添加行业权重界限 我
  • 如何正确将 tflite_graph.pb 转换为 detector.tflite

    我正在使用tensorflow对象检测API使用tensorflow中的ssdlite mobilenet v2 coco 2018 05 09来训练自定义模型模型动物园 https github com tensorflow models

随机推荐