得到hadoop流媒体jobid

时间:2012-06-25 14:58:02

标签: hadoop hadoop-streaming

所有Hadoop工作都有独特的工作。您可以使用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流媒体作业(作为后台任务),我想记住以后可以使用的所有工作,例如用于工作流分析。

事实上我已经找到了一些解决方案,但我认为它是一个黑客,这让我很烦恼。如果有人向我展示更优雅的解决方案,我将不胜感激。这是解决方案:

1)当我运行hadoop流式传输作业时,我必须指定输出hdfs目录

2)使用此目录我可以访问hdfs中的作业配置文件:

CONF_FILE_PATH=`hadoop fs -stat hdfs:<output_dir_path>/_logs/history/*.xml | awk '{print $NF}'`

3)最后,我可以从配置文件的名称中提取jobid

2 个答案:

答案 0 :(得分: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"

答案 1 :(得分:0)

你当前的'hack'之外有两个选择(其中一个只是另一个'hack'!)

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

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