tho*_*ers 5 java hadoop mapreduce
假设我在文本文件中为特定用户设置了时间戳,例如
#userid; unix-timestamp; value
1; 2010-01-01 00:00:00; 10
2; 2010-01-01 00:00:00; 20
1; 2010-01-01 01:00:00; 11
2; 2010-01-01 01:00:00, 21
1; 2010-01-02 00:00:00; 12
2; 2010-01-02 00:00:00; 22
Run Code Online (Sandbox Code Playgroud)
我有一个自定义类"SessionSummary"实施阅读字段和写入的WritableComparable.其目的是为每个日历日总结每个用户的所有值.
因此,映射器的线给每个用户映射,减速器总结每天的所有值每个用户,并输出作为SessionSummary TextOutputFormat(使用的toString的SessionSummary,作为制表符分隔的UTF-8字符串):
1; 2010-01-01; 21
2; 2010-01-01; 41
1; 2010-01-02; 12
2; 2010-01-02; 22
Run Code Online (Sandbox Code Playgroud)
如果我需要将这些摘要条目用于第二个Map/Reduce阶段,我应该如何解析此摘要数据以填充成员?我可以通过使用文本String作为DataInput以某种方式重用现有的readField和write方法(WritableComparable接口实现)吗?这(显然)不起作用:
public void map(...) {
SessionSummary ssw = new SessionSummary();
ssw.readFields(new DataInputStream(new ByteArrayInputStream(value.getBytes("UTF-8"))));
}
Run Code Online (Sandbox Code Playgroud)
一般而言:是否有最佳实践在Hadoop中实现自定义键和值,并使它们可以在多个M/R阶段轻松重用,同时在每个阶段保持人类可读的文本输出?
(Hadoop版本为0.20.2/CDH3u3)
第一个MR作业的输出格式应该是SequenceFileOutputFormat
- 这将以二进制格式存储reducer中的Key/Values输出,然后可以在第二个MR作业中读回SequenceFileInputFormat
.另外,请确保您设置outputKeyClass
并outputValueClass
在Job
相应.
然后第二个作业中的映射器具有SessionSummary
(无论值类型是什么)
如果需要查看第一个MR作业的文本输出,可以在HDFS中的输出文件上运行以下命令:
hadoop fs -libjars my-lib.jar -text output-dir/part-r-*
Run Code Online (Sandbox Code Playgroud)
这将读取序列文件键/值对并调用toString()
两个对象,在输出到stdout时将它们分开.在-libjars
这里的Hadoop可以找到您的自定义键/值类指定
归档时间: |
|
查看次数: |
2022 次 |
最近记录: |