当前位置: 首页 > 知识库问答 >
问题:

Python中经典Hadoop单词计数示例中的数据流

饶德元
2023-03-14

我试图理解Python中的Hadoop字数示例http://www.michael-noll.com/tutorials/writing-an-hadoop-mapreduce-program-in-python/

作者从简单版本的映射器和缩减器开始。这是缩减器(为了简洁,我删除了一些注释)

#!/usr/bin/env python

from operator import itemgetter
import sys

current_word = None
current_count = 0
word = None

# input comes from STDIN
for line in sys.stdin:
    line = line.strip()

    word, count = line.split('\t', 1)

    try:
        count = int(count)
    except ValueError:
        continue

    if current_word == word:
        current_count += count
    else:
        if current_word:
            # write result to STDOUT
            print '%s\t%s' % (current_word, current_count)
        current_count = count
        current_word = word

# do not forget to output the last word if needed!
if current_word == word:
    print '%s\t%s' % (current_word, current_count)

作者使用以下方法测试程序:

echo "foo foo quux labs foo bar quux" | /home/hduser/mapper.py | sort -k1,1 | /home/hduser/reducer.py

因此,reducer的编写方式就好像reducer作业的输入数据是这样的:

aa 1
aa 1
bb 1
cc 1
cc 1
cc 1

我对化简器的初步理解是,给定化简器的输入数据将包含一个唯一键。因此,在前面的示例中,将需要 3 个化简器作业。我的理解不正确吗?

然后,作者提出了映射器和还原器的改进版本。这是减速器:

#!/usr/bin/env python
"""A more advanced Reducer, using Python iterators and generators."""

from itertools import groupby
from operator import itemgetter
import sys

def read_mapper_output(file, separator='\t'):
    for line in file:
        yield line.rstrip().split(separator, 1)

def main(separator='\t'):
    # input comes from STDIN (standard input)
    data = read_mapper_output(sys.stdin, separator=separator)

    for current_word, group in groupby(data, itemgetter(0)):
        try:
            total_count = sum(int(count) for current_word, count in group)
            print "%s%s%d" % (current_word, separator, total_count)
        except ValueError:
            # count was not a number, so silently discard this item
            pass

if __name__ == "__main__":
    main()

作者补充了以下警告:

注意:以下映射和化简脚本只有在 Hadoop 上下文中运行时才能“正确”工作,即在 MapReduce 作业中作为映射器和化简器运行。这意味着运行朴素的测试命令“猫 DATA | ./mapper.py |sort -k1,1 | ./reducer.py“ 将不再正常工作,因为某些功能被有意外包给 Hadoop。

我不明白为什么朴素的测试命令不适用于新版本。我认为使用 -k1,1 排序将为两个版本的化简器生成相同的输入。我错过了什么?

共有1个答案

高寒
2023-03-14

关于你的第一个问题:“我对化简器的初步理解是,给定化简器的输入数据将包含一个唯一的键。因此,在前面的示例中,将需要 3 个化简器作业。我的理解不正确吗?

MapReduce抽象和Hadoop实现该抽象之间存在差异。在抽象中,还原器与唯一键相关联。另一方面,Hadoop实现将多个键分配给同一个reducer(以避免关闭流程和启动新流程的成本)。特别是,在Hadoop流中,reducer接收与特定数量的键(可以是零、一个或多个键)相对应的键值对,但您可以保证与某个键相关联的键值将连续出现。

例如,让我们以输入“foo foo quux labs foo bar quux”的字数为例。那么可能是一个减速器接收输入“bar 1\nfoo 1\nfoo 1\nfo1”,另一个减速器接收“labs 1\nquux 1\nquux 1”。实际运行的减速器进程的数量由您使用选项决定mapred.reduce.tasks.例如,使用2个减速器,您可以这样做

 $ bin/hadoop jar contrib/streaming/hadoop-*streaming*.jar -D mapred.reduce.tasks=2 -mapper ....

关于你的第二个问题,我同意你的观点,sort-k1,1可以解决这个问题,所以我也看不出有什么问题。

 类似资料:
  • 这篇文章假定你已经读了之前讲述VS Code插件基本知识的文章你的第一个插件。 单词数统计是一篇手把手教你怎样创建一个用来辅助编写Markdown的插件的的教程,在你了解这个插件所有的运行细节前,让我们先看一下这个插件的核心功能的效果演示。 只要当Markdown文件正在被编辑,状态栏上就会添加文档单词数的信息。这个信息将随着你的键入或者打开其他文件而随之变化: **小贴士:**这个完整的插件实例

  • 问题内容: 这是Hadoop字数统计Java映射并减少源代码: 在map函数中,我已经到了可以输出所有以字母“ c”开头的单词以及该单词出现的总次数的位置,但是我想做的就是输出总数以字母“ c”开头的单词,但我在获取总数上有些停留。任何帮助将不胜感激,谢谢。 例 我得到的输出: 可以2 罐3 猫5 我想要得到的是: 合计10 问题答案: 克里斯·格肯 的答案是正确的。 如果您要输出单词作为关键字,

  • 主要内容:执行Spark字数计算示例的步骤在Spark字数统计示例中,将找出指定文件中存在的每个单词的出现频率。在这里,我们使用Scala语言来执行Spark操作。 执行Spark字数计算示例的步骤 在此示例中,查找并显示每个单词的出现次数。在本地计算机中创建一个文本文件并在其中写入一些文本。 检查文件中写入的文本。 在HDFS中创建一个目录,保存文本文件。 将HDD上的sparkdata.txt 文件上传到特定目录中。 现在,按照以下命

  • 我指的是学习 C 的 K 和 R 书;它是关于在字数统计程序中使用 EOF 的 while 循环,书中给出的程序运行良好,但我想知道它如何在一次输入后停止接受输入并给出带有行、单词、 请帮助我理解这个程序中到底发生了什么来打破循环。 附加代码和输出 -

  • 我是hadoop的新手,刚刚安装了Hadoop2.6。 hadoop jar./share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0.jar grep/user/yoni/input/user/yoni/output101“dfs[a-z.]+” 以及在伪分布式模式下的设置,就像在所有的基本tutilies中一样