我是hadoop世界的新手,我正在努力学习用map reduce的心态来编写代码。
所以,我遵循了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现在如果我没有sort -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/
发布于 2012-09-13 22:12:24
在Linux中,垂直条|用于将一条命令的输出重定向为另一条命令的输入。
echo命令将以下字符串写入标准输出。因此,在本例中,它编写foo foo quux labs foo bar quux,然后将其作为输入传递给/home/hduser/mapper.py,然后将其输出作为输入传递给sort,依此类推。
sort是一个对文本进行排序的Linux命令。-k标志告诉它排序的依据是哪一列。所以1,1告诉它从第一列开始排序,在第一列结束。
在您的Linux终端中键入man sort,以了解有关该命令的更多信息。我希望这能帮到你!
发布于 2012-09-14 01:17:36
如果您打算使用Hadoop Streaming,那么首先运行this tutorial并学习使用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传递中间值一样。
https://stackoverflow.com/questions/12407893
复制相似问题