1

我正在尝试了解一个示例 hadoop 项目。它有以下代码块

jconf.setOutputKeyClass(Text.class);
jconf.setOutputValueClass(Text.class);
jconf.setInputFormat(SequenceFileInputFormat.class);

这个链接,我读到对于 SequenceFileInputFormat,键和值是用户定义的。我需要为此实现 RecordReader 吗?我没有看到它在项目中实现。是否有任何默认分隔符用于将输入拆分为键、值对?

4

2 回答 2

2

您不必实现 RecordReader 来读取序列文件。

但是,生成序列文件并不像生成文本文件那么简单。所有命令,例如

hadoop fs -put

默认在 HDFS 中生成文本文件。

如果你想测试一个需要序列文件作为输入的 MR 程序,你首先需要将你的文本文件转换为序列文件并将其作为输入。

要从文本文件创建序列文件,您可以编写一个简单的带有身份映射器且没有reducer的MR。您需要将输入文件格式设置为文本并将文本文件作为输入传递;在此作业中将输出格式设置为序列文件.此作业的输出将是您的文本文件的序列文件格式的副本。确保选择此作业的输出键和值,记住任何使用序列文件的后续 MR 作业都必须接受它们为它的输入键和值。换句话说,序列文件中的键和值是在创建时确定的。

任何需要序列文件的后续 MR 作业(如您在问题中引用的那个)都可以使用上述序列文件,并且映射器输入中的“键”和“值”类型将与您之前发出的相同。

于 2013-03-08T09:56:51.013 回答
0

对于您的问题,“是否有用于识别密钥的默认分隔符?” 我认为你不必担心这一点。本质上,序列文件由二进制键/值对组成。您可以使用 SequenceFile.Writer#append 来写入键和值。

http://hadoop.apache.org/docs/r1.1.1/api/org/apache/hadoop/io/SequenceFile.Writer.html#append%28java.lang.Object,%20java.lang.Object%29

于 2013-03-08T18:29:23.417 回答