背景:偏好种类过多,每次创建、完善画像hql工作量巨大。为了解决此问题,将hql配置化生成,并且使用spark运行。
由于不同的偏好量不同,脚本动态分配资源,直接上代码!
脚本:sh /....../prefer_res_normal.sh 参数1 参数2 21840 (21840约等于偏好M数,必须为840的倍数)
#!/bin/bash
partitions=`expr ${3} / 140`
numexe=`expr ${3} / 840`
--master yarn \
--driver-memory 4G \
--driver-cores 1 \
--num-executors ${numexe} \
--executor-memory 12G \
--executor-cores 2 \
--conf spark.default.parallelism=${partitions} \
--conf spark.sql.shuffle.partitions=${partitions} \
--conf spark.storage.memoryFraction=0.5 \
--conf spark.shuffle.memoryFraction=0.3 \
--conf spark.shuffle.io.maxRetries=30 \
--conf spark.shuffle.io.retryWait=30s \
--conf spark.network.timeout=300 \
--conf spark.reducer.maxSizeInFlight=96m \
--conf spark.shuffle.sort.bypassMergeThreshold=1000 \
--conf spark.executor.logs.rolling.maxRetainedFiles=5 \
改了三个hive参数
hive.metastore.connect.retries=6
hive.metastore.failure.retries=3
hive.metastore.client.connect.retry.delay=30s
参数所解决的问题
一、任务资源配置(资源相关参数)
- driver-memory:driver负责申请资源、调度和执行代码,一般情况不用设置很大。
-
num-executors:设置作业共要用多少个Executor进程来执行。
-
executor-memory:每个Executor进程的内存。Executor内存的大小,很多时候直接决定了spark作业的性能,而且和JVM OOM异常有直接的关联。根据作业情况和实际情况来定,num-execotors*executor-memory就是这个作业占用的资源量。
-
executor-cores:设置每个Executor进程的CPU core数量,决定了进程并行执行task线程的能力。num-executors*executor-cores是并行的个数,一般并行个数为1/3~1/2合适。
-
spark.sql.shuffle.partitions:设置shuffle分区数(并行度),默认为200,数据量太大的时候,可根据实际情况调大,避免shuffle过程报错。
-
spark.default.parallelism(只对HashPartitioner有效):设置每个stage的task数量。不设置可能会影响spark作业性能。一般为CPU core数量的2~3倍合适。
二、executor的内存分配占比(资源相关参数)
executor的内存分为三部分,第一块是让task执行编写的代码,默认20%,第二块是shuffle,默认20%,第三块是RDD持久化,默认60%。
- spark.storage.memoryFraction:默认0.6,如果spark作业中有较多的持久化操作,可以适当提高。
-
spark.shuffle.memoryFraction:默认0.2,如果spark作业中持久化较少,shuffle操作过多时,建议降低持久化操作的占比,提高shuffle操作的内存占比比例,避免shuffle过程中数据过多时内存不够用,必须溢写到磁盘上,降低了性能。
三、spark ShuffleManager(shuffle过程相关参数)
spark 1.2以前是HashShuffleManager,1.2之后是SortShuffleManager。
HashShuffleManager存在一个弊端就是会产生大量的磁盘文件,进而影响了IO性能。不过会有一个参数可以开启HashShuffleManager的优化,spark.shuffle.consolidateFiles=true,默认值是false。优化前后的文件数量会有一定程度的减少。
假设当前有10个executor,每个executor5个task,下游100个task
优化前的磁盘文件个数:5*10*100
优化后的磁盘文件个数:1*10*100
即使是优化后,磁盘文件个数也会有很多,因此建议使用SortShuffleManager。
SortShuffleManager有两种运行机制 :1、普通机制,2、bypass运行机制。shuffle read task的数量小于 等于spark.shuffle.sort.bypassMergeThreshold默认值200值,会启用bypass机制,建议调大,原因如下:
- 普通机制:数据先写入内存数据结构,根据不同的shuffle算子,选用不同的数据结构。聚合是map,一遍聚合一边写入,join是array,直接写入内存。SortShuffleManager有一个磁盘文件merge的过程,当前有多少个task,就有多少个磁盘文件。
- bypass:1、磁盘写机制不同,2、不进行排序(重点)。
集群使用的版本大于1.2,所以可以忽略文件数量太多的问题。
四、spark shuffle连接超时(shuffle过程相关参数)
-
spark.shuffle.io.maxRetries:默认值3,shuffle过程拉取数据时,因为网络异常导致拉取失败,会自动进行重试。该参数是重试的最大次数,如果在指定次数内还没成功,就导致作业执行失败。对于那些包含了特别耗时的shuffle操作的作业,建议增大次数,避免由于JVM的full gc或者网络不稳定因素导致的拉取数据失败。提高稳定性必调参数。
-
spark.shuffle.io.retryWait:默认值5s,具体解释如上,代表了每次重试拉取数据的等待间隔,默认5s。
-
spark.network.timeout:默认值120(120s),配置所有网络的传输延时
五、网络IO次数(shuffle过程相关参数)
-
spark.shuffle.file.buffer:默认值32k,将数据写到磁盘文件之前,会先写入buffer缓冲中,待缓冲写满之后,才会写到磁盘。资源充足 的情况下可以适当调大该参数,从而减少IO次数,进而提升性能。
-
spark.reducer.maxSizeInFlight:默认48m,shuffle read task的buffer缓冲大小,这个buffer决定了每次能够拉取多少数据。资源充足可适当调大,提高性能。
六、连接hive元数据超时(hive-site.xml)
- hive.metastore.connect.retries=6 ,连接hive元数据重试次数。(默认值在hive-site.xml可见)
- hive.metastore.failure.retries=3,连接hive元数据失败重试次数。
- hive.metastore.client.connect.retry.delay=30s,重新连接元数据的等待间隔。
本文主要探讨了如何针对不同需求配置Spark参数,包括任务资源配置、executor内存分配、shuffle管理及超时设置,以优化性能和避免错误。通过合理设置driver-memory、num-executors、executor-memory等参数,以及调整shuffle相关参数,可以有效地提升Spark作业的效率和稳定性。
8333

被折叠的 条评论
为什么被折叠?



