我有一个应用程序需要读取一个文件,该文件是 ArrayList 的序列化结果。(ArrayList<String>
,此列表中有 50000 条记录,大小:20MB)我不知道如何将数据读取到 hadoop 平台。我只知道我需要覆盖 InputFormat 和 OutpurFormat。我是hadoop平台的初学者。你能给我一些建议吗?
谢谢,
郑。
首先,您需要扩展 FileInputFormat,特别是实现抽象FileInputFormat.createRecordReader方法。
您可以查看LineRecordReader(这是TextInputFormat用于处理文本文件的内容)之类的源代码。
从那里你几乎是靠你自己的(即这取决于你的 ArrayList 是如何被序列化的)。查看 LineRecordReader 的源代码,并尝试将其与 ArrayList 的序列化方式相关联。
其他一些注意事项,您的文件格式是否可拆分?即,您是否可以在文件中寻找偏移量并从那里恢复流(文本文件可以,因为它们只是向前扫描到当前行的末尾,然后从那里开始)。如果您的文件格式使用压缩,您还需要考虑到这一点(例如,您不能随机寻找 gzip 文件中的某个位置)。默认情况下 FileInputFormat.isSplittable 将返回 true,您可能希望最初将其覆盖为 false。如果您坚持使用“不可分割”,请注意您的文件将由单个映射器处理(不管它的大小)。
在 Hadoop 上处理数据之前,您应该将数据上传到 HDFS 或其他支持的文件系统,如果它不是由其他东西上传到这里的话。如果您正在控制上传过程,您可以将上传阶段的数据转换为您可以轻松处理的内容,例如:
这是最简单的解决方案,因为您不必干预 Hadoop 的内部结构。