2012-06-25 54 views
1

所有Hadoop作业都有唯一的jobid。您可以使用jobid获取工作状态或工作计数器。 问题是我怎样才能得到我刚从脚本运行的工作的jobid?当然,我希望以可靠和简单(如果可能)的方式来做到这一点。获取hadoop streaming 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)现在我想以某种方式获得作业ID启动的任务

3)当我有jobid时,我可以做hadoop job -status和hadoop job -counter查询。

UPDATE:

同步的情况下(等到完成,获得作业ID,然后索要状态/计数器)似乎是最低要求,但有时使用起来并不方便。有时我想同时运行一些hadoop流式作业(作为后台任务),并且我想记住所有稍后可以使用的jobids,例如进行工作流分析。

事实上,我已经想出了一些解决方案,但我认为它是一个黑客,这让我非常困扰。如果有人向我展示更优雅的解决方案,我将不胜感激。这里的解决方案:

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

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

3)最后,我可以提取从配置文件名称的作业ID

+0

在您的例子情况,在shell继续之前,执行是否等待作业完成? (在这种情况下,没有多少点巡查状态)。或者你是否有兴趣查明工作是否成功/失败以及最终的工作计数器价值? –

+0

同步大小写(等待完成,获取jobid然后询问状态/计数器)似乎是所需的最小值,但有时使用起来不方便。有时我想同时运行一些hadoop流式作业(作为后台任务),并且我想记住所有稍后可以使用的jobids,例如进行工作流分析。 事实上,我已经想出了一些解决方案,但我认为它是一种攻击,这让我非常困扰(请参阅更新后的文章)。如果有人向我展示更优雅的解决方案,我将不胜感激。 –

回答

0

你有你当前的外线两个选项:使用这个目录,我可以在HDFS访问任务配置文件

2) “黑客”(其中之一是只是一个“砍”!)

  1. 捕捉运行过程中的标准错误,作业ID将在第一(几)线路输出,并具有日e格式类似于:Running job: <jobid>

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

+0

我认为第一种方法非常不可靠,因为stderr输出可能会在新版本中发生变化。目前我无法尝试第二种方法,但似乎没问题,我稍后再尝试。感谢您的回答! –

1

你要分配用户定义的名称是工作中一个选项:

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

,之后确定从Hadoop的纱REST API的响应您的作业ID:

curl -H "Accept: application/json" -X GET "http://host.domain.com:8088/ws/v1/cluster/apps"