2012-07-03 45 views
1

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

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

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

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

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

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

目前尚不清楚,这是地图的良好/正确应用减少方法一)因为我映射到一个键的单一值(数据阵列)做分析,和b),因为每个密钥永远不会超过单个值(数据数组),那么不需要执行真正的减少。另一个问题是我正在处理的文件相对较小,远远小于默认的64MB分割大小。在这种情况下,第一个任务可能是将输入文件整合到一个序列文件中,如定义性Hadoop O'Reilly书中的SmallFilesToSequenceFileConverter示例所示(第2版,第194页)?

在此先感谢您的意见和/或建议!

回答

1

它看起来像你的编码计划是现货,我会做同样的事情。 如果您有很多输入文件作为输入提供给作业,您将受益于hadoop,因为每个文件都有自己的InputSplit,并且在Hadoop中执行的映射器的数量与输入拆分的数量相同。 太多的小文件会在HDFS Namenode上造成太多的内存使用。要合并文件,您可以使用SequenceFiles或Hadoop Archives(相当于tar的hadoop)See docs。使用har文件(Hadoop Archives),每个小文件都将拥有自己的映射器。

相关问题