排查 Hive 任务导致磁盘写满的过程

计算的中间结果会写到 HDFS,如果用户写的SQL 有问题。如用户的 SQL 如下:
select * from A join B where a.dt=20230101 and b.dt=20230101,如 A 表 dt=20230101 分区 1000万行,B 表 dt=20230101 有 1万行记录。由于 SQL 没有关联条件,结果有1000亿行。

1.排查过程

1.1 先确定SQL queryId

hadoop fs -du -s -h /tmp/hive/*, 找到哪个用户的SQL 占用的多。
然后一级一级的查询。
如找到以下目录比较大

hdfs://bmr-master-479c2fa:8020/tmp/hive/hive/7809bfaf-c225-4c1d-bb58-1f8913f8a960/hive_2023-01-05_15-10-10_783_5535354154485458824-3

hive_2023-01-05_15-10-10_783可以确定这个 SQL 是 2023-01-05 15:10:10 提交的。

2. 根据用户执行的方式,找到对应的 SQL

2.1 jdbc 连接 hive-server 执行的方式

因为不知道连接的哪台 hive-server,所以需要到所有的 hive-server 上查询日志。

cd /mnt/bmr/log/hive

根据任务的时间确定哪个日志文件,当前日志文件为 hiveserver2.log。也有可能日志文件写到阈值,已经压缩为 hiveserver2.log.2023-01-05_${xxx}.gz,其中 KaTeX parse error: Expected group after '_' at position 64: ….log.2023-01-05_̲{xxx}.gz 文件里,拷贝到临时目录,使用 gunzip hiveserver2.log.2023-01-05_${xxx}.gz 进行解压。

根据 hive_2023-01-05_15-10-10_783_5535354154485458824-3,找到以下日志,SQL 为 “select count(1) from store_sales”.

2023-01-05T15:10:12,044 INFO  [HiveServer2-Background-Pool: Thread-451]: ql.Driver (:()) - Executing command(queryId=hive_20230105151010_fd576219-fae0-4a48-93bd-eda63a40e3bd): select count(1) from store_sales
2023-01-05T15:10:12,044 INFO  [HiveServer2-Background-Pool: Thread-451]: ql.Driver (:()) - Query ID = hive_20230105151010_fd576219-fae0-4a48-93bd-eda63a40e3bd
2023-01-05T15:10:12,044 INFO  [HiveServer2-Background-Pool: Thread-451]: ql.Driver (:()) - Total jobs = 1
2023-01-05T15:10:12,044 INFO  [HiveServer2-Background-Pool: Thread-451]: ql.Driver (:()) - Launching Job 1 out of 1
2023-01-05T15:10:12,044 INFO  [HiveServer2-Background-Pool: Thread-451]: ql.Driver (:()) - Starting task [Stage-1:MAPRED] in serial mode
2023-01-05T15:10:12,049 INFO  [HiveServer2-Background-Pool: Thread-451]: ql.Context (:()) - New scratch dir is hdfs://bmr-master-479c2fa:8020/tmp/hive/hive/7809bfaf-c225-4c1d-bb58-1f8913f8a960/hive_2023-01-05_15-10-10_783_5535354154485458824-3

2.2 以 hive-cli 的方式

以 hive 命令执行,则需要到执行的服务器。
cd /mnt/bmr/log/hive/hive
有可能在当前文件 hive.log,也有可能在 hive.log.2023-01-04_${xxx}.gz。和 hive-server 的查找方式一样。

2.3 不知道用户的执行方式,或者不知道在哪台服务器上以 hive 的命令执行

打开 ResourceManager 找到当时时间段执行的任务。如果找不到,则打开 timeline-server 找到当时时间段执行的所有任务。
在这里插入图片描述
query 对应的时间在开始时间和结束时间之间的 application 都需要查看。点开 application,进入以下界面。
在这里插入图片描述
点击 History,进入 tez-ui 界面。
在这里插入图片描述
点击 DAGs,进入以下页面。
在这里插入图片描述
每行都是一个SQL,点击Dag Name 下面的链接,进入页面如下:
最下面 “Additional Info from Hive” 部分,显示完整的 SQL,查看是否有问题。
在这里插入图片描述

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值