5

我知道在 Hadoop 中,大输入文件拆分为小文件,并由映射函数在不同节点中进行处理。我还知道我们可以自定义InputSplits. 我想知道的是是否可以进行以下类型的自定义InputSplit

我有一个大的输入文件进入 Hadoop,我想要文件的一个子集,即文件中的一组行与每个输入拆分一起进行。我的意思是大文件的所有数据块都应该包含这些行集,无论文件以何种方式拆分。

为了让我的问题更清楚,比如如果我们需要将输入文件的一部分A(比如比较。请指导我。InputSplitmapA

4

2 回答 2

2

从理论上讲,可以将您的大文件(A, B, C, D, ...)拆分为 splits (A, B), (A, C), (A, D), ...。但是,您必须为此编写大量自定义类。目前,扩展InputSplit的FileSplit基本上说拆分从 position 开始并且有一个固定的. 对文件的实际访问由 a 完成,即LineRecordReader。所以你必须实现代码,它不仅会读取实际的拆分,还会读取文件的标题(部分)。filestartlengthRecordReaderA

我认为,您正在寻找的方法是不切实际的。记录阅读器访问位置(开始,开始+长度)的原因只是数据局部性。对于一个非常大的文件,部分AZ将在两个不同的节点上。

根据部分的大小A,一个更好的主意是将这个公共部分存储在DistributedCache中。通过这种方式,您可以有效地访问每个映射器中的公共数据。有关详细信息,请参阅 javadoc 和http://developer.yahoo.com/hadoop/tutorial/module5.html#auxdata

于 2013-05-02T15:26:07.050 回答
0

这是我对 Hadoop MapReduce 工作原理的简单说明。

假设您有一副纸牌,我们想按花色然后按顺序对它们进行排序,就像您获得一副全新的纸牌一样。

具有 1 个 Mapper/1 个 Reducer 的 Hadoop

您拿走甲板并自己订购

Hadoop with 1 Mapper/2 Reducers(根据颜色进行映射,2种颜色,2个reducers)

你拿下这副牌,把所有的黑牌都给我,给别人所有的红牌。我订购我的卡片并将它们还给你,他也这样做。你把2个放在一起。

Hadoop with 2 Mappers/4 Reducers(根据套装进行映射)

你和我把甲板分成两半。我们每个人都将我们的套牌分成 4 堆每套。每个人都拿一套西装并订购它们。返回 4 堆,最后一步按我们想要的方式对它们进行排序。

所以是的,“reducer”部分中的所有数据都必须有一些共同的部分,这是您映射的部分。一个人可能会按天绘制的东西,或者在我的情况下,按颜色或西装绘制。

于 2013-05-02T13:53:21.830 回答