如何使用Hadoop MapReduce处理每个文件一个2-D阵列?

时间:2012-07-03 21:48:05

标签: hadoop mapreduce

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

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

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

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

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

  4. 创建一个mapper类,对输入值(月值的二维数组)进行分析并输出原始键(站标题信息)和输出值(二维数组)分析值)。只有一个包装器减速器类,因为没有真正的减少。

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

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

1 个答案:

答案 0 :(得分:1)

看起来您的编码计划是现场,我会做同样的事情。 如果您有大量输入文件作为Job的输入提供,您将受益于hadoop,因为每个文件都有自己的InputSplit,而Hadoop中执行的映射器数量与输入分割数量相同。 太多的小文件会导致HDFS Namenode上的内存使用过多。要合并文件,您可以使用SequenceFiles或Hadoop Archives(hadoop等效于tar)See docs。使用harfile(Hadoop Archives),每个小文件都有自己的Mapper。