Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hadoop 使用MapReduce编程模型比较两个大型数据集_Hadoop_Mapreduce_Elastic Map Reduce - Fatal编程技术网

Hadoop 使用MapReduce编程模型比较两个大型数据集

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)是

假设我有两个相当大的数据集——第一个叫做“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记录不匹配。我们还将强/弱/非值写入单独的文件以供检查。又名,一种嵌套循环:

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年前的事了,可能是真的。我没有编辑(因为我实际上不再在乎了),而且我似乎无法删除。