我遇到大数据问题,并且在并行处理和大数据方面的经验非常有限。我有数以亿计的行,其中包含纬度和经度数据以及多个ID。对于每个ID,我可以拥有10000 -10000000范围内的数据。
我正在实现基于密度的聚类算法(DBSCAN),以解决一些业务需求。聚类算法针对每个ID独立运行。
当前实现;
当前的实现基于使用sklearn Machine学习库的Python代码,但是要花费大约一天或更长时间才能完成约5000万个数据点的(集群和其他业务逻辑)。
我可以优化python代码并减少时间,但我正在寻找更可行的解决方案。
可用性
我有一个分布在appx 20机器上的spark集群,但是pyspark没有DBSCAN的实现。通过一些搜索,我可以发现一些scala实现,但是它们似乎不太可靠。来自我搜索的网址是。
https://github.com/irvingc/dbscan-on-spark
DBSCAN on spark : which implementation
由于我所有的代码都是用python编写的,因此我想坚持使用更多pythonic的解决方案。
就像我提到的,聚类算法针对每个设备独立运行,一种减少时间的方法是将每个ID的计算并行分配给所有20台计算机。这样我至少可以获得20倍更好的性能。但是我不知道如何实现这一目标。我所能想到的就是MapReduce。
我愿意接受任何更强大的解决方案。任何帮助将不胜感激。
最佳答案
由于序列化,pySpark的开销不可忽略。如果要真正快,请使用尽可能少的层以减少开销。
我只是将数据分割成所需的分区,然后使用您能找到的最快的DBSCAN在单独的节点上独立处理它们(基准测试!确保启用数据索引,并检查结果的正确性。报告了其中一个Spark版本)以获得不正确的结果)。最近有一个基准测试文件,观察到DBSCAN实现的运行时间相差1000倍。因此,另一个DBSCAN可以有所作为。
关于python - 在分布式系统中实现DBSCAN,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46332406/