首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Hadoop程序中处理大量的映射器密钥?

如何在Hadoop程序中处理大量的映射器密钥?
EN

Stack Overflow用户
提问于 2013-10-30 07:02:37
回答 2查看 140关注 0票数 0

我的Hadoop程序的映射阶段会生成大量的唯一键(一个数据集大约200K,另一个数据集大约900K )。每个键都是一个包含60个数字字符的字符串值。我的Hadoop程序的排序/混洗阶段花费的时间太长。对于如此多的键,有没有办法使排序/混洗阶段更有效率?

EN

回答 2

Stack Overflow用户

发布于 2013-10-30 07:56:42

您应该考虑使用组合器来降低网络的过热,将发送到减速器的“映射相位”输出组合在一起。

关于WritableComparator,你是对的,最好实现你的,因为据我所知,在排序阶段比较两个对象的方法是,一旦序列化了对象(来自映射器的输出),Hadoop为了给出和排序,必须反序列化它们,所以避免“反序列化阶段”并在字节级别进行比较要好得多。

在重写来自WritableComparable的方法compare时必须小心,因为正确地完成它可能非常困难,我从GrepCode引用的方法

http://grepcode.com/file/repository.cloudera.com/content/repositories/releases/com.cloudera.hadoop/hadoop-core/0.20.2-737/org/apache/hadoop/io/WritableComparator.java#WritableComparator.compare%28byte%5B%5D%2Cint%2Cint%2Cbyte%5B%5D%2Cint%2Cint%29

编辑

我补充说,我认为这是一篇很棒的文章,它提供了一些关于提高MapReduce性能的建议:

http://blog.cloudera.com/blog/2009/12/7-tips-for-improving-mapreduce-performance/

票数 0
EN

Stack Overflow用户

发布于 2013-10-30 22:23:56

您可能应该创建自定义密钥类型。这有几个原因:

  • 通过使用数字(二进制)密钥,您可以实现Comparable<BinaryComparable>,它可以比较字节而不是文本,从而提高速度
  • 您可以将密钥以二进制格式写入,这可以节省传输和读取密钥时的时间。如果我们要编写一个键类,我们可以扩展BytesWritable,它已经实现了我在第一个项目符号中提到的接口。

您可能应该调整一些作业参数。例如,您可能希望考虑调整作业中的io.sort选项。因为您有许多唯一值,所以Hadoop可能无法在内存中对它们进行排序,这意味着它必须溢出到磁盘。当发生这种情况时,必须重新读取和重新排序数据,从而减慢混洗速度。您可以通过查看日志来判断是否发生了溢出,因为溢出是被记录下来的。有关调优技巧,请参阅http://www.slideshare.net/cloudera/mr-perf

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19670780

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档