Spark Web UI及任务优化实战-Spark Web Ui 实际应用

问题定位流程

常见案例

案例一:执行失败OOM

  • 现象:任务执行失败
  • UI排查:点击失败的job

  • 点击job id 查看失败的stage

  • 点击失败的stage查看失败原因

  • 报错
 ExecutorLostFailure (executor 1497 exited caused by one of the running tasks) 
 Reason: (Exit reason: JVM exception - Java heap space OOM, 
 Suggestion: Increase spark.executor.memory)
  • 解决办法:
  •     查看当前运行的参数:

1.参数优化-加参数、加分区数等等
set spark.executor.memory = 25 g;
2.代码优化:减少输入数据量,是否有大字段。

案例二:执行失败-数据文件损坏

  • 现象:任务执行失败
  • UI排查:

  • 报错:
One possible cause: Parquet column cannot be converted in the corresponding files.
Another possible cause: File is corrupted or there are corrupt replicas in hdfs.
The potential damaged file is hdfs: hdfs//xxxx
The rootCause of exception is NegativeArraySizeException: -1951179625.

  • 解决办法:
Parquet文件读取失败。根因:数据中数组字段长度超限导致读取失败,数组size太大
   a): 如果允许数据少量丢失(跳过超限的数据),添加参数:
    set spark.sql.files.ignoreCorruptFiles=true; --跳过文件的开关
    set spark.sql.files.ignoreCorruptFiles.maxAllowedCorruptSizePercentage=0.01; --容忍度(最大 1)
    set spark.blacklist.enabled=true; --黑名单开关(预防坏节点)
    set spark.hadoop.hdfs.client.read.retry.count=20; --hdfs客户端读文件重试次数
 b): 只能通过自行优化逻辑的手段,过滤掉数组超限的数据
    排查sql字段的 json array字段,必要保留。可按需保留

案例三:执行时间长-资源不足-未申请到资源

  • 现象:平时20min执行的任务,突然执行了1个多小时
  • UI排查:点击duration倒排,找到时长最长的job => job id 0

  • 点击job id 0 查看stage详情

发现整个job id0 只有一个stage,执行时间并不长

  • 点击 stage 0 详情,查看task最早启动时间

   Stage0 在 07:02提交,但是第一个task在08:08启动,未申请到资源

  • 点击AM日志,查看任务启动
-- 开始启动
24/11/20 07:00:52.686 main INFO ApplicationMaster: Started progress reporter thread with (heartbeat : 7500, initial allocation : 200) intervals
2024-11-20 07:00:52.000
24/11/20 07:00:52.545 main INFO YarnAllocator: Yarn scheduler type is FAIR_SCHEDULER

--申请资源
24/11/20 08:07:21.331 task-starvation-timer WARN YarnClusterScheduler: Initial job has not accepted any resources; check your cluster UI to ensure that workers are registered and have sufficient resources

  通过AM日志,可以很清晰的看到 在08:08之前一直没有申请资源

  • 解决办法
1.提升任务优先级
2.迁移资源充足的集群或队列

案例四:执行时间长-数据量大-未倾斜

  • 现象: 任务执行时间长,3-5h执行完成
  • UI排查:寻找最长的job对应stage

  job1 和 job2 执行约3.4h

  • 查看 job1的stage

  • 数据量大: 输入了160T,150亿数据
  • task执行情况较为均匀,非倾斜引起的执行慢
  • 解决办法
1.参数优化:资源允许的条件下,增加资源
  set spark.dynamicAllocation.minExecutors=100;
  set spark.dynamicAllocation.maxExecutors=1500;
  set spark.executor.memory=20G;
  set spark.executor.cores=4;
  set spark.sql.shuffle.partitions =12000;
  set spark.default.parallelism = 12000;
2.代码逻辑优化:减少输入的数据量、全量改增量、剔除大字段

案例五:执行时间长-数据量大-数据倾斜

  • 查看最长耗时的stage

  • 查看stage的task执行情况

max的task 是median各指标的数倍, 很明显的数据倾斜

  • 继续定位倾斜发生在代码的位置

倾斜的stage发生在 Stage 712,去ui的sql模块 搜索关键字 “stage 712”

如果对代码较为熟悉,可以通过关键字搜索任务的代码,这里关键字key 是order_id

如果对代码不熟悉,或者关键字出现多次,可以用DAG向上找 scan的表

用关键字定位任务代码:

  搜索订单表,找到对应发生倾斜代码

select  t1.order_id,
        t1.order_number,
        t1.sku_id,
        t1.privilege_id,
        t2.privilege_name,
        t2.privilege_type
from    (
            select  order_id,
                    order_number,
                    sku_id,
                    user_id
            from    y_life.dws_order_sku_df
            where   date='${date}'
        ) t1
left join
        (--订单权益表
            select  
                    order_id,
                    privilege_id,
                    privilege_name,
                    privilege_type
            from    y_life.dws_order_privilege__df
        ) t2
on      t1.order_id=t2.order_id
  • 确定key的分布
select  order_id,
        count(*) as cnt
from     y_life.dws_order_sku_df
where   date='${date-1}'
group by
        order_id
order by
        cnt desc;

  • 解决办法:和业务确认odrer_id = 0 的场景可以过滤。

#java##数据分析##数据人offer决赛圈怎么选##数据人的面试交流地##牛客创作赏金赛#
全部评论

相关推荐

不愿透露姓名的神秘牛友
12-17 17:43
Java抽象带篮子:绝绝子暴风吸入啊
点赞 评论 收藏
分享
nbdy:她的意思是,有的话就有,没有的话就没有
点赞 评论 收藏
分享
评论
1
1
分享
牛客网
牛客企业服务