1

所有 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

4

2 回答 2

1

您可以选择为作业分配用户定义的名称:

|-D mapred.job.name="unique_name_within_the_user" \

然后从 Hadoop YARN REST API 的响应中识别您的 job_id:

curl -H "Accept: application/json" -X GET "http://host.domain.com:8088/ws/v1/cluster/apps"
于 2015-10-17T10:49:06.797 回答
0

在当前的“黑客”之外,您有两个选择(其中一个只是另一个“黑客”!)

  1. 捕获正在运行的进程的标准错误,作业 ID 将在前(几)行输出,格式类似于:Running job: <jobid>.

  2. 修改流式 contrib 文件夹中的StreamJob.java源代码(大约第 917 行),以将作业 ID 输出到 tmp 文件(可能以进程 ID 为前缀/后缀,以便从 shell 快速发现)。

于 2012-06-26T10:32:00.543 回答