Amazon web services 独立群集+;码头工人
我在AWS c4.8X大型机器(一台或多台)上的Docker容器中运行Spark slave,与我的笔记本电脑(使用四核Intel i7-6820HQ)相比,我很难获得预期的性能。(参见下面的编辑,同样的硬件也有巨大的开销) 我正在寻找使用“多处理器”进行横向分析模型培训的解决方案,该“多处理器”可以在单线程、多进程或分布式Spark场景中工作:Amazon web services 独立群集+;码头工人,amazon-web-services,apache-spark,pyspark,Amazon Web Services,Apache Spark,Pyspark,我在AWS c4.8X大型机器(一台或多台)上的Docker容器中运行Spark slave,与我的笔记本电脑(使用四核Intel i7-6820HQ)相比,我很难获得预期的性能。(参见下面的编辑,同样的硬件也有巨大的开销) 我正在寻找使用“多处理器”进行横向分析模型培训的解决方案,该“多处理器”可以在单线程、多进程或分布式Spark场景中工作: class Multiprocessor: # ... def map(self, func, args): if
class Multiprocessor:
# ...
def map(self, func, args):
if has_pyspark:
n_partitions = min(len(args), 1000)
return _spark_context.parallelize(args, n_partitions).map(func).collect()
elif self.max_n_parallel > 1:
with multiprocessing.Pool(self.max_n_parallel) as pool:
return list(pool.map(func, args))
else:
return list(map(func, args))
正如您所见,Spark的作用是分发计算并简单地检索结果,parallelize().map()
是唯一使用的APIargs
只是一个整数id元组列表,没有什么太重的内容
我正在使用Docker1.12.1(--nethost
)、Spark2.0.0(独立集群)、Hadoop2.7、Python3.5和openjdk-7。结果对于相同的培训数据集,每次运行都受CPU限制:
- 5.4分钟,本地多处理(4个处理)
- 使用四个c4.8X大型从机(每台使用10芯)5.9分钟
- 局部火花放电6.9分钟(主
)局部[4]
- 7.7分钟,三个c4.8X大型从机(每台使用10芯)
- 使用单个c4.8X大型从机(10芯)25分钟(!)
- 使用本地VM Spark slave(4芯)27分钟(!)
args
值需要映射,它们的处理需要15-45秒(第25和第75个百分位)。CG时间不显著。甚至尝试返回“空”结果以避免网络开销,但这并不影响总时间。通过VPN Ping到AWS的时间为50-60毫秒
任何关于我应该研究哪些其他指标的提示,都会让我觉得我在某处浪费了大量的CPU周期。我真的很想围绕Spark构建架构,但基于这些POC,至少AWS上的机器太贵了。我得用我能使用的其他本地硬件做测试
编辑1:在笔记本电脑上的Linux虚拟机上测试,使用独立群集时需要27分钟,比使用local[4]
多20分钟
编辑2:每个从“核心”似乎有7个pyspark守护进程,所有这些都占用了大量CPU资源。这是预期的行为吗?(来自笔记本电脑虚拟机的图片)
编辑3:实际上,即使只启动一个单核的从机,也会发生这种情况,我的CPU利用率为100%。根据红色表示内核级线程,Docker可以在这里扮演角色吗?无论如何,我不记得在用Python2.7制作原型时看到过这个问题,我得到的性能开销非常小。现在更新到JavaOpenJDK8,没有什么区别。Spark 1.5.0和Hadoop 2.6也得到了相同的结果
编辑4:我可以追踪到默认情况下,scipy.linalg.cho_factor
使用所有可用的内核,这就是为什么我发现即使Spark slave只有一个内核,CPU使用率也很高的原因。必须进一步调查
最终编辑:问题似乎与AWS或Spark无关,我在Docker容器中的独立Python上的性能很差。请参阅我的。也有同样的问题-对我来说,根本原因是内存分配。 确保为spark实例分配足够的内存。 在start-slave.sh-run中——帮助获取内存选项(默认值为每个节点1GB,与机器中的实际内存无关) 您可以在UI(主机上的端口8080)中查看每个节点分配的内存 提交应用程序时,您还需要设置每个执行器的内存,即spark submit(默认值也是1GB),如before-run with-help以获取内存选项 希望这能有所帮助。很抱歉给您带来了困惑(我是OP),我花了一段时间才深入了解到底发生了什么。我做了很多基准测试,最后我意识到在Docker映像上我使用的是OpenBLAS,默认情况下它是多线程linalg函数。我的代码在大小从
80 x 80
到140 x 140
的矩阵上运行了数百次。启动所有这些线程只会带来大量开销,我在通过多处理器或Spark进行并行计算时,首先不需要这些开销
# N_CORES=4 python linalg_test.py
72.983 seconds
# OPENBLAS_NUM_THREADS=1 N_CORES=4 python linalg_test.py
9.075 seconds