我的Hadoop输入文件中有大约5000个条目,但我事先知道其中一些行的处理时间要比其他行长得多(在映射阶段)。(主要是因为我需要从AmazonS3下载一个文件,文件的大小会因任务而异)
我想确保首先处理最大的映射任务,以确保我的所有hadoop节点大致同时完成工作。
Hadoop有办法做到这一点吗?还是我需要重做整个东西?(我是Hadoop新手)
谢谢!
如果您要实现自定义InputFormat(getSplits()方法包含关于创建拆分的逻辑),那么理论上您可以实现您想要的。
但是,您必须特别小心,因为InputFormat返回拆分的顺序并不是Hadoop处理它的顺序。JobClient中有一个拆分的重新排序代码:
// sort the splits into order based on size, so that the biggest
// go first
Arrays.sort(array, new NewSplitComparator());
这会让整个事情变得更加棘手。但是,您可以实现自定义InputFormat+自定义InputSplit,并使InputSlip#length()取决于它的预期执行时间。