据我所知,在Hadoop中,大输入文件分成小文件,并由map函数在不同节点中处理.我也知道我们可以自定义InputSplits.我想知道的是,如果可以进行以下类型的自定义InputSplit:
我有一个大的输入文件进入Hadoop,我想要一个文件的子集,即文件中的一组行与每个输入拆分一起.我的意思是大文件的所有数据块都应包含这些行集,而不管文件的分割方式如何.
为了使我的问题更清楚,比如我们需要将输入文件的一部分(比方说A)与文件内容的其余部分进行比较,在这种情况下,所有InputSplit要转到map函数的A部分都需要将此部分用于比较.请指导我这个.
理论上,可以将大文件分割(A, B, C, D, ...)成多个片段(A, B), (A, C), (A, D), ...。但是,您必须为此目的编写大量自定义类。目前,扩展了InputSplit的FileSplit基本上表示 for 的分割从位置开始并具有固定的。对文件的实际访问是由LineRecordReader完成的。因此,您必须实现代码,该代码不仅会读取实际的拆分,还会读取文件的标头(部分)。filestartlengthRecordReaderA
我认为,您正在寻找的方法是不切实际的。记录读取器仅访问位置(开始、开始+长度)的原因是数据局部性。对于一个非常大的文件,partsA和Z将位于两个不同的节点上。
根据部分的大小A,更好的想法是将这个公共部分存储在DistributedCache中。通过这种方式,您可以有效地访问每个映射器中的公共数据。请参阅 javadoc 和http://developer.yahoo.com/hadoop/tutorial/module5.html#auxdata了解更多信息。
| 归档时间: |
|
| 查看次数: |
2042 次 |
| 最近记录: |