2012-05-30 153 views
1

mapreduce和任何其他hadoop技术(HBase,Hive,pig等)是否适用于您有多个输入文件并且需要在不同数据源之间比较数据的情况。使用Hadoop处理来自多个数据源的数据

在过去,我使用Hadoop和Pig编写了一些mapreduce作业。然而,这些任务非常简单,因为它们只涉及操纵单个数据集。我们现在的要求规定,我们从多个来源读取数据,并对另一个数据源上的各种数据元素进行比较。然后我们报告差异。我们正在使用的数据集在1000万到6000万条记录的范围内,迄今为止我们还没有设法使这些工作足够快。

是否有使用mapreduce来解决这些问题的情况,还是我走错了路线。

任何建议,非常感谢。

+0

是集预排序和分配?如何比较数据集(记录中的关键字,还是更复杂的)? –

+0

数据集来自第三方,所以我无法保证排序顺序。基本上,我必须将这些来源的地址字段与 匹配,这是我们托管的“主”来源,并根据匹配我们执行某些操作。地址字段的比较操作涉及相当复杂的字符串匹配逻辑 。 – swedstar

回答

0

我想我会预处理不同的数据集到一个通用的格式(肯定包括一个“数据源”id列,每个行来自同一个数据集的唯一唯一值)。然后将这些文件移动到同一个目录中,加载整个目录并将其视为单个数据源,根据它们的数据集标识比较行的属性。

0

是的,您可以加入mapreduce作业中的多个数据集。我建议您获取书籍/电子书Hadoop In Action的副本,以解决来自多个来源的加入数据问题。

0

当你有多个输入文件,您可以使用的MapReduce API FileInputFormat.addInputPaths(),其中可以用逗号分隔的多个文件列表,如下:

FileInputFormat.addInputPaths("dir1/file1,dir2/file2,dir3/file3"); 

您也可以通过多个输入成使用分布式缓存的hadoop映射器,更多信息在这里描述:multiple input into a Mapper in hadoop

如果我没有误解你试图规范化记录中的结构化数据,从几个输入进来,然后处理它。基于此,我认为你真的需要看看过去帮助我的这篇文章。它包括How To Normalize Data Using Hadoop/MapReduce如下:

  • 步骤1:提取从原始数据列值对。
  • 步骤2:提取物列值对未在主ID文件
  • 步骤3:计算所述最大的ID为在主文件的每一列
  • 步骤4:计算一个新的ID为不匹配的值
  • 第5步:合并新的ID与现有的主标识
  • 第6步:在原始数据的值与标识
0

使用MultipleInputs我们可以做到这一点更换。

MutlipleInputs.addInputPath(job, Mapper1.class, TextInputFormat.class,path1); 
MutlipleInputs.addInputPath(job, Mapper2.class, TextInputFormat.class,path2); 
job.setReducerClass(Reducer1.class); 
//FileOutputFormat.setOutputPath(); set output path here 

如果这两个类都有一个共同的关键,​​那么他们可以在减速被连接,并做了必要的逻辑