在分布式系统中实现DBSCAN

时间:2017-09-20 21:59:55

标签: python scala apache-spark pyspark dbscan

我遇到大数据问题,而且我对并行处理和大数据的经验非常有限。我有数百万行,包括纬度和经度数据以及几个ID。对于每个ID,我可以拥有10000到10000万的数据。

我正在实施基于密度的聚类算法(DBSCAN)来解决一些业务需求。聚类算法针对每个ID独立运行。

当前实施;

当前的实现基于使用sklearn机器学习库的Python代码,但是对于appx 5000万数据点,需要一天或更长时间才能执行(集群+其他业务逻辑)。

我可以优化python代码并减少时间,但我正在寻找更可行的解决方案。

状况

我有一个分布在appx 20机器上的火花簇,但是pyspark没有实现DBSCAN。经过一些搜索,我可以找到一些scala imlementation但它们似乎不太可靠。我搜索的网址是。 https://github.com/irvingc/dbscan-on-spark

DBSCAN on spark : which implementation

由于我的所有代码都是用python编写的,我想坚持使用更加pythonic的解决方案。

就像我提到的那样,聚类算法针对每个设备独立运行,减少时间的一种方法是将每个ID的计算并行地分配给所有20台机器。这样我至少可以获得20倍的性能提升。但我不知道如何实现这一目标。我能想到的只是MapReduce。

我对任何更强大的溶剂持开放态度。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

由于序列化,pySpark的开销不可忽略。如果您想要非常快,请使用尽可能少的层来减少开销。

我只是将数据拆分为所需的分区,然后使用您可以找到的最快的DBSCAN在不同的节点上独立处理它们(基准测试!确保启用数据索引,并检查结果的正确性。其中一个Spark据报道版本的结果不正确)。最近有一篇基准测试论文观察到DBSCAN实现的1000x运行时差异。所以另一个DBSCAN可以有所作为。

答案 1 :(得分:0)

您可以在pyspark和scikit-learn上尝试此示例https://github.com/bwoneill/pypardis。我在当地尝试过。 75,000点的计算耗时近1.5小时。但也许在claster中它会更快。