我正在尝试为Spark作业找到合适的硬件大小。我的理解是,扩大机器数量可能有助于加快我的工作,考虑到我的工作没有复杂的操作操作,因此可能在驱动程序中进行少量计算。但是,我观察到的是,在向Spark添加资源时,作业执行速度会降低。我可以使用以下简单的工作重现这种效果:
在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;
}
当我将群集中的计算机数量从4扩展到8时,缩放问题就出现了。以下是有关环境的一些详细信息:
任何想法为什么我没有达到我对Spark所期望的scalabilty程度?
答案 0 :(得分:5)
感谢很多评论,我想我发现我的群集出了什么问题。 HDFS'复制因素'至少是问题的一部分的想法是一个非常好的线索。
为了测试,我将HDFS的复制因子更改为群集节点的数量并重新运行测试,并获得了可扩展的结果。但我不相信这种行为背后的原因,因为Spark声称在为执行程序分配分区时考虑数据局部性,甚至使用默认复制级别(3),Spark应该有足够的空间来均匀分配分区。经过一些调查,我发现如果YARN(或任何其他集群管理器)决定与多个执行程序共享一台物理机并且不使用所有机器,情况可能并非如此。在这种情况下,可能存在任何执行器不是本地的HDFS块,这将导致跨网络的数据传输以及我观察到的缩放问题。