我有一个在java动作中创建的计数器
("RunJavaMainClass")
(context.getCounter("JOB_NAME_PREFIX", "QUEUED_COUNTER").increment(1);)
正常运作。
我希望能够在同一工作流程中的后续oozie操作中访问计数器值。当我尝试使用
访问相同内容时${hadoop:counters("RunJavaMainClass")["JOB_NAME_PREFIX"]["QUEUED_COUNTER"]}
我收到错误: RunJavaMainClass 不支持Hadoop操作。 知道我在这里可能会缺少什么吗? 感谢
答案 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