如何在Pig中编写自定义文件

时间:2015-03-29 03:07:04

标签: java hadoop apache-pig

编写猪作业的自定义输出时遇到问题

我基本上想把pig作业执行时间的统计信息写入文件中 我的猪工作准备就绪,正在工作。

我现在如何编写执行时间的统计信息 格式:开始时间,结束时间,(结束开始时间)执行时间

请指导我,如果我尝试用猪或写一个shell脚本,调用java代码方法为我做某事。 提前致谢.. 此致

2 个答案:

答案 0 :(得分:0)

执行MR作业时,日志中将显示作业的开始时间,结束时间和已用时间。我不认为使用PIG这样做的方法。但是,如果您了解hadoop计数器,则可以根据需要创建自己的自定义计数器,并将输出实际写入您创建的文件。

https://hadoop.apache.org/docs/current/api/org/apache/hadoop/mapred/Counters.html

答案 1 :(得分:0)

如果您使用的是Pig version 0.14,那么pig脚本所用的时间将被转储到console log的最后一行,类似这样的

 "Pig script completed in 48 seconds and 454 milliseconds (48454 ms)"

但同一时间完成日志将无法在<=0.13 releases

中使用

一个选项可能是,您可以在shell脚本中调用您的pig脚本并计算执行时间。这种方法不会给出100%的确切结果,但它会非常接近原始执行时间。

<强> myshell.sh

#!/bin/bash
START_TIME=$(($(date +%s%N)/1000000))

pig -x local mypigscript.pig

END_TIME=$(($(date +%s%N)/1000000))
TOTALMILLSECS=$((($END_TIME-$START_TIME)-1200))
SECS=$((TOTALMILLSECS/1000))
MILLSECS=$((TOTALMILLSECS%1000))

cat > MYOUTPUT.txt <<EOF
STARTTIME:$START_TIME, ENDTIME:$END_TIME, TIMETAKEN:$SECS seconds and $MILLSECS millseconds ($TOTALMILLSECS ms)
EOF

为了交叉验证shell脚本结果,我只是使用下面的pig脚本并在0.14和上面的shell脚本中执行。我没有看到执行时间有太大差异。

<强>输入

1,2,3
4,5,6
7,8,8

<强> mypigscript.pig

A = LOAD 'input' USING PigStorage(',') AS (f1,f2,f3);
B = GROUP A BY f1;
C = FOREACH B GENERATE group, COUNT(A);
DUMP C;

上述猪的执行时间为0.14

org.apache.pig.Main - Pig script completed in 48 seconds and 460 milliseconds (48460 ms)

使用shellscript的上述pigcript的执行时间:(输出将存储在MYOUTPUT.txt中)

STARTTIME:1427606934083, ENDTIME:1427606983729, TIMETAKEN:48 seconds and 446 millseconds (48446 ms)

注意:
我刚刚提供了一种获取执行时间的方法,您可以根据需要自定义或修改。