Hadoop 使用MapReduce编程模型比较两个大型数据集
假设我有两个相当大的数据集——第一个叫做“Base”,它包含2亿个制表符分隔行,第二个叫做“MatchSet”,它包含1000万个制表符分隔行的类似数据 假设我还有一个名为Match(row1,row2)的任意函数,Match()本质上包含一些试探法,用于查看row1(来自MatchSet)并将其与row2(来自Base)进行比较,并确定它们是否在某些方面相似 假设Match()中实现的规则是自定义的复杂规则,也不是简单的字符串匹配,涉及一些专有方法。让我们假设现在的匹配(ROW1,ROW2)是用pSueDO代码编写的,所以在另一种语言中实现不是问题(虽然它现在是C++)。p> 在一个线性模型中,aka程序运行在一个巨大的处理器上——我们将读取MatchSet中的每一行和Base中的每一行,并使用Match()将一行与另一行进行比较,并写出我们的匹配统计数据。例如,我们可以捕获:来自匹配集的X记录是强匹配,来自匹配集的Y记录是弱匹配,来自匹配集的Z记录不匹配。我们还将强/弱/非值写入单独的文件以供检查。又名,一种嵌套循环:Hadoop 使用MapReduce编程模型比较两个大型数据集,hadoop,mapreduce,elastic-map-reduce,Hadoop,Mapreduce,Elastic Map Reduce,假设我有两个相当大的数据集——第一个叫做“Base”,它包含2亿个制表符分隔行,第二个叫做“MatchSet”,它包含1000万个制表符分隔行的类似数据 假设我还有一个名为Match(row1,row2)的任意函数,Match()本质上包含一些试探法,用于查看row1(来自MatchSet)并将其与row2(来自Base)进行比较,并确定它们是否在某些方面相似 假设Match()中实现的规则是自定义的复杂规则,也不是简单的字符串匹配,涉及一些专有方法。让我们假设现在的匹配(ROW1,ROW2)是
for each row1 in MatchSet
{
for each row2 in Base
{
var type = Match(row1,row2);
switch(type)
{
//do something based on type
}
}
}
我已经开始考虑将Hadoop流作为一种在短时间内将这些比较作为批处理作业运行的方法。然而,对于这类问题,我很难理解map-reduce范式
在这一点上,我非常清楚如何从hadoop获取单个输入,使用映射函数处理数据,然后发出结果以减少数据量。然而,比较两组记录的“嵌套循环”方法让我有些困惑
我最接近的解决方案是,我基本上仍然需要在2亿条记录上并行进行1000万条记录的比较,因此每个节点有2亿/n个节点*1000万次迭代。这是最有效的方法吗?检查论文中的
第3.5节-关系联接。我没有详细说明,但它可能会对您有所帮助。从您的描述中,我觉得您的问题可能任意复杂,并且可能成为问题的受害者
例如,假设您的行表示n维向量,并且您的匹配函数基于基向量和匹配集向量之间的欧几里德距离为“强”、“弱”或“不匹配”。在速度、记忆和近似答案的质量之间进行权衡,有很好的技术来解决这些问题。关键的是,这些技术通常具有已知的时间和空间界限,以及在给定匹配集原型周围一定距离内找到点的概率,所有这些都取决于算法的一些参数
不要让我在这里漫谈,请考虑阅读以下内容:
当您搜索“对位置敏感的哈希映射reduce”时,Google Scholar的最初几次点击。特别是,我记得我饶有兴趣地阅读了[Das,Abhinandan S.,et al.,《谷歌新闻个性化:可扩展的在线协同过滤》,《第16届万维网国际会议记录》,ACM,2007年)
现在,另一方面,如果您可以设计一个直接适用于某种形式的散列的方案,那么您可以轻松地为每个记录生成一个具有这种散列的键(或者甚至是少量可能的散列键,其中一个将匹配查询“基”数据),问题就变成了一个简单的大规模连接。(我说“更大”,因为如果问题确实是连接,那么将200米行与10米行连接起来就相当小了)。作为一个例子,考虑CDDB为任何音乐CD计算32位ID的方式。有时,一个给定的标题可能会产生稍有不同的ID(即,同一标题的不同CD,甚至同一CD被多次读取)。但是总的来说,这个标题有一小部分不同的ID。以复制匹配集为代价,在这种情况下,您可以获得非常快速的搜索结果。这是一个老问题,但假设您的单流作业进行了200M*10M Match()计算,您提出的解决方案是正确的。通过N批(200M/N)*10M的计算,您已经实现了N倍的加速。通过在映射阶段进行计算,然后对结果进行阈值化并将其引导到强/弱/无匹配减缩器,可以收集结果以输出到单独的文件
如果可以利用额外的优化,它们将同时应用于单流和并行版本。示例包括阻塞,以便您需要进行少于200M*10M的计算,或者为10M匹配集预计算算法的常量部分。这是一篇有趣的文章,但这里的连接都是基于某个共享密钥。如果你考虑我的问题,我没有那么奢侈。这是我的阅读清单。但是,我想你会发现这很有趣。我否决了这个问题。在第一种情况下,它不能太具有启发性,因为我们仍然每次查看一条记录(至少在上面的描述中)。那么,问题似乎更需要理解map-reduce过程,然后调用算法。那么启发式部分实际上是一个算法,这里没有描述。所以这个问题可能应该重写。是的,很公平,那是5年前的事了,可能是真的。我没有编辑(因为我实际上不再在乎了),而且我似乎无法删除。