Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services 独立群集+;码头工人_Amazon Web Services_Apache Spark_Pyspark - Fatal编程技术网

Amazon web services 独立群集+;码头工人

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

我在AWS c4.8X大型机器(一台或多台)上的Docker容器中运行Spark slave,与我的笔记本电脑(使用四核Intel i7-6820HQ)相比,我很难获得预期的性能。(参见下面的编辑,同样的硬件也有巨大的开销)

我正在寻找使用“多处理器”进行横向分析模型培训的解决方案,该“多处理器”可以在单线程、多进程或分布式Spark场景中工作:

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()
是唯一使用的API
args
只是一个整数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分钟(!)
所有36个虚拟CPU似乎都在使用中,平均负载为250-350。大约有360个
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