所有 Hadoop 作业都有唯一的 jobid。您可以使用 jobid 获取作业状态或作业计数器。问题是我怎样才能得到我刚刚从我的脚本运行的工作的jobid?当然,我想以可靠和简单(如果可能的话)的方式做到这一点。
例子:
1)从我的脚本中运行:
hadoop jar ${HADOOP_STREAMING} \
-D mapred.job.name="$NAME" \
-D mapred.reduce.tasks=$NREDUCERS\
-mapper "cat" \
-file ./reducer.py \
-reducer "python ./reducer.py" \
-input hdfs:/logs/2012-06-25/*.bz2 \
-output hdfs:/tmp/test
2)现在我想以某种方式获得已启动任务的jobid。
3) 当我有 jobid 时,我可以进行 hadoop job -status 和 hadoop job -counter 查询。
更新:
同步情况(等到完成,获取jobid然后询问状态/计数器)似乎是所需的最小值,但有时使用起来并不方便。有时我想同时运行几个 hadoop 流作业(作为后台任务),并且我想记住以后可以使用的所有 jobid,例如用于工作流分析。
事实上,我已经找到了一些解决方案,但我认为它是一种 hack,这让我很困扰。如果有人向我展示更优雅的解决方案,我将不胜感激。这是解决方案:
1)当我运行一个 hadoop 流作业时,我必须指定一个输出 hdfs 目录。
2)使用这个目录我可以访问hdfs中的作业配置文件:
CONF_FILE_PATH=`hadoop fs -stat hdfs:<output_dir_path>/_logs/history/*.xml | awk '{print $NF}'`
3)最后,我可以从配置文件的名称中提取jobid