我的 Hadoop 输入文件中有大约 5000 个条目,但我事先知道某些行的处理时间比其他行要长得多(在映射阶段)。 (主要是因为我需要从Amazon S3下载一个文件,而且文件的大小会因任务而异)
我想确保首先处理最大的 map 任务,以确保我的所有 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() 取决于其预期执行时间。
关于hadoop - Hadoop 映射任务的执行顺序/优先级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18180547/