我试图像这样运行Hadoop Streaming作业:
yarn jar /usr/lib/hadoop-mapreduce/hadoop-streaming-2.2.0.*.jar \
-files count.pl \
-input "/my_events/*.bz2" \
-output count-events \
-mapper "cut -f2,4 | grep foo | cut -f1" \
-combiner "perl count.pl -s | perl count.pl" \
-reducer "perl count.pl"
count.pl
脚本是一个简单的脚本,它只计算键,循环输入就像这样(简化):
while(<>) {
chomp;
my($k,$c) = split /\t/, $_, 2;
$c ||= 1;
$count{$k} += $c;
}
while (my ($k, $c) = each %count) {
print "$k\t$c\n";
}
它失败了,在Hadoop syslog
输出中我看到了疯狂的疯狂事情 - 注意它以某种方式包含perl脚本源,以及一些1和bzipped数据:
2014-03-26 19:04:20,595 WARN [main] org.apache.hadoop.mapred.YarnChild:
Exception running child : java.io.IOException: subprocess exited successfully
R/W/S=8193/81/0 in:4096=8193/2 [rec/s] out:40=81/2 [rec/s]
minRecWrittenToEnableSkip_=9223372036854775807 HOST=null
USER=kwilliams
HADOOP_USER=null
last tool output: |} 1 1rint "$k\t$c\n"; 1each %count) { 1ne $lastkey)) { 1��@p@P 0�H�l$�H��L�d$�L�l$�L�t$�H��(
H�GhH�wH��H��H�GhHc�H��H)�H��H���C����L�AH�L�$�J�4&�F��H�L�0E1��~H�EJ�t �F��H�D�hA��H��(H��A��H���
...%�����A��E��tRIc�H��H��L�s������EX ui 0|
Broken pipe
并且stderr
输出具有:
Can't open |: Broken pipe at count.pl line 12.
答案 0 :(得分:3)
事实证明,这是在Streaming combiner
中使用管道的一个特定问题。
与允许在命令中使用shell管道的mapper
和reducer
不同,组合器不能。 Hadoop Streaming将组合器解释为以下内容(假装$data
是映射器的输出):
cat $data | perl 'count.pl' '-s' '|' 'perl' 'count.pl'
因此count.pl
脚本使用perl的<>
构造,首先解析其命令行标志(处理-s
),然后开始阅读{{1}然后尝试打开&amp;读取名为$data
,|
和perl
的文件。
这就是为什么它会在syslog输出中获得所有疯狂的东西,包括来自count.pl
脚本本身的一些东西。
我只是觉得这是一个疯狂的情况,我最好把它贴在某处。