我遇到大数据问题,而且我对并行处理和大数据的经验非常有限。我有数百万行,包括纬度和经度数据以及几个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。
我对任何更强大的溶剂持开放态度。任何帮助将不胜感激。
答案 0 :(得分:1)
由于序列化,pySpark的开销不可忽略。如果您想要非常快,请使用尽可能少的层来减少开销。
我只是将数据拆分为所需的分区,然后使用您可以找到的最快的DBSCAN在不同的节点上独立处理它们(基准测试!确保启用数据索引,并检查结果的正确性。其中一个Spark据报道版本的结果不正确)。最近有一篇基准测试论文观察到DBSCAN实现的1000x运行时差异。所以另一个DBSCAN可以有所作为。
答案 1 :(得分:0)
您可以在pyspark和scikit-learn上尝试此示例https://github.com/bwoneill/pypardis。我在当地尝试过。 75,000点的计算耗时近1.5小时。但也许在claster中它会更快。