所有Hadoop作业都有唯一的Jobid。您可以使用jobid获取工作状态或工作计数器。
问题是如何从脚本中获取刚刚完成的工作的作业ID?当然,我想以可靠且容易的方式(如果可能)进行此操作。

例:

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)现在我想以某种方式获取启动任务的名称。

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

最佳答案

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

  • 捕获正在运行的进程的标准错误,作业ID将在前几行中输出,其格式类似于:Running job: <jobid>
  • 修改流contrib文件夹中的StreamJob.java源代码(在第917行附近),以将作业ID输出到tmp文件(可能带有/带有进程ID的前缀,以便从shell中快速发现)。
  • 关于hadoop - 获取hadoop流Jobid,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11191788/

    10-11 22:28
    查看更多