获取hadoop流式作业ID

获取hadoop流式作业ID,hadoop,hadoop-streaming,Hadoop,Hadoop Streaming,所有Hadoop作业都有唯一的jobid。您可以使用jobid获取作业状态或作业计数器。 问题是如何从脚本中获取刚刚运行的作业的jobid?当然,我想用一种可靠、简单(如果可能的话)的方式来做这件事 例如: 1) 从我的脚本中,我运行: hadoop jar ${HADOOP_STREAMING} \ -D mapred.job.name="$NAME" \ -D mapred.reduce.tasks=$NREDUCER

所有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作业状态和hadoop作业计数器查询

更新:

同步用例(等待完成,获取jobid,然后询问状态/计数器)似乎是所需的最小值,但有时使用起来并不方便。有时,我想同时运行几个hadoop流作业(作为后台任务),并且我想记住我以后可以使用的所有作业ID,例如用于工作流分析

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

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

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

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

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

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

  • 捕获正在运行的进程的标准错误,作业ID将在第一(几)行中输出,其格式类似于:
    正在运行的作业:

  • 修改streaming contrib文件夹中的源代码(第917行附近),以将作业id输出到tmp文件(可以使用进程id前置/后缀,以便从shell中快速查找)


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

  • 捕获正在运行的进程的标准错误,作业ID将在第一(几)行中输出,其格式类似于:
    正在运行的作业:

  • 修改streaming contrib文件夹中的源代码(第917行附近),以将作业id输出到tmp文件(可以使用进程id前置/后缀,以便从shell中快速查找)


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

    |-D mapred.job.name="unique_name_within_the_user" \
    
    然后从Hadoop Arthren REST API的响应中确定您的工作id:

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

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

    |-D mapred.job.name="unique_name_within_the_user" \
    
    然后从Hadoop Arthren REST API的响应中确定您的工作id:

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

    在您的示例中,在shell继续之前,执行不是要等到作业完成吗?(在这种情况下,轮询状态没有多大意义)。或者您是否有兴趣了解作业是否成功/失败以及任何最终作业计数器值?同步情况(等待完成,获取作业ID,然后询问状态/计数器)似乎是所需的最小值,但有时使用起来并不方便。有时,我想同时运行几个hadoop流作业(作为后台任务),并且我想记住我以后可以使用的所有作业ID,例如用于工作流分析。事实上,我已经想出了一些解决办法,但我认为这是一个黑客,这困扰了我很多(见一个更新的帖子)。如果有人向我展示更优雅的解决方案,我将不胜感激。在您的示例中,执行不是要等到作业完成后,shell才能继续吗?(在这种情况下,轮询状态没有多大意义)。或者您是否有兴趣了解作业是否成功/失败以及任何最终作业计数器值?同步情况(等待完成,获取作业ID,然后询问状态/计数器)似乎是所需的最小值,但有时使用起来并不方便。有时,我想同时运行几个hadoop流作业(作为后台任务),并且我想记住我以后可以使用的所有作业ID,例如用于工作流分析。事实上,我已经想出了一些解决办法,但我认为这是一个黑客,这困扰了我很多(见一个更新的帖子)。如果有人向我展示更优雅的解决方案,我将不胜感激。我认为第一种方法是非常不可靠的,因为例如,stderr输出可能会在较新版本中发生变化。目前我无法尝试第二种方法,但它似乎没问题,我稍后会尝试。谢谢你的回答!我认为第一种方法是非常不可靠的,因为stderr输出可能会在较新的版本中发生变化。目前我无法尝试第二种方法,但它似乎没问题,我稍后会尝试。谢谢你的回答!