我的 Hadoop 输入文件中有大约 5000 个条目,但我事先知道某些行的处理时间比其他行要长得多(在映射阶段)。(主要是因为我需要从 Amazon S3 下载一个文件,而且文件的大小会因任务而异)
我想确保首先处理最大的地图任务,以确保我的所有 hadoop 节点将大致同时完成工作。
有没有办法用 Hadoop 做到这一点?还是我需要重做整个事情?(我是 Hadoop 新手)
谢谢!
我的 Hadoop 输入文件中有大约 5000 个条目,但我事先知道某些行的处理时间比其他行要长得多(在映射阶段)。(主要是因为我需要从 Amazon S3 下载一个文件,而且文件的大小会因任务而异)
我想确保首先处理最大的地图任务,以确保我的所有 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() 取决于其预期的执行时间。