hadoop - 如何从Mapper或Reducer发出值列表?

标签 hadoop mapreduce hbase hdfs

我有一个包含一些地球物理数据(地震数据)的文件,我正在从本地文件系统中读取这些文件,并将它们作为Hadoop顺序文件存储在HDFS中。

现在,我想编写一个MapReduce作业,该作业可以从这些顺序文件中读取值并将它们存储到HBase表中。这些文件不仅仅是平面文件。相反,它们由许多部分组成,其中每个部分是一个240字节的块,并具有多个字段。每个字段可以是短整数或整数。我将块号用作键,并将240字节(包含所有字段)的字节数组用作顺序文件的值。因此,每个顺序文件都将所有块作为字节数组及其块号。

我的问题是,在处理这样的文件时,如何在完成240字节的块后读取每个240字节的块,读取单个字段并一次发射所有字段?假设我有一个包含1000个块的文件。因此,在我的MapReduce程序中,我必须一次读取这1000个块,提取每个字段(short或int),并将所有字段作为一个Map的结果发出。

我需要一些帮助。

最佳答案

只是为了确保您要读取每个240 bytes块,将块号作为键发出,将字节数组作为值发出?我认为您必须扩展默认的SequenceFileInputFormat。我不确定序列文件的工作方式或结构(抱歉),但我试图读取文件的全部内容作为输出值发出,而我的方法是扩展FileInputFormat。也许您可以看一下SequenceFileInputFormat的源代码,看看是否有一种方法可以将每个InputSplit(如果您的数据是结构化的)制作一个240 bytes,或者使用某种分隔符。

希望这可以帮助!

关于hadoop - 如何从Mapper或Reducer发出值列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10455351/

相关文章:

performance - 平衡 HDFS -> HBase mapreduce 作业的想法

配置单元中的 java.sql.SQLException : org. apache.thrift.transport.TTransportException?

hadoop - java.lang.ClassNotFoundException : org. apache.hadoop.hbase.protobuf.generated.MasterProtos$MasterService$BlockingInterface 问题

json - Hadoop Java MapReduce 用 Ja​​ckson 问题解析 JSON

hadoop - 在 Eclipse Map/Reduce 位置中,New Hadoop 位置没有响应?

java - Hadoop(java)改变Mapper输出值的类型

java - 如何在运行时更改 map-reduce 作业的作业参数?

java - 缺少列或列值为空的记录的 Hbase 扫描过滤器

hadoop - map task 开始前要做的事情

filesystems - HDFS 目录中允许的最大文件数是多少?