全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 数据分析与数据挖掘
887 0
2020-12-17
您如何优化Spark作业并获得效率-提示和技巧!
“数据是新的石油”,这已经不是什么秘密了,如今已成为陈词滥调。需要考虑的更重要的一点是,我们如何构建更高效的机器和平台,以处理这种以指数速度增长的海量数据。几年前,当数据科学和机器学习不是流行语时,人们曾经在电子表格上执行简单的数据操作和分析任务(不谴责电子表格,它们仍然有用!),但是随着人们变得对数据更加了解和计算机硬件为了提高效率,新平台取代了简单的平台,可用于琐碎的数据处理和模型构建任务。First R / Python取代Excel作为数据处理任务的标准平台,因为它们可以处理更大的数据集。
然后是大数据平台,例如Spark,它是用于在计算机群集上并行处理数据的统一计算引擎,它利用内存中的计算功能,在处理数十亿行和列的大数据时效率更高。
优化Spark作业的提示
您可以阅读星火梦幻般的文档中所有关于星火这里。
但是,本文旨在为您提供帮助,并提供快速的解决方案,您可以尝试在群集上Spark上的资源有限的情况下处理海量数据以优化Spark作业时可能遇到的一些瓶颈。尽管Spark有自己的内部催化剂来优化您的作业和查询,但有时由于资源有限,您可能会遇到与内存相关的问题,因此,最好了解一些可能对您有所帮助的良好做法。本文假定您具有使用Spark的先前经验。
本文不仅对数据科学家有好处,对数据工程师也有好处。
在本文中,您将重点关注如何通过以下方式优化火花作业:
—配置Spark应用程序的核心,执行程序和内存的数量。
-避免在Spark中使用长血统,列式文件格式,进行分区等良好做法。
让我们开始吧。
配置执行程序,内核和内存的数量:
Spark Application由一个驱动程序进程和一组执行程序进程组成。驱动程序进程运行main()函数,并且是Spark应用程序的核心。它负责跨执行程序执行驱动程序的命令,以完成给定的任务。它包含您的SparkContext,它是Spark应用程序的入口点。工作程序节点包含执行程序,这些执行程序负责实际执行驱动程序分配给他们的工作。集群管理器控制物理机,并将资源分配给Spark应用程序。群集上可以同时运行多个Spark应用程序。
优化Spark作业的提示
Spark应用程序的架构
在群集上配置Spark Job时需要注意三个主要方面–执行程序数,执行程序内存和内核数。执行程序是为节点上的spark应用程序启动的单个JVM进程,而核心是执行程序可以运行的CPU或并发任务的基本计算单元。一个节点可以具有多个执行程序和核心。所有计算都需要一定数量的内存才能完成这些任务。您可以通过在运行spark应用程序时使用–executor-cores,–num-executors,–executor-memory传递所需的值来控制这三个参数。
您可能会更多地考虑在给定时间可以执行更多并发任务的核心数量。虽然这种意识形态有效,但它有局限性。可以观察到,许多并发任务多于5个的spark应用程序不是最优的,并且性能很差。这个数字来自执行者的能力,而不是系统具有多少个内核。因此,即使您的计算机中有更多内核,数字5仍保持不变。因此,将其设置为5以获得良好的HDFS吞吐量(通过在提交Spark应用程序时将–executor-cores设置为5)是一个好主意。
使用集群管理器运行spark应用程序时,将有多个Hadoop守护程序在后台运行,例如名称节点,数据节点,作业跟踪程序和任务跟踪程序(它们都有一个特定的作业要执行,您应该阅读这些作业)。因此,在指定-num-executors时,您需要确保留出足够的核心(每个节点约1个核心),以使这些守护程序平稳运行。
另外,您必须至少留出1个执行程序,以便Application Manager可以与Resource Manager协商资源。您还必须分配一些执行程序内存,以补偿其他一些其他任务的开销内存。文献表明,将其分配给执行者内存的大约7-10%是一个不错的选择,但是不应太低。
例如,假设您正在一个10个节点的群集上,每个节点16个核心,每个节点64 GB RAM。
您可以为每个执行者分配5个核心,并为Hadoop守护程序为每个节点保留1个核心。因此,现在每个节点有15个内核。由于您有10个节点,因此可用内核总数为10×15 = 150。
现在,可用执行程序的数量=总核心数/每个执行程序的核心数= 150/5 = 30,但是您必须为Application Manager保留至少1个执行程序,因此执行程序的数量将为29。
由于您有10个节点,因此每个节点将有3(30/10)个执行程序。每个执行者的内存将是每个节点的内存/每个节点的执行者= 64/2 = 21GB。留下7%(?3 GB)的内存开销,每个执行者将有18(21-3)GB的内存。因此,最终您的参数将是:
–executor-cores 5,–num-executors 29, –executor-memory 18 GB。
这样,您可以计算出分配这些参数的数学公式。尽管确实注意到这只是分配这些参数的一种方法,但是您的工作可能会被调整为不同的值,但是这里要注意的重点是要有一种结构化的方法来考虑调整这些值而不是进行拍摄在黑暗中。
避免长血统
Spark提供两种类型的操作:动作和转换。
转换(例如,映射,过滤器,groupBy等)从上一个构建一个新的RDD / DataFrame,而动作(例如,head,show,write等)基于RDD / DataFrame计算结果,然后返回将其保存到驱动程序或将其保存到外部存储系统。Spark懒惰地执行所有这些操作。火花中的延迟评估意味着只有在触发操作后才会执行实际执行。在spark DataFrame或RDD上运行的每个转换命令都存储到谱系图中。
不建议在沿袭中链接很多转换,尤其是当您想用最少的资源处理大量数据时。而是通过将中间结果写入HDFS来打破沿袭(最好是在HDFS中,而不是在S3之类的外部存储中,因为在外部存储上写入可能会更慢)。
广播
当需要在Spark中的执行者之间共享变量时,可以将其声明为广播变量。请注意,广播变量本质上是只读的。广播变量在偏斜连接的情况下特别有用。例如,如果您试图连接两个表,其中一个很小,另一个很大,那么跨工作者节点的执行程序广播较小的表是有道理的,以避免网络开销。
优化Spark作业的提示
在Spark中广播
对数据集进行分区
尽管Spark为您的数据选择了合理的默认值,但是如果您的Spark作业内存不足或运行缓慢,则可能会出现错误的分区错误。
如果您的数据集很大,则可以尝试将分区重新分区(使用repartition方法)到更大的数目,以使您的工作具有更多的并行性。一个很好的说明是,如果在Spark UI中您没有很多任务,但是每个任务完成起来都很慢。另一方面,如果您没有那么多数据并且拥有大量分区,那么拥有太多分区的开销也会导致您的工作变慢。您可以使用合并方法而不是重新分区方法将分区重新分区为较小的数字,因为它更快,并且将尝试在同一台计算机上合并分区,而不是重新整理数据。
优化Spark作业的提示
资料分割
列式文件格式
Spark利用谓词下推的概念来优化您的执行计划。例如,如果您构建了一个大型Spark作业,但在最后指定了一个筛选器,该筛选器仅需要我们从源数据中获取一行,则执行此操作的最有效方法是访问所需的单个记录。实际上,Spark会通过自动向下推过滤器为您优化此过程。
列文件格式存储跨行和列分区的数据。这样可以更快地访问数据。它们在有效使用谓词下推功能方面更加兼容,并且旨在与MapReduce框架一起使用。列式文件格式的一些示例包括Parquet,ORC或Optimized Row-Column等。尽可能使用Parquet格式将文件读写到HDFS或S3中,因为它在Spark中表现良好。
使用DataFrames / Datasets代替RDDs:
弹性分布式数据集或RDD是Spark中的基本抽象。RDD是一种容错方式,用于存储非结构化数据并以分布式方式在Spark中对其进行处理。在旧版本的Spark中,必须将数据存储为RDD,然后进行操作,但是,新版本的Spark使用DataFrame API,其中数据存储为DataFrames或Dataset。DataFrame是组织为命名列的分布式数据集合,非常类似于R / Python中的DataFrames。数据框比RDD快得多,因为它具有与之关联的元数据(有关数据的某些信息),这使Spark可以优化其查询计划。由于内部优化,Spark的创建者鼓励使用DataFrames,因此应尝试使用DataFrames代替RDD。
题库
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群