使用 Hadoop 处理来自多个数据源的数据
Posted
技术标签:
【中文标题】使用 Hadoop 处理来自多个数据源的数据【英文标题】:Using Hadoop to process data from multiple datasources 【发布时间】:2012-05-30 23:44:08 【问题描述】:mapreduce 和任何其他 hadoop 技术(HBase、Hive、pig 等)是否非常适合您有多个输入文件以及需要在不同数据源之间比较数据的情况。
过去,我使用 Hadoop 和 Pig 编写了一些 mapreduce 作业。然而,这些任务非常简单,因为它们只涉及操作单个数据集。我们现在的要求要求我们从多个来源读取数据,并对另一个数据源上的各种数据元素进行比较。然后我们报告差异。我们正在使用的数据集大约有 1000 万到 6000 万条记录,到目前为止,我们还没有设法让这些工作足够快。
是否有使用 mapreduce 来解决此类问题的案例,还是我走错了路。
非常感谢任何建议。
【问题讨论】:
数据集是否预先排序和分区?数据集是如何比较的(记录中的关键,或更复杂)? 数据集来自第三方,所以我不能保证排序顺序。基本上,我必须将来自这些来源的地址字段与我们托管的“主”来源相匹配,并根据匹配我们做某些事情。地址字段的比较操作涉及相当复杂的字符串匹配逻辑。 【参考方案1】:我想我会将不同的数据集预处理为通用格式(确保包含一个“数据源”id 列,其中每一行来自同一数据集的单个唯一值)。然后将文件移动到同一目录中,加载整个目录并将其视为单个数据源,您可以在其中根据数据集 id 比较行的属性。
【讨论】:
【参考方案2】:是的,您可以在一个 mapreduce 作业中加入多个数据集。我建议您获取一本书籍/电子书 Hadoop In Action,它解决了来自多个来源的数据连接问题。
【讨论】:
【参考方案3】:当您有多个输入文件时,您可以使用 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【讨论】:
【参考方案4】:使用 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并做必要的逻辑
【讨论】:
以上是关于使用 Hadoop 处理来自多个数据源的数据的主要内容,如果未能解决你的问题,请参考以下文章