调优参数来实现所需的性能,同时优化使用可用的资源。
本报告重点介绍如何调优火花的应用程序运行在一个集群实例。我们定义集群/火花参数的概念,并解释如何配置它们给定一组特定的资源。我们使用k - means机器学习算法为例,分析和调优参数来实现所需的性能,同时优化使用可用的资源。
写这份报告的时候,Graviton3只提供compute-optimized实例(C7g)。所以我们用Graviton2基于集群因为更多的实例类型(M6g、R6g C6g)使用基于需求。写这份报告后2月13日,AWS做了介绍通用M7g和memory-optimized R7g基于Graviton3 EC2实例。
这份报告是一个深入的指导。如果你喜欢较短的总结火花AWS Graviton2性能,请参阅我们之前的博客。
我们假定读者已经基本熟悉火花的概念和组件。读者需要一些经验与火花编码和资源使用情况的理解和执行分析通过引发Web UI。
本文使用的是HiBench套件对引发性能分析。HiBench是专为大数据分析的Hadoop,火花,和流数据引擎。它可以运行不同的工作负载模式包括微基准测试等,字数,eDFSIO。它也可以运行SQL标准如扫描,加入,和聚合。最后,它可以运行机器学习标准k - means聚类,梯度增加卷发和许多更多。基准测试可以运行在不同的数据大小从微小到大数据。
HiBench工作负载运行在两个阶段:
我们设置集群在AWS在以下方式:
不同的工作负载可能需要不同的调优基于计算的性质。例如,可以计算密集型或内存密集型数据分析问题。例如,机器学习中k - means聚类算法是计算密集型算法,虽然字数是密集的内存更大的内存。对于这个报告,我们探索调优参数k - means聚类在一个有效的方式运行在AWS实例。
我们将火花优化分为两个独立的类:
调优在集群/工作负载级别涉及选择运行时参数火花计算给定一个具体的实例数量固定资源(CPU内核和内存)。例如,在HiBench以下参数可以设置为运行工作负载:
假设有W工人集群节点上运行。每个工人节点有M C g的内存和CPU(个vCPU)核。下面的解释如何计算前面的参数。
有多种方法考虑执行器的数量:
原则上,这两种方法在相似的方式工作时总资源和并行性(并行任务的数量)设置相同。然而,有一些实际的差异,使得使用更多的执行人更合适:
使用更多的执行人的缺点是,广播数据和缓存复制每一个执行者。因此,如果有E节点执行人,广播数据缓存复制E乘以相同的节点上。
减少负面影响的数据执行人之间的洗牌,尝试运行执行人在一些大尺寸的情况下,而不是许多小尺寸的实例。
以下是建议如何计算不同的纱/火花参数:
计算其余会直接:
这种方法的缺点是,用户必须意识到反序列化后的输入数据的大小。此外,在每一个洗牌阶段数据大小是不同的。所以,一种方法是提高分区的数量,直到性能开始下降。
当阅读从桶HDFS文件,初始分区数量(任务)取决于HDFS分区的大小(默认128 mb)。所以,分区总数将总数据大小除以默认的分区大小。调整分区大小生效期间第一个数据洗牌时移动到下一个阶段。
从纱线的参数。nodemanager参考节点的设置,而那些从纱线开始。调度程序是针对单一容器(执行者)节点上运行。
图1显示了方法参数定义集群的内存分配。
图1:火花内存分配参数对纱线集群。
在spark-defaults火花参数可以设置。conf文件引发的文件夹。HiBench,火花参数设置在conf /火花。conf HiBench文件夹中。配置参数如下:
类似的参数为执行人存在驱动程序(应用程序请求者)。
在core-site.xml Yarn-specific参数定义:
火花可以调整取决于正在运行的应用程序。由开发人员优化内存,垃圾收集,和序列化代码的基础上,数据结构等参数。看到调优的火花文档的更多细节。
监控资源用于火花集群上运行计算非常重要,因为它有助于发现如果:
分析是可能引发性能和指标使用Web UI。进行深入的分析,在一个或多个运行期间的所有数据可以收集和使用火花的历史服务器。
等方法来收集指标直接从机器内存/磁盘/ CPU运行时(特别是伪分布集群在单个机器上)包括使用工具如系统活动报告(SAR)。
火花的机器学习库MLlib。它实现了ML算法,数据转换,以分布式方式和管道。MLlib允许用户保存训练模型和负荷预测阶段。新图书馆(也称为火花ML)是基于火花Dataframe API和应用优化的数据管道。本文演示了k - means聚类基准作为引发的案例研究资源配置和调优分析。
k - means是一种无监督聚类算法。鉴于K集群的数量,该算法首先分配K(半)会点(重心)。和迭代改进它们的值,直到没有进一步细化是可能的,或达到最大迭代次数。
火花的k - means实现迭代在分区独立运行,收集每个迭代的结果回到重心细化的司机。所有的迭代都在相同的输入数据集;所以,它将数据缓存到内存速度计算的每一个执行者。
我们的基准m6gd上运行。16个超大EC2实例,这个实例中有64个vcpu和256 gb的内存。考虑5芯/执行人(调度器最大CPU分配),执行人的数量设置为12,60个vcpu消费。对于k - means,我们只给1个vCPU司机(默认)但是设置驱动程序内存一样的执行人。每个执行人设置为16 gb的内存(指标的分析表明,该值可以增加)。纱的调度器和节点管理器参数设置。例如,调度器的最大分配18022 mb的内存定义(1.1 * 16 gb),和节点管理器资源设置为218264 mb(12执行人+维护)。
HiBench k - means基准默认值是:
我们运行的k - means算法对Hibench三个大小不同的工作负载:
k - means算法是计算密集型的。下面是k - means算法运行的CPU使用量大,巨大,HiBench和庞大的数据大小:
图2:CPU使用量大,巨大的,巨大的工作量。
所有执行者的总CPU使用率是93%基于核的数量分配每个执行者(60/64)。因此,显然,巨大的工作负载使用大部分的处理能力。
图3显示了所有的三个工作负载的内存使用情况。
图3:内存使用量大,巨大的,巨大的工作量。
所有工作负载的内存使用低于设定的最大数量的配置。这两个图表(CPU和内存使用)表明,一个调优的可能性是使用compute-optimized实例运行计算。这些实例更便宜比通用(M)和memory-optimized (R)的实例相同的大小。
同样重要的是要注意,总的数据大小的巨大工作量仅为37.1 gb。即使考虑到在质心计算内存使用,使用近200 gb的内存为k - means看起来过度。的原因是内存缓存,HiBench k - means基准执行,它可以改变我们优化集群运行代码。
在前面部分,最佳实践建议分配5芯/执行器,计算的执行人使用和分配的内存数量每个执行者基于实例的可用内存。然而,如果火花程序使用内存缓存,所有缓存复制所有的执行人。所以,如果你运行E执行人在同一实例,您的缓存使用E倍内存相比,运行一个执行者。
下面的图对比巨大工作量内存使用情况:
和所有的执行人运行在相同的实例(伪分布配置)。
图4:内存使用量比较巨大的工作量对于12和6执行人在同一台机器上运行。
第二个配置显然将消耗更少的内存由于小数量的缓存复制。所以,当缓存大量数据,减少执行人与大尺寸的数量可以帮助减少内存使用量。分析表明,除了初始阶段进行数据预处理,处理时间的k - means阶段不不同。
k - means的实现只需要洗牌少量的数据(这是一项昂贵的操作在分布式计算)。分离不同阶段通过收集centroid-based计算在每个分区为最终司机质心计算,一个很小的数据大小。因此,分配工作负载的集群实例不会产生相当大的影响性能。
调优火花计算是特定于应用程序的,取决于不同的参数,如数据存储、缓存和洗牌。在缓存和存储情况下,可以使用磁盘存储当内存可能成为一个瓶颈(这可能大大降低AWS上的性能因为SSD读/写吞吐量是扼杀了)。
等应用k - means CPU密集且不涉及洗牌,大部分的调优内存管理。使用较少的执行人更大的大小、缓存磁盘和内存可用性的基础上,并使用compute-optimized实例的选择要考虑性能和成本优化。
[1]调优火花,https://spark.apache.org/docs/latest/tuning.html
[2]HiBench套房,https://github.com/Intel-bigdata/HiBench
[3]Hadoop:设置一个节点的集群,https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-common/SingleCluster.html
留下一个回复