所有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
答案 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'!)
捕获正在运行的进程的标准错误,作业ID将在前(几行)中输出,格式类似于:Running job: <jobid>
。
修改streaming contrib文件夹中的StreamJob.java源代码(第917行左右),将作业ID输出到tmp文件(可能预先/后缀为进程ID,以便从shell快速发现)