Hadoop Java vs C/C++;关于cpu密集型任务
我是Hadoop新手。我想使用层次聚类法对约1.5亿个项目进行聚类,每个项目都有约30个属性。维度/属性的总数约为5000 我设计了一个多级解决方案,对整个数据进行分区,在每个分区上执行集群,然后在那里合并每个集群,直到检索到所需数量的集群Hadoop Java vs C/C++;关于cpu密集型任务,java,c,hadoop,mapreduce,cluster-analysis,Java,C,Hadoop,Mapreduce,Cluster Analysis,我是Hadoop新手。我想使用层次聚类法对约1.5亿个项目进行聚类,每个项目都有约30个属性。维度/属性的总数约为5000 我设计了一个多级解决方案,对整个数据进行分区,在每个分区上执行集群,然后在那里合并每个集群,直到检索到所需数量的集群 - Clustering is performed in each map task. So, each map task would be cpu-intensive. - I am stuck at deciding about which of the
- Clustering is performed in each map task. So, each map task would be cpu-intensive.
- I am stuck at deciding about which of the following options to use:
- Map-Reduce in native Java.
- Map-Reduce using Hadoop Streaming on C.(This is because of each task being cpu-intensive).
Which option should I go with?. Is there any other way I could achieve my destination?
如果这真的很重要,你必须对他们中的每一个人进行分析。没有办法预先告诉你 我的直觉是,一个简单的Java实现将执行与本机C类似的操作,除非您开始手动优化后者 请记住,MapReduce的IO时间通常很高,尤其是在读取文本文件时。因此,进行几百次KMeans运算或计算一个SVD可能并没有那么昂贵。因此,您还需要衡量这一方面。在许多情况下,除非仔细优化C代码,否则Java(如果编写良好)将产生与C类似的性能。令人惊讶的是,在许多情况下,编写良好的Java代码的性能确实优于C代码,因为C代码在编译时进行了优化,而Java hotspot编译器在运行时进行了优化(在运行时,它有关于每个代码路径使用频率的统计数据)。 如果您收集了类似的统计信息,并且这些统计信息不会因数据的不同而发生变化,则有时您可以向C编译器提供提示,例如,使用某些C编译器中提供的
\u builtin\u expect()
。但这真的很难做到
但是请记住,Java的某些部分价格相当高:
- 切勿使用
,集合
等进行计算,因为装箱成本太高。这些在热循环中非常昂贵数组列表
- 考虑使用比
更快的I/O。Hadoop使用BufferedReader
而不是文本
是有原因的——缓冲区回收降低了I/O成本字符串
- 启动成本。你的应用程序应该长时间运行,而不是经常重启
对于您的实际任务,执行HAC:首先确保您具有工作相似性。没有什么比构建大规模聚类算法更糟糕的了,只是为了发现它不起作用,因为您无法以有意义的方式度量相似性首先在小样本上解决问题,然后扩大规模。谢谢Alexander。我当然也会记住I/O时间。由于有1.25亿个项目,我计划将分区大小保持在25000个。因此,第一级需要执行约5000个集群。等等因此,我预计总共有8000个分区群集。。