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

How do I access in oozie a custom hadoop counter which is created in a java action, in a subsequent action

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

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

运行正常。

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

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

我收到错误:RunJavaMainClass 不支持 Hadoop 操作。 知道我可能在这里遗漏了什么吗? 谢谢

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

相反,您可以在 Java 操作中使用 <capture-output/> 标记将输出传递到 Oozie 工作流上下文中。在您的驱动程序 class 中,您将 Java 属性文件写入 oozie.action.output.properties 中包含您想要传回的数据(在本例中为您想要的计数器)的位置,然后读取它来自使用 ${wf:actionData('action_name')['property_name']} 的工作流程。有关此技术的更多信息,请参见 here.

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

#!/bin/bash

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

OOZIE_JOB=
COUNTER=

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="\([^"]*\)".*$//'`
    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]*\)//g"`
    if [ "${COUNT}" != "" ]; then
        echo "${COUNTER}=${COUNT}"
    fi
done