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

使用Hadoop处理来自多个数据源的数据,hadoop,hbase,apache-pig,Hadoop,Hbase,Apache Pig,mapreduce和任何其他hadoop技术HBase、Hive、pig等是否适用于您有多个输入文件以及需要在不同数据源之间比较数据的情况 在过去,我使用Hadoop和Pig编写了一些mapreduce作业。然而,这些任务非常简单,因为它们只涉及操作单个数据集。我们现在的需求要求我们从多个数据源读取数据,并对另一个数据源上的各种数据元素进行比较。然后我们报告差异。我们正在处理的数据集大约有1000万到6000万条记录,到目前为止,我们还没有足够快地完成这些工作 是否有理由使用mapreduce来

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

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

是否有理由使用mapreduce来解决这些问题,还是我走错了路


非常感谢您的任何建议。

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

是的,可以在mapreduce作业中连接多个数据集。我建议您购买一本书/电子书Hadoop In Action,它解决了从多个源连接数据的问题。

当您有多个输入文件时,您可以使用MapReduce API FileInputFormat.AddInputPath,其中可以包含多个文件的逗号分隔列表,如下所示:

FileInputFormat.addInputPaths("dir1/file1,dir2/file2,dir3/file3");
您还可以使用分布式缓存将多个输入传递到hadoop中的映射器中,详细信息如下所述:

如果我没有误解的话,您正在尝试规范化记录中的结构化数据,这些数据来自多个输入,然后进行处理。基于此,我认为你真的需要看看这篇文章,它在过去帮助过我。它包括以下内容:

步骤1:从原始数据中提取列值对。 步骤2:提取不在主ID文件中的列-值对 步骤3:计算主文件中每列的最大ID 步骤4:为不匹配的值计算新ID 步骤5:将新ID与现有主ID合并 步骤6:用ID替换原始数据中的值
使用多个输入,我们可以做到这一点

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中连接起来,并执行必要的逻辑

数据集是否已预排序和分区?数据集在记录中是关键的还是更复杂的?数据集来自第三方,所以我不能保证排序顺序。基本上,我必须将这些源中的地址字段与我们托管的主源进行匹配,并根据匹配进行某些操作。地址字段上的比较操作涉及相当复杂的字符串匹配逻辑。