如果您打算在 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
.