背景:我在建设DW层的时候,创建了一个hudi宽表,此hudi宽表的数据来源于STL层的两个全量表的关联(1.手术及操作记录表,2.住院开单医嘱明细表),手术及操作记录表的数据量在460万条数据,住院开单医嘱明细表的数据量在6亿条数据。
这两个表在以医疗机构代码和就诊流水号join关联的时候会导致笛卡尔积,所以我得探查一下数据发散的问题,发现关联后的总数据量在3亿条数据,关联上的住院开单医嘱明细表的数据在1亿条,数据并不很发散。
但是如果将此批数据只写一个spark脚本,一次性导入到hudi表中有可能会导致数据倾斜的问题,所以我们采取按分片导入的方法,首先去探查每个医疗机构对应的数据量大小,导入数据的时候用where条件过滤,将数据量大的医疗机构单独导入,将数据量小的医疗机构一起导入,编写多个脚本,创建一个dolphinschedule工作流,编写多个spark脚本,分批实现Hudi表的数据初始化,以防止数据倾斜的产生。
每个Spark脚本任务的配置如下:
deployed-mode:client
driver-cores:2
driver-memory:6G
executor-number:60
executor-memory:6G
executor-cores:2
将编写好的4个spark脚本,导入到新建的dolphinschduler工作流中,在凌晨3点(这个时候集群的资源比较充足)定时调度初始化脚本,第一个spark脚本的数据量在一亿条左右,第二个spark脚本也是一亿一千万左右,第四个脚本是七百万左右数据量,第三个spark脚本本来是八千万左右数据量,但是由于我复制脚本的时候错了,把第二个脚本又复制了一遍到第三个spark脚本上,所以导致第三个脚本的数据量还是一亿一千万,运行到第三个脚本报错,错误日志如下。
错误日志:
Caused by:org.apache.spark.SparkException:
Job abort due to stage failure:ShuffleMapSatge 27(flatMapToPair at SparkHoodieBloomIndexHelper.java:109) has failed the maximum allowable number of times:4.
Most recent failure reason:org.apache.spark.shuffle.FetchFailedException:The relative remote executor(Id:78),which maintains the block data to fetch is dead.
大概意思是:保持获取block块数据的相对较远的executor死掉了
错误日志,如下图:原因:
资源不足导致executor没有心跳,driver就判定其丢失,就去连其他的executor,但其他的因为配置都一样,所以也连不上。重试n次后,就会报错。
解决:
找一个集群资源相对空闲的时间,去运行第三个和第四个Spark脚本。
参考文章:
https://blog.csdn.net/qq_34224565/article/details/126280337