2

我是 hadoop 世界的新手,我正在尝试学习使用 map reduce 思维方式编写代码。

所以,我正在关注 michael-noll 教程。

我面临的挑战之一(除了理解一个新框架)是这个框架使用的终端技巧的数量。

那么做什么呢。

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

方法???回声有什么作用??

此外,上述代码的输出是:

  bar     1
  foo     3
  labs    1
   quux    2

现在,如果我没有排序 -k1,1 的东西

  foo     2
  bar     1
  labs    1
  foo     1
   quux    2

排序标志有什么作用?-k1,1 是什么意思?

谢谢..

参考: http: //www.michael-noll.com/tutorials/writing-an-hadoop-mapreduce-program-in-python/

4

2 回答 2

7

在 Linux 中,竖线|用于将一个命令的输出重定向为另一个命令的输入。

echo命令将以下字符串写入标准输出。因此,在您的情况下,它是写入foo foo quux labs foo bar quux,然后将其作为输入传递给/home/hduser/mapper.py,然后将其输出作为输入传递给sort,依此类推。

sort是一个对文本进行排序的 Linux 命令。该-k标志告诉它按哪一列排序。所以1,1告诉它从第 1 列开始排序,在第 1 列结束。

输入man sort您的 Linux 终端以了解有关该命令的更多信息。我希望这有帮助!

于 2012-09-13T14:12:24.240 回答
2

如果您打算在 Hadoop Streaming 中工作,那么首先运行本教程并学习使用 shell 命令可能会有所帮助。它会帮助你很多。

基本上,由于 Reducer 的工作方式,您的输出是不同的。当当前键与最后一个键相同时,它将所有值相加。当当前键与前一个键不同时,它会写出前一个键的值并开始处理当前键。当您的输入看起来像foo foo bar foo时,映射器会按顺序处理这些值,产生类似的输出

foo 1
foo 1
bar 1
foo 1

然后以相同的格式将其发送到您的 Reducer。你的 Reducer 逐行读取它。为了让您更好地理解这一点,以下是您的 Reducer 采取的步骤:

// current_key = NULL
input_key,input_value: foo,1
input_key != current_key:
  current_key = input_key
  current_value = input_value
// current_value = 1

// current_key = foo
input_key,input_value: foo,1
input_key == current_key:
  current_value += input_value
// current_value = 2

// current_key = foo
input_key,input_value: bar,1
input_key != current_key:
  emit <current_key, current_value>
  current_key = input_key
  current_value = input_value
// current_value = 1

// current_key = bar
input_key,input_value: foo,1
input_key != current_key:
  emit <current_key, current_value>
  current_key = input_key
  current_value = input_value
// current_value = 1

这将为您提供 foo 2, bar 1, foo 1 的输出。现在,如果您对 Reducer 的输入进行排序,它看起来像这样:

foo 1
foo 1
foo 1
bar 1

这使得 Reducer 继续将 的值foo相加而不会被bar键打断,因此您会得到 foo 3, bar 1 的输出。可以通过 对值进行排序sort -k1,1,这是一个基于 UNIX 命令进行排序的命令第一个字段。Hadoop MapReduce 框架自动对中间值(即 foo 1、foo 1、bar 1、foo 1 数据)进行排序,以便所有具有相同键的键、值对在同一个 Reducer 中结束,产生相同的输出,就像您已通过sort -k1,1.

于 2012-09-13T17:17:35.853 回答