最简单的做法:在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 不起作用
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
使用sparksql重刷历史分区数据,很容易产生很多小文件,可以使用 /*+ REPARTITION(1) */ 控制输出的文件数。历史分区数据大小一般都是确定的,所以可以明确的控制分区文件数。
select /*+ REPARTITION(1) */ a,b,c
from t1
sql中表达式太长,导致错误,修改表达式或者按照错误提示添加参数配置
Spark 2.x版本中默认不支持笛卡尔积操作,解决方案就是按照错误提示配置,开启笛卡尔积。
还有就是检查sql逻辑是不是存在问题,确认笛卡尔积是否应该出现
spark的worker上的每个excutor的每个core,都有一个kryo的buffer 缓冲区,这个缓冲区默认初始大小是64KB,根据任务需要会提高buffer大小,默认最大可以提高到64m
--conf spark.kryoserializer.buffer.max=512m
节点连接挂了,重试,如果设置的重试次数过多,或者重试间隔时间过长,可能这个过程会很漫长,导致整个任务运行超长。
大致的原因:
a.数据集超大,分配的内存不够,频繁的gc等
b.网络抖动,数据传输超时,心跳超时等
spark.shuffle.io.maxRetries: #尝试次数
spark.shuffle.io.retryWait #这个表示两次retry之间的间隔。
spark.network.timeou #配置所有网络传输的延时
使用 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)