如何在hadoop应用程序中覆盖InputFormat和OutputFormat

时间:2012-10-06 12:07:14

标签: java hadoop io

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

谢谢,

征。

2 个答案:

答案 0 :(得分:2)

首先,您需要扩展FileInputFormat,值得注意的是实现抽象FileInputFormat.createRecordReader方法。

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

从那里开始,你几乎就是你自己(也就是说它取决于你的ArrayList是如何序列化的)。查看LineRecordReader的源代码,并尝试将其与ArrayList的序列化方式联系起来。

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

答案 1 :(得分:0)

在处理Hadoop上的数据之前,您应该将数据上传到HDFS或其他支持的文件系统,如果它没有通过别的方式上传到此处。如果您正在控制上传过程,您可以将上传阶段的数据转换为您可以轻松处理的内容,例如:

  • 简单文本文件(每个数组的行项目)
  • SequenceFile如果数组可以包含带有&#39; \ n&#39;
  • 的行

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