如何在hadoop mapreduce中在异常时将任务状态更改为failed

bvjveswy  于 2021-06-04  发布在  Hadoop
关注(0)|答案(1)|浏览(391)

我正在使用hadoop mapreduce执行以下任务:
我的绘图员会读取 .xml 文件并将其传递给某个服务。我的电脑里有这样的代码 setup() :

try
{
    System.out.println(propertyName);
    session = FindPath.createSession("localhost",3250, EncodingConstants.en_ISO_8859_1);
    session.open();
}
catch 
{
    System.out.println("error");
}

当datanode没有 FindPath [findpath-服务尚未启动]它将引发异常。
现在我的问题是我的Map程序没有移动到另一个运行的集群 FindPath 服务。
例子:
数据节点1数据节点2-两个数据节点
如果datanode 1尚未启动 FindPath 服务,则输入应移动到数据节点2。
我怎样才能做到这一点?
我怎样才能改变现状 TaskStatus 在datanode 1中,当抛出异常时,是否返回“failed”?
更新

Job j;
catch(Exception Ex)
{   
    j.failTask((TaskAttemptID)context.getTaskAttemptID());
    System.out.println("error");
}

我使用过类似的方法,但是它抛出了一个nullpointer异常。
如何使用 failTask 在我的Map或Map设置新的api?

yrdbyhpb

yrdbyhpb1#

使用 JobClient 访问 RunningJob 类(我有1.0.4api)。
代码如下所示:
有一个 JobClient 和一个 RunningJob 在您的 setup() .
方法如下:

public void setup(Context context)
{
    JobClient jobClient;
    RunningJob runningJob;

    try 
    {
        jobClient = new JobClient((JobConf)context.getConfiguration());
        runningJob = jobClient.getJob((JobID)(context.getJobId()); //mapred.JobID!
    }
    catch (IOException e)
    {
        System.out.println("IO Exception");
    }

    try
    {
        System.out.println(propertyName);
        session = FindPath.createSession("localhost",3250, EncodingConstants.en_ISO_8859_1);
        session.open();
    }
    catch 
    {
        System.out.println("error");
        runningJob.killTask((TaskAttemptID)context.getTaskAttemptID(), true);// cast as mapred.TaskAttemptID
    }

}

这会导致任务尝试失败。
最后,你应该 mapred.map.max.attempts 设置为1,这样失败的任务尝试就是失败的任务。

注:

你应该考虑改变 mapred.max.map.failures.percent 因为它反映了集群对失败任务的容忍度。

相关问题