我是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?
2条答案
按热度按时间vnjpjtjt1#
在许多情况下,除非对c代码进行仔细的优化,否则java(在编写良好的情况下)将产生与c类似的性能。令人惊讶的是,在许多情况下,编写良好的java代码的性能确实优于c代码,因为c代码是在编译时优化的,而java热点编译器是在运行时优化的(在运行时它有关于每个代码路径使用频率的统计信息)。如果您收集了类似的统计信息,并且这些统计信息不会根据您的数据而改变,那么您有时可以向c编译器提供提示,例如使用
__builtin_expect()
在某些c编译器中可用。但这真的很难做到。但是请记住,java的某些部分价格很高:
从不使用
Collection<Integer>
,ArrayList<Double>
等进行计算,因为装箱成本。这些在热循环中非常昂贵。考虑使用比
BufferedReader
. hadoop使用Text
而不是String
-缓冲区回收降低了i/o成本。启动成本。你的应用程序应该长时间运行,而不是经常重启。
对于hadoop,记住hadoop流不是免费的。如果您还没有意识到:hadoop流媒体本身是用java实现的。所有数据都将通过java。hadoop streaming是一个java应用程序,它启动脚本应用程序,向其中写入数据(即序列化数据!),并读回输出(反序列化数据!)。除了实际的程序成本外,您几乎可以获得所有的java成本:hadoop streaming是一个用java编写的Map器,它将数据传递给外部程序,读回答案,然后将其返回给hadoop。对一些简单的东西进行基准测试,比如用c编写的字数统计与用java优化的字数统计,看看两者的区别。
对于你的实际任务,做hac:首先确保你有一个工作相似性。没有什么比构建一个大规模的聚类算法更糟糕的了,仅仅是为了发现它不起作用,因为你不能用一种有意义的方式来度量相似性。首先在小样本上解决问题,然后扩大规模。
oiopk7p52#
如果这真的很重要的话,你就必须对他们每个人都进行分析。没有办法预先说清楚。
我的直觉是,一个简单的java实现的性能将类似于原生c,除非您开始手动优化后者。
请记住,mapreduce的io时间通常很高,尤其是在读取文本文件时。所以做几百遍的kmeans或者计算一个svd可能并没有那么昂贵。所以你也要测量这方面。