使用Hadoop处理来自多个数据源的数据

时间:2012-05-30 23:44:08

标签: hadoop hbase apache-pig

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

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

是否存在使用mapreduce来解决此类问题的情况,或者我是否走错了路线。

非常感谢任何建议。

4 个答案:

答案 0 :(得分:0)

我想我会将不同的数据集预处理为一种通用格式(确保包含“数据源”id列,其中每个行都有一个来自同一数据集的唯一值)。然后将文件移动到同一目录中,加载整个目录并将其视为单个数据源,在其中根据数据集ID比较行的属性。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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

您还可以使用分布式缓存将多个输入传递到hadoop中的Mapper,此处描述了更多信息:multiple input into a Mapper in hadoop

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

  • 步骤1:从原始数据中提取列值对。
  • 步骤2:提取不在主ID文件中的列值对
  • 步骤3:计算主文件中每列的最大ID
  • 步骤4:计算不匹配值的新ID
  • 步骤5:将新ID与现有主ID合并
  • 步骤6:使用ID替换原始数据中的值

答案 3 :(得分: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

如果两个类都有一个公共密钥,那么它们可以在reducer中连接并执行必要的逻辑