hadoop - 如何使用 Hadoop MapReduce 处理一个二维数组,每个文件一个?

标签 hadoop mapreduce

我需要将一个文件作为一个整体来读取和处理,而不是逐行处理,目前还不清楚如何在 Hadoop MapReduce 应用程序中执行此操作。我需要做的是读取文件的第一行作为标题,我可以将其用作我的键,并将以下行作为数据来构建一个二维数据数组,我可以将其用作我的值。然后,我将对整个二维数据数组(即值)进行一些分析。

下面是我打算如何解决这个问题,如果这看起来不合理或者有更好的方法来解决这个问题,我将非常感谢您的评论(这是我的第一个认真的 MapReduce 应用程序,所以我'我可能会犯菜鸟错误):

  1. 我的文本文件输入包含一行站点信息(名称、纬度/经度、ID 等),然后一行或多行包含年份值(即 1956)加上 12 个月值(即 0.3 2.8 4.7 ...) 以空格分隔。我必须对整个月度值数组 [number_of_years][12] 进行处理,因此每一行孤立无意义。

  2. 创建自定义键类,使其实现 WritableComparable。这将保留输入文本文件初始行的标题信息。

  3. 创建一个自定义输入格式类,其中 a) isSplitable() 方法返回 false,b) getRecordReader() 方法返回一个知道如何读取文件拆分并将其转换为我的自定义记录读取器自定义键和值类。

  4. 创建一个映射器类,它对输入值(月值的二维数组)进行分析并输出原始键(站头信息)和输出值(月值的二维数组)分析值)。将只有一个包装 reducer 类,因为没有真正的减少要做。

目前尚不清楚这是否是 map reduce 方法的良好/正确应用 a) 因为我正在对映射到单个键的单个值(数据数组)进行分析,并且 b) 因为再也没有更多而不是每个键的单个值(数据数组),那么就不需要执行真正的缩减。另一个问题是我正在处理的文件相对较小,远小于默认的 64MB 拆分大小。在这种情况下,第一个任务可能是将输入文件整合到序列文件中,如 Definitive Hadoop O'Reilly 书籍(第 2 版第 194 页)中的 SmallFilesToSequenceFileConverter 示例所示?

提前感谢您的意见和/或建议!

最佳答案

看起来你关于编码的计划是正确的,我也会做同样的事情。 如果你有很多输入文件作为作业的输入提供,你将从 hadoop 中受益,因为每个文件都有自己的 InputSplit,并且在 Hadoop 中执行的映射器数量与输入拆分数量相同。 小文件太多会导致 HDFS Namenode 内存占用过多。要合并文件,您可以使用 SequenceFiles 或 Hadoop Archives(hadoop 等同于 tar)See docs .对于 har 文件(Hadoop 文件),每个小文件都有自己的映射器。

关于hadoop - 如何使用 Hadoop MapReduce 处理一个二维数组,每个文件一个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11319681/

相关文章:

hadoop - Giraph 作业始终以本地模式运行

hadoop - 为什么 MultipleOutputs 不适用于此 Map Reduce 程序?

java - Hadoop map reduce 从 csv 格式的 csv 文件中提取特定列

java - hadoop NaturalKeyGroupingComparator - Reducer 中发生了什么?

apache - Dry adOpt(并行分支和绑定(bind)库) - 可用性

hadoop - Hadoop数据分割和数据流控制

hadoop - 如何在 PIG 中的键匹配时对特定列求和

hadoop - Map Reduce沿途生成的数据

hadoop - EMR 配置 json

amazon-ec2 - 将新卷添加到伪分布式 Hadoop 节点无提示失败