2

我有一种情况,我的输入数据如下所示。

AA1
AA2
AA3
AA4
BB1
BB2
BB3
CC1
CC2
CC3
CC4
CC5
CC6

我想要做的是将数据拆分为 InputSplits,其中每个拆分涵盖以某些前导字母开头的字符串部分。例如,第一个输入拆分将是所有以“AA”开头的字符串,第二个拆分将是那些以“BB”开头的字符串,等等。

我想这样做是因为我的数据需要像这样放在一起才能使 reduce 阶段正确运行。

到目前为止,我一直在玩的是编写自己的类InputFormatRecordReader类来执行此操作,但是我在一些示例(http://developer.yahoo.com/hadoop/tutorial/module5.html#fileformat)中看到了分裂当读者接触到它们时,它们就已经被创建了。我相信我遇到了拆分与字符串之间的边界不正确对齐的危险。

为了使这项工作充分发挥作用,我是否必须实现自己的InputFormat getSplits功能版本?如果我这样做,我是否会冒着以不利用机器局部性的方式将拆分分布在机器上的风险?最后,一般来说有没有更好的方法?

任何帮助表示赞赏。谢谢,

编辑 0

根据几位评论员的要求,我将提供更多信息。

我的程序的目标是比较属于组的字符串以找到这些字符串之间的重叠并记录哪些字符串一起共享该重叠。考虑以下示例。

AAAA
AAAB
AAAC
AAB
BAAA

所有开头共享“A”的字符串都有一些它们之间共有的重叠。以“B”开头的显然不是。当谈到实际发现具体的重叠是什么并建立这些组时,如果我正在查看“AAAA”,我需要一直比较到“BAAA”,而不是进一步。我担心的是 InputSplits 会切碎我的数据,这样某些字符串就不会被比较,并且我会丢失/不完整的组。我希望使用 Map 步骤(或读取数据)将问题分成这些组,然后允许 Reduce 步骤计算组并返回结果。

我有数百万这样的字符串,在一台机器上需要一段时间。我在逻辑上实施了大量“技巧”来简化流程并使其快速运行。我希望 Hadoop 能够介入并提供帮助并使其更快。

Joe K - 回答你的问题,我不知道所有字符串之间的重叠程度。重叠可以不同,例如 AA1 可以重叠 2 个字符到 AA4,但如果存在 AB5,则只有 1 个字符会重叠。字符串的长度可能会有很大差异,因此在其他情况下可能会有很大的重叠。此外,检测究竟是什么重叠是我想在减少阶段做的事情。这就是我的全部目标。

我不知道 shuffle/sort 阶段是否会正确地将相邻的字符串分配给同一个 reducer,或者是否会有中断。不幸的是,我对这个过程的无知让我在这里绊倒了。

编辑 0 结束

4

0 回答 0