您的位置:首页 > 其它

map/reduce类简单介绍

2016-04-18 11:03 253 查看
在Hadoop的mapper类中,有4个主要的函数,分别是:setup,clearup,map,run。代码如下:

protected void setup(Context context) throws IOException, InterruptedException {

// NOTHING

}

protected void map(KEYIN key, VALUEIN value,

Context context) throws IOException, InterruptedException {

context.write((KEYOUT) key, (VALUEOUT) value);

}

protected void cleanup(Context context) throws IOException, InterruptedException {

// NOTHING

}

public void run(Context context) throws IOException, InterruptedException {

setup(context);

while (context.nextKeyValue()) {

map(context.getCurrentKey(), context.getCurrentValue(), context);

}

cleanup(context);

}

}

由上面的代码,我们可以了解到,当调用到map时,通常会先执行一个setup函数,最后会执行一个cleanup函数。而默认情况下,这两个函数的内容都是nothing。因此,当map方法不符合应用要求时,可以试着通过增加setup和cleanup的内容来满足应用的需求。

[align=left]在Hadoop的reducer类中,有3个主要的函数,分别是:setup,clearup,reduce。代码如下:[/align]

/**

* Called once at the start of the task.

*/

protected void setup(Context context

) throws IOException, InterruptedException {

// NOTHING

}

/**

* This method is called once for each key. Most applications will define

* their reduce class by overriding this method. The default implementation

* is an identity function.

*/

@SuppressWarnings("unchecked")

protected void reduce(KEYIN key, Iterable<VALUEIN> values, Context context

) throws IOException, InterruptedException {

for(VALUEIN value: values) {

context.write((KEYOUT) key, (VALUEOUT) value);

}

}

/**

* Called once at the end of the task.

*/

protected void cleanup(Context context

) throws IOException, InterruptedException {

// NOTHING

}

[align=left]在用户的应用程序中调用到reducer时,会直接调用reducer里面的run函数,其代码如下:[/align]

/*

* control how the reduce task works.

*/

@SuppressWarnings("unchecked")

public void run(Context context) throws IOException, InterruptedException {

setup(context);

while (context.nextKey()) {

reduce(context.getCurrentKey(), context.getValues(), context);

// If a back up store is used, reset it

((ReduceContext.ValueIterator)

(context.getValues().iterator())).resetBackupStore();

}

cleanup(context);

}

}

[align=left]由上面的代码,我们可以了解到,当调用到reduce时,通常会先执行一个setup函数,最后会执行一个cleanup函数。而默认情况下,这两个函数的内容都是nothing。因此,当reduce不符合应用要求时,可以试着通过增加setup和cleanup的内容来满足应用的需求。[/align]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: