如何在oozie中访问在后续操作中在java操作中创建的自定义hadoop计数器

时间:2015-01-27 20:07:52

标签: hadoop oozie

我有一个在java动作中创建的计数器

("RunJavaMainClass") 
(context.getCounter("JOB_NAME_PREFIX", "QUEUED_COUNTER").increment(1);) 

正常运作。

我希望能够在同一工作流程中的后续oozie操作中访问计数器值。当我尝试使用

访问相同内容时
${hadoop:counters("RunJavaMainClass")["JOB_NAME_PREFIX"]["QUEUED_COUNTER"]} 

我收到错误: RunJavaMainClass 不支持Hadoop操作。 知道我在这里可能会缺少什么吗? 感谢

2 个答案:

答案 0 :(得分:2)

hadoop:* EL函数仅适用于Oozie MapReduce操作,因此即使它可能会运行MapReduce作业,您也无法将它们用于Java操作。

相反,您可以使用Java操作中的<capture-output/>标记将输出传递到Oozie工作流上下文。在您的驱动程序类中,您将Java属性文件写入oozie.action.output.properties中找到的包含您要传回的数据的位置(在本例中为您需要的计数器),然后使用{{1}从工作流中读取它}。有关此技术的更多信息可以在here找到。

答案 1 :(得分:0)

给定oozie作业ID和计数器名称,以下shell脚本可能适合您:

#!/bin/bash

if [ $# != 2 ]; then
    echo "Usage: get-job-counter-for-oozie.sh OOZIE_JOB COUNTER"
    exit 1
fi

OOZIE_JOB=$1
COUNTER=$2

OOZIE_URL=http://${JOBTRACKER}:11000/oozie
JOBS=`oozie job -oozie $OOZIE_URL -info $OOZIE_JOB -verbose | grep 'http' | cut -f2 -d$'\t'`

for job in ${JOBS}
do
    TASK_URL=http://${JOBTRACKER}:50030/
    JOBTASK=`curl "${job}" 2>/dev/null | grep '&type=map&pagenum=1' | cut -f2 -d'"' | sed -e 's/-int:/:/g'`
    TASKATTEMPT=`curl ${TASK_URL}${JOBTASK} 2>/dev/null | grep 'taskdetails.jsp' | sed -e 's/.*a href="\([^"]*\)".*$/\1/'`
    ATTEMPT_LOG=`curl ${TASK_URL}${TASKATTEMPT} 2>/dev/null | grep 'all=true' | cut -f6 -d'"'`
    COUNT=`curl $ATTEMPT_LOG 2>/dev/null | grep " ${COUNTER}=" | sed -e "s/.* ${COUNTER}=\([0-9]*\)/\1/g"`
    if [ "${COUNT}" != "" ]; then
        echo "${COUNTER}=${COUNT}"
    fi
done