我如何在 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
我有一个在 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