我是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/
答案 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
传递了中间值。