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

mm5n2pyu  于 2021-06-04  发布在  Hadoop
关注(0)|答案(2)|浏览(328)

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

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

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

${hadoop:counters("RunJavaMainClass")["JOB_NAME_PREFIX"]["QUEUED_COUNTER"]}

我得到一个错误:runjavamainclass中不支持hadoop操作。你知道我在这里可能遗漏了什么吗?谢谢

wfveoks0

wfveoks01#

给定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
q35jwt9p

q35jwt9p2#

这个 hadoop:* el函数只可用于oozie mapreduce操作,因此即使java操作可能运行了mapreduce作业,也不能将它们用于java操作。
相反,您可以使用 <capture-output/> 标记java操作以将输出传递到oozie工作流上下文。在驱动程序类中,将java属性文件写入 oozie.action.output.properties 包含要传回的数据(在本例中是所需的计数器),然后使用从工作流中读取它 ${wf:actionData('action_name')['property_name']} . 关于这项技术的更多信息可以在这里找到。

相关问题