随着硬件扩展,Spark执行速度变慢

时间:2016-03-13 21:00:22

标签: performance apache-spark

我正在尝试为Spark作业找到合适的硬件大小。我的理解是,扩大机器数量可能有助于加快我的工作,考虑到我的工作没有复杂的操作操作,因此可能在驱动程序中进行少量计算。但是,我观察到的是,在向Spark添加资源时,作业执行速度会降低。我可以使用以下简单的工作重现这种效果:

  • 从HDFS
  • 加载文本文件(~100Gb)
  • 在RDD上运行一个简单的“过滤器”转换,如下所示:

    JavaRDD<String> filteredRDD = rdd.filter(new Function<String, Boolean>() {
        public Boolean call(String s) {
            String filter = "FILTER_STRING";
            return s.indexOf(filter) > 0 ? true : false; 
       }
    
  • 对结果
  • 运行count()操作

当我将群集中的计算机数量从4扩展到8时,缩放问题就出现了。以下是有关环境的一些详细信息:

  • 每个执行程序配置为使用6 GB内存。此外,HDFS也在同一台机器上共同托管。
  • 每台机器总共有24 GB的RAM和12个内核(配置为使用8个用于Spark执行器)。
  • Spark托管在YARN群集中。

任何想法为什么我没有达到我对Spark所期望的scalabilty程度?

1 个答案:

答案 0 :(得分:5)

感谢很多评论,我想我发现我的群集出了什么问题。 HDFS'复制因素'至少是问题的一部分的想法是一个非常好的线索。

为了测试,我将HDFS的复制因子更改为群集节点的数量并重新运行测试,并获得了可扩展的结果。但我不相信这种行为背后的原因,因为Spark声称在为执行程序分配分区时考虑数据局部性,甚至使用默认复制级别(3),Spark应该有足够的空间来均匀分配分区。经过一些调查,我发现如果YARN(或任何其他集群管理器)决定与多个执行程序共享一台物理机并且不使用所有机器,情况可能并非如此。在这种情况下,可能存在任何执行器不是本地的HDFS块,这将导致跨网络的数据传输以及我观察到的缩放问题。