我想用一个字符串列表填充Cassandra数据库,然后我使用Hadoop处理它。我想要做的是使用Hadoop集群按顺序遍历所有字符串,并记录每个字符串之间的重叠程度,以便找到最长公共子字符串。
我的问题是,InputFormat对象是否允许我按排序顺序读出数据,或者我的字符串是否会在群集中的每台机器上“随机”(根据Cassandra如何决定分发它们)读出? MapReduce流程是否设计为自行处理每一行,而不是像我要求的那样连续查看两行?
答案 0 :(得分:1)
首先,Mappers将按照从InputFormat获取数据的顺序读取数据。我不是Cassandra专家,但我不希望它按顺序排列。
如果你想要排序顺序,你应该使用一个身份映射器(一个什么都不做),其输出键是字符串本身。然后在传递给reduce步骤之前对它们进行排序。但它有点复杂,因为你可以有多个减速器。只有一个减速器,一切都是全局排序的。如果有多个,则会对每个reducer的输入进行排序,但可能不会对Reducer中的输入进行排序。也就是说,相邻的字符串可能不会转到相同的reducer。你需要一个自定义分区来处理它。
最后,你提到你正在做最长的常见子串 - 你是在寻找每对字符串中最长的子串吗?在连续的字符串中?在所有字符串中?这些可能性中的每一种都将影响您构建MapReduce作业的方式。