Hadoop流媒体工作与管道在合并器中

时间:2014-03-26 20:06:17

标签: perl hadoop streaming

我试图像这样运行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.

1 个答案:

答案 0 :(得分:3)

事实证明,这是在Streaming combiner中使用管道的一个特定问题。

与允许在命令中使用shell管道的mapperreducer不同,组合器不能。 Hadoop Streaming将组合器解释为以下内容(假装$data是映射器的输出):

cat $data | perl 'count.pl' '-s' '|' 'perl' 'count.pl'

因此count.pl脚本使用perl的<>构造,首先解析其命令行标志(处理-s),然后开始阅读{{1}然后尝试打开&amp;读取名为$data|perl的文件。

这就是为什么它会在syslog输出中获得所有疯狂的东西,包括来自count.pl脚本本身的一些东西。

我只是觉得这是一个疯狂的情况,我最好把它贴在某处。