1

我需要将文件作为一个单元读取和处理,而不是逐行读取和处理,并且不清楚如何在 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. 创建一个映射器类,它对输入值(每月值的二维数组)进行分析并输出原始键(站头信息)和输出值(分析值的二维数组)。将只有一个包装减速器类,因为没有真正的减少要做。

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

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

4

1 回答 1

1

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

于 2012-07-04T14:05:07.220 回答