据我所知,在Hadoop中,大型输入文件会拆分成小文件,并通过map函数在不同的节点中进行处理。我也知道我们可以自定义InputSplit
。我想知道的是InputSplit
:
我有一个大的输入文件进入Hadoop,我想要一个文件的子集,即文件中的一组行与每个输入分割一起。我的意思是大文件的所有数据块应该包含这些行集,无论文件被分割的方式如何。
为了使我的问题更清楚,比如我们需要将输入文件的一部分(比如A
)与文件内容的其余部分进行比较,在这种情况下,所有InputSplit
都是进入map
函数需要有A
部分用于比较。
请指导我。
答案 0 :(得分:2)
理论上,您可以将大文件(A, B, C, D, ...)
拆分为拆分(A, B), (A, C), (A, D), ...
。但是,您必须为此目的编写大量自定义类。目前,扩展FileSplit的InputSplit基本上表示file
的分割从位置start
开始,并且具有固定的length
。对文件的实际访问权限由RecordReader
完成,即LineRecordReader。所以你必须实现代码,它不仅会读取实际的分割,还会读取文件的标题(部分A
)。
我认为,你正在寻找的方法是不切实际的。记录阅读器仅访问位置(开始,开始+长度)的原因是数据局部性。对于非常大的文件,部分A
和Z
将位于两个不同的节点上。
根据部分A
的大小,更好的想法是将此公共部分存储在DistributedCache中。通过这种方式,您可以高效地访问每个映射器中的公共数据。有关详细信息,请参阅javadoc和http://developer.yahoo.com/hadoop/tutorial/module5.html#auxdata。
答案 1 :(得分:0)
这是我对Hadoop MapReduce如何工作的简单探索。
假设你有一副纸牌,我们希望按照套装然后按顺序对它们进行分类,就像你得到一个全新的牌组一样。
Hadoop with 1 Mapper / 1 Reducer
你拿甲板并自己订购
Hadoop,带有1个Mapper / 2 Reducers(根据颜色,2种颜色,2个减速器进行映射)
你拿着牌组给我所有的黑牌和其他所有的红牌。我订购了我的卡并将它们还给了你,他也这样做了。你把2放在一起。
Hadoop有2个Mappers / 4 Reducers(根据套装进行映射)
你和我把甲板分成了甲板的一半。我们每个人的甲板上都分成4堆。每个人都穿西装订购。返回4桩,最后一步按他们的要求排序。
所以是的,“reducer”部分中的所有数据都必须有一些共同的部分,这是你基于的地图。可能映射的事情是白天,或者我的情况是颜色或西装。