2017-04-12 21 views
0

我目前正在使用线性回归(Spark ML)中的基准评估小型集群上的Spark 2.1.0(3个节点有32个CPU和128 GB Ram)。我只测量了参数计算的时间(不包括开始,数据加载,...)并确认了以下行为。对于小型数据集0.1 Mio - 3 Mio数据点,测量时间并不真正增加,并停留在大约40秒。只有像300 Mio数据点那样的较大数据集,处理时间才会增加到200秒。所以看起来,集群根本没有扩展到小数据集。Spark集群不能缩放到小数据

我还将本地pc上的小数据集与仅使用10个工作站和16GB RAM的集群进行了比较。集群的处理时间增加了3倍。那么这被认为是SPARK的正常行为,并且可以通过通信开销来解释,或者我做错了什么(或者线性回归不是真正具有代表性)?

集群是一个独立的集群(没有Yarn或Mesos)以及90个工作人员提交的基准测试,每个工作人员都有1个内核和4 GB内存。

Spark提交内容: ./spark-submit --master spark:// server:7077 --class Benchmark - 部署模式客户端--total-executor-cores 90 --executor -memory 4g - num-executors 90 .../Benchmark.jar pathToData

+0

我不确定你是否对小0.1-0的表现不满意。3M数据集,还是更大的300M数据集? – ImDarrenG

+0

嗨,我不是不满意的表现。我只是想知道,即使数据已经加载并且相当小,群集花费半分钟计算是正常的。 –

+0

我会说你的观察是合理的。一旦我睡了一觉,我会提供一个更详细的答案 - 如果在此期间没有其他人做了。 – ImDarrenG

回答

0

最佳群集大小和配置根据数据和作业的性质而有所不同。在这种情况下,我认为你的直觉是正确的,因为考虑到集群的大小(核心和执行者),额外的开销会导致在较小的数据集上完成工作的时间过长。

请注意,将数据量增加两个数量级会使处理时间增加5倍。您正在将数据增加到集群设置的最佳大小。

Spark是处理大量数据的好工具,但如果数据适合,它将不会在单台机器上运行单个进程时具有竞争力。但是,它可能比其他基于磁盘的分布式处理工具快得多,其中数据不适用于单台计算机。

我在几年前的一次谈话中发言时给出了一个比喻,Spark就像是一辆自行车赛车: - 如果负载轻,加速和灵活性更快,重型火车头可能需要一段时间才能赶上,但最终会更快。 (恐怕我忘了发言人的名字,但是在伦敦的卡桑德拉聚会上,发言人来自能源部门的一个公司)。

0

我同意@ ImDarrenG的评估,一般也是机车/自行车比喻。

有了这样的数据量小,我会强烈建议

A)缓存整个数据集和

B)广播数据集中到每一个节点(特别是如果你需要做一些喜欢你的300M行表加入到小数据集中)

要考虑的另一件事是文件数量(如果您还没有被缓存),因为如果您正在阅读单个不可分离的文件,则只有一个核心能够读取该文件。但是,一旦缓存数据集(合适或合并重新分区),性能将不会升高onger被磁盘绑定/序列化行。

+0

我不确定广播是什么意思,但是缓存数据集提高了性能。 3M数据集现在在0.5秒内处理完毕。我也玩过重新分区,并获得了50ms的改进。所以谢谢你的建议。 –

+0

@AndreasBartschat广播意味着整个数据集被“广播”给集群中的所有执行者。这将整个数据集放在每个执行器的内存中,而不是仅仅选择每个执行器上的分区。函数:'''ds.join(spark.sql.functions.broadcast(dataset),“join_column”)'''=>相关SOs:http://stackoverflow.com/questions/37487318/spark-sql-broadcast-散列连接| http://stackoverflow.com/questions/40320441/difference-between-sc-broadcast-and-broadcast-function-in-spark-sql | http://stackoverflow.com/questions/32435263/dataframe-join-optimization-broadcast-hash-join – Garren