spark 任务调优参数及问题整理

1.数据倾斜:

最简单的做法:在sql中使用随机数 distribute by rand()

在sql 末尾加 

select * from 
a left join b on a.xx=b.xx distribute by rand()

在进行的join中如果关联字段出现大量的null值的时候,也会出现数据倾斜,这种情况,最好过掉null值,再关联。

2.spark.dynamicAllocation.enabled=true 开启动态资源分配

3.提高并行度

 spark.sql.shuffle.partitions=1000  , 

调整stage的并行度,也就是每个stage的task个数,默认值为40。此参数一般设置为任务申请的总core数的2-4倍,如:申请100个executor,每个executor申请2个core,那么总core数为200,此参数设置的合理范围是400-800。注意,此参数不能调整某些读外部数据stage的并行度,如:读hdfs的stage,绝大多数情况它的并行度取决于需要读取的文件数

spark.default.parallelism=1000

和partitions效果一样,但是只对rdd有效,对sparksql 不起作用

2.合并小文件:

hive任务:

hive任务控制map和reduce的文件输出可以达到小文件合并

set hive.exec.compress.output=true;

set mapreduce.output.fileoutputformat.compress=true;

set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;

set mapreduce.input.fileinputformat.split.maxsize=1073741824;

set mapreduce.input.fileinputformat.split.minsize=1;

set mapreduce.input.fileinputformat.split.minsize.per.node=536870912;

set mapreduce.input.fileinputformat.split.minsize.per.rack=536870912;

set hive.merge.mapredfiles=true;

set hive.merge.mapfiles=true;

set hive.merge.smallfiles.avgsize=268435456;

spark任务:

以上参数在spark任务中是不生效的:

spark 任务可以使用:spark.sql.adaptive.enabled=true

3.sparksql 任务重刷hive分区表数据

使用sparksql重刷历史分区数据,很容易产生很多小文件,可以使用 /*+ REPARTITION(1) */ 控制输出的文件数。历史分区数据大小一般都是确定的,所以可以明确的控制分区文件数。

select /*+ REPARTITION(1) */ a,b,c
from t1

4.问题整理

1.Truncated the string representation of a plan since it was too large. This behavior can be adjusted by setting 'spark.debug.maxToStringFields' in SparkEnv.conf.

sql中表达式太长,导致错误,修改表达式或者按照错误提示添加参数配置

2.variable spark.sql.crossJoin.enabled=true;

Spark 2.x版本中默认不支持笛卡尔积操作,解决方案就是按照错误提示配置,开启笛卡尔积。

还有就是检查sql逻辑是不是存在问题,确认笛卡尔积是否应该出现

3.com.esotericsoftware.kryo.KryoException: Buffer overflow. Available: 0, required: xxxxxx

spark的worker上的每个excutor的每个core,都有一个kryo的buffer 缓冲区,这个缓冲区默认初始大小是64KB,根据任务需要会提高buffer大小,默认最大可以提高到64m

--conf spark.kryoserializer.buffer.max=512m

4.OneForOneBlockFetcher: Failed while starting block fetches

节点连接挂了,重试,如果设置的重试次数过多,或者重试间隔时间过长,可能这个过程会很漫长,导致整个任务运行超长。

大致的原因:

a.数据集超大,分配的内存不够,频繁的gc等

b.网络抖动,数据传输超时,心跳超时等

spark.shuffle.io.maxRetries:  #尝试次数
spark.shuffle.io.retryWait #这个表示两次retry之间的间隔。
spark.network.timeou #配置所有网络传输的延时

5. Can not create the managed table

使用 create table xxx as 建表失败

hive表元数据删除,但是hdfs文件没有删除。

一般出现的情况:

在任务写入时,杀死任务

网络临时终端

一般使用spark2.4以上会出现这个问题,2.4到3.0以下可以配置参数 spark.sql.legacy.allowCreatingManagedTableUsingNonemptyLocation=true控制

3.0以上,这个参数已经被删除,不能使用。

可以是使用 hdfs dfs -rm -r 删除hdfs文件或者换个表名 解决。....shit,(逼着我用spark2.3)

你可能感兴趣的:(大数据,spark)