Hadoop Java vs C/C++;关于cpu密集型任务

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

我是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 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的某些部分价格相当高:

  • 切勿使用
    集合
    数组列表
    等进行计算,因为装箱成本太高。这些在热循环中非常昂贵
  • 考虑使用比
    BufferedReader
    更快的I/O。Hadoop使用
    文本
    而不是
    字符串
    是有原因的——缓冲区回收降低了I/O成本
  • 启动成本。你的应用程序应该长时间运行,而不是经常重启
对于hadoop,请记住,hadoop流媒体不是免费的。如果您还没有意识到:hadoop流媒体本身是用Java实现的。所有数据都将通过Java传递。Hadoop streaming是一个Java应用程序,它启动脚本应用程序,向其中写入数据(即序列化数据!),并读回输出(反序列化数据!)。除了实际的程序成本之外,您几乎可以得到所有的Java成本:hadoop streaming是一个用Java编写的映射程序,它将数据传递给外部程序,读回答案,然后将其返回给hadoop。对一些简单的东西进行基准测试,比如用C编写的字数统计与用Java编写的优化字数统计,以查看两者之间的差异


对于您的实际任务,执行HAC:首先确保您具有工作相似性。没有什么比构建大规模聚类算法更糟糕的了,只是为了发现它不起作用,因为您无法以有意义的方式度量相似性首先在小样本上解决问题,然后扩大规模。

谢谢Alexander。我当然也会记住I/O时间。由于有1.25亿个项目,我计划将分区大小保持在25000个。因此,第一级需要执行约5000个集群。等等因此,我预计总共有8000个分区群集。。