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

asa*_*aad 10 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; 
       }
    
    Run Code Online (Sandbox Code Playgroud)
  • 对结果运行count()动作

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

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

任何想法为什么我没有得到我期望从Spark的scalabilty程度?

asa*_*aad 5

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

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