对于如何理解spark调优中的高级通用调优,很多新手都不是很清楚。为了帮助大家解决这个问题,下面小编就详细讲解一下。需要的人可以从中学习,希望你能有所收获。
一,并行度
除非您将每个操作的并行度设置得足够高,否则集群不会得到充分利用。Spark会根据文件大小自动设置地图数量,是否可以分割(输入格式后面会详细说明,各种输入地图数量的确定会详细说明)。对于分布式reduce操作,如groupbykey和reducebykey,默认情况下,它使用分区数量最多的父RDD的分区数量来确定reduce的数量。您也可以通过设置spark.default.parallelism来更改默认值。建议的值是每个CPU执行2-3个任务。
二,Reduce任务的内存使用
有时候,内存溢出不是因为你的RDD不适合内存,而是因为你的一个任务的工作集太大了。例如,使用groupbykey时,缩减任务数据集太大。Spark的shuffle操作(按键排序、按键分组、按键减少、连接等)将构建一个哈希表,每个任务将执行一个分组的数据,这个数据通常非常大。最简单的改进方法是增加并行性,使每个任务的输入变小。Spark可以高效地支持短至200毫秒的任务,因为Executor的JVM被重用,可以降低启动成本,所以可以安全地增加并行度,超过你的集群核心数量。
三,广播变量
使用spark的广播功能可以大大减少每个序列化任务的大小以及在集群中执行作业的成本。如果您在任务中使用大型对象,例如静态表,请考虑将其声明为广播变量。在驱动程序节点,spark会打印出每个任务的序列化大小,这样你就可以通过查看任务的大小来判断你的任务是否过大。通常,如果任务的大小超过20KB,就值得调优。
四,数据本地性
数据的位置可能会对Spark作业产生重大影响。如果数据和对其进行操作的代码在一起,计算通常会很快。但是如果代码和数据分离,其中一个必须移动。通常,序列化的代码会移动到数据所在的位置,因为数据通常比代码大得多。Spark构建调度计划的原则是数据局部性。
局部性是数据离处理它的代码有多远。根据数据和代码的当前位置,数据局部性级别。从最近到最远的顺序如下:
1,PROCESS_LOCAL
并且数据和代码在同一个JVM中,这是最好的数据局部性。
2,NODE_LOCAL
数据和代码在同一个节点。例如,数据位于同一节点的HDFS或统一节点的执行器上。因为数据必须在多个进程之间移动,所以它比PROCESS_LOCAL稍慢。
3,NO_PREF
数据可以在没有数据局部性的情况下从任何地方快速访问。
4,RACK_LOCAL
数据和代码在同一个机架上。数据位于同一机架中的不同服务器上,因此需要通过网络发送,通常是通过单个交换机。
5,ANY
数据在网络的其他地方,而不是在同一个机架中。
Spark倾向于根据最高的数据局部性来安排任务,但这通常是不可能的。当任何空闲执行器上没有未处理的数据时,Spark将切换到较低的数据局部性。在这种情况下,有两种选择:
1)、等待CPU空闲,然后在同一台服务器上启动任务。
2)、在数据需要迁移的较远的地方立即开始新的任务。
Spark典型的处理策略是等待繁忙的CPU释放,时间很短。一旦超时发生,数据将被移动到空闲的中央处理器来执行任务。每个级别之间的回退等待超时可以单独配置,也可以全部在一个参数中配置。如果任务很长并且数据局部性很差,可以适当调整与Spark.locatity超时相关的配置。具体配置如下:
属性
系统默认值
意义
火花。地点。等等
3s
超时,放弃等待数据局部性较低的新任务。
spark . location . wait . node
火花。地点。等等
节点本地等待超时
spark . location . wait . process
火花。地点。等等
进程本地等待超时
spark . location .等等. rack
火花。地点。等等
机架本地等待超时
主要调音是序列化和内存调优.
阅读以上内容对你有帮助吗?如果您想了解更多相关知识或阅读更多相关文章,请关注行业资讯频道,感谢您的支持。
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/149257.html