我遇到的情况是我的输入数据如下所示。
AA1
AA2
AA3
AA4
BB1
BB2
BB3
CC1
CC2
CC3
CC4
CC5
CC6
我想要做的是将数据拆分为InputSplits,其中每个拆分覆盖以某些前导字母开头的字符串部分。例如,第一个输入拆分将是以“AA”开头的所有字符串,第二个拆分将是以“BB”开头的那些,等等。
我想这样做,因为我的数据需要像这样才能使reduce阶段正确运行。
到目前为止,我一直在玩的是编写我自己的InputFormat
和RecordReader
类来执行此操作,但是我在一些示例中看到了这一点(http://developer.yahoo.com/ hadoop / tutorial / module5.html#fileformat)在阅读器到达时已经创建了分割。我相信我遇到了分裂与字符串之间的边界没有正确对齐的危险。
为了完全开展这项工作,我是否必须实施自己的InputFormat
getSplits
功能版本?如果我这样做,是否存在以不利用机器位置的方式在机器之间分配我的分裂的风险?最后,一般来说有更好的方法吗?
感谢任何帮助。谢谢,
MJ
编辑0
根据几位评论员的要求,我提供了更多信息。
我的程序的目标是比较属于组的字符串以找到这些字符串之间的重叠并记录哪些字符串一起共享该重叠。请考虑以下示例。
AAAA
AAAB
AAAC
AAB
BAAA
所有在开头共享“A”的字符串都有一些在它们之间很常见的重叠。以“B”开头的那个显然没有。当谈到实际发现特定重叠是什么,并建立这些组时,如果我正在看“AAAA”,我需要一直比较到“BAAA”而不是进一步。我担心的是InputSplits会切断我的数据,这样就不会对某些字符串进行比较,我会丢失/不完整的组。我希望使用Map步骤(或读取数据)将问题分成这些组,然后允许Reduce步骤计算组并返回结果。
我有这样的数百万字符串,在一台机器上需要一段时间。我在逻辑上实施了大量的“技巧”来简化流程并使其快速运行。我希望Hadoop可以介入并提供帮助,使其更快。
Joe K - 回答你的问题,我不知道所有字符串之间重叠的程度。重叠可以不同,例如AA1可以在AA4中一直重叠2个字符,但如果存在AB5,则只有1个字符会重叠。字符串的长度可能会有很大差异,因此在其他情况下可能会出现大量重叠。此外,检测重叠的确切内容是我想要在减少阶段做的事情。这就是我的整个目标。
我不知道shuffle / sort阶段是否会将相邻的字符串正确地分配到同一个reducer或者是否会有中断。不幸的是,我对这个过程的无知使我在这里绊倒。
编辑0结束