gpt4 book ai didi

perl - 在组合器中使用管道的 Hadoop 流作业

转载 作者:可可西里 更新时间:2023-11-01 14:31:42 25 4
gpt4 key购买 nike

我正在尝试像这样运行一个 Hadoop 流作业:

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,和一些 bzip 数据:

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.

最佳答案

事实证明这是在 Streaming 中使用管道的特定问题 combiner .

不同于 mapperreducer ,在它们的命令中允许有 shell 管道,组合器不能。 Hadoop Streaming 将组合器解释如下(假设 $data 是映射器的输出):

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

所以 count.pl脚本,它使用 perl 的 <>构造,首先解析其命令行标志(处理 -s ),然后开始阅读 $data , 然后尝试打开和读取名为 | 的文件, perl , 和 count.pl .

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

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

关于perl - 在组合器中使用管道的 Hadoop 流作业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22671924/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com