1

我有一个应用程序需要读取一个文件,该文件是 ArrayList 的序列化结果。(ArrayList<String>,此列表中有 50000 条记录,大小:20MB)我不知道如何将数据读取到 hadoop 平台。我只知道我需要覆盖 InputFormat 和 OutpurFormat。我是hadoop平台的初学者。你能给我一些建议吗?

谢谢,

郑。

4

2 回答 2

2

首先,您需要扩展 FileInputFormat,特别是实现抽象FileInputFormat.createRecordReader方法。

您可以查看LineRecordReader(这是TextInputFormat用于处理文本文件的内容)之类的源代码。

从那里你几乎是靠你自己的(即这取决于你的 ArrayList 是如何被序列化的)。查看 LineRecordReader 的源代码,并尝试将其与 ArrayList 的序列化方式相关联。

其他一些注意事项,您的文件格式是否可拆分?即,您是否可以在文件中寻找偏移量并从那里恢复流(文本文件可以,因为它们只是向前扫描到当前行的末尾,然后从那里开始)。如果您的文件格式使用压缩,您还需要考虑到这一点(例如,您不能随机寻找 gzip 文件中的某个位置)。默认情况下 FileInputFormat.isSplittable 将返回 true,您可能希望最初将其覆盖为 false。如果您坚持使用“不可分割”,请注意您的文件将由单个映射器处理(不管它的大小)。

于 2012-10-06T13:09:23.130 回答
0

在 Hadoop 上处理数据之前,您应该将数据上传到 HDFS 或其他支持的文件系统,如果它不是由其他东西上传到这里的话。如果您正在控制上传过程,您可以将上传阶段的数据转换为您可以轻松处理的内容,例如:

  • 简单文本文件(每个数组项的行)
  • 如果数组可以包含带有 '\n' 的行,则 SequenceFile

这是最简单的解决方案,因为您不必干预 Hadoop 的内部结构。

于 2012-10-06T21:46:44.117 回答