为什么排序k1,1会改变输出?

时间:2012-09-13 13:54:24

标签: shell hadoop terminal

我是hadoop世界的新手,我正在努力学习用地图缩小思维模式编写代码。

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

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

所以 是什么。

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

装置??? echo做了什么??

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

  bar     1
  foo     3
  labs    1
   quux    2

现在,如果我没有排序-k1,1 thingy

  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/

2 个答案:

答案 0 :(得分:6)

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

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

sort是一个排序文本的Linux命令。 -k标志告诉它要排序的列。因此1,1告诉它从第1列开始排序,从第1列开始。

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

答案 1 :(得分:2)

如果您打算在Hadoop Streaming中工作,首先运行this tutorial并学习使用shell命令可能会有所帮助。它会帮助你走下一条路。

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

的输出
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的输出,吧1.对值进行排序可以由sort -k1,1完成,这是一个基于第一个字段排序的UNIX命令。 Hadoop MapReduce框架自动对中间值(即foo 1,foo 1,bar 1,foo 1数据)进行排序,以便具有相同键的所有键值对在同一个Reducer处结束,产生相同的输出,就好像你通过sort -k1,1传递了中间值。