Greenplum日志过大引起磁盘空间不足

日志过大,引起磁盘空间不足

问题回顾:调度任务执行报错, GreenplumPooledSQLException:.........No space left on device (seg0 172.16.252.39:40000 pid=xxxxx).

image

登录服务器,查看磁盘情况,发现占用率已经高达100%:

1
2
3
4
5
6
7
8
9
10
11
[root@tdh39 ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/mapper/centos-root 592G 592G 20K 100% /
devtmpfs 32G 0 32G 0% /dev
tmpfs 32G 0 32G 0% /dev/shm
tmpfs 32G 533M 31G 2% /run
tmpfs 32G 0 32G 0% /sys/fs/cgroup
/dev/sda1 1014M 169M 845M 17% /boot
tmpfs 6.3G 40K 6.3G 1% /run/user/0
tmpfs 6.3G 0 6.3G 0% /run/user/988
tmpfs 6.3G 0 6.3G 0% /run/user/1003

切换到根目录后,执行 du -sh,发现data目录占用高达581G

1
2
3
4
5
6
7
8
9
10
[root@tdh39 ~]# cd /
[root@tdh39 /]# du -sh *
0 bin
137M boot
581G data
0 dev
37M etc
143M hadoop
3.8G home
.......

进一步跟踪目录占用后,发现目录为gp510/gpdata,而gpdatagreenplum存放数据的目录。再进入到pg_log,发现存放了大量的csv格式的日志文件:

image

在目录下发现甚至有19年的日志存在,并且由于此次从5月8日开始启用新系统的ETL工具,该系统的ETL方式大致为:

  1. 查询源表数据;
  2. 根据源表结构和字段类型,创建临时表;
  3. 将源表数据插入到临时表;
  4. 从临时表取出数据,插入到目标表中。类似于 select * from temptable into xxx

由此看来,是因为日志未做清除策略,加上临时表很占用内存,都存放到了日志中,导致日志文件大小瞬间暴涨,连续运行几天之后,挤爆了磁盘空间。

image

因为暂时无法修改ETL系统策略,只能修改greenplum的日志策略,调整为3天清除一次。编写如下的shell脚本

1
2
3
4
5
6
#!/bin/sh

# delete log files
find /data/gp510/gpdata/master/gpseg-1/pg_log -mtime +3 -name "*.csv" -exec rm -rf {} \;
# drop caches
echo 1 > /proc/sys/vm/drop_caches;

-mtime代表修改时间,+3代表超过三天前的文件,为该脚本设置定时执行:

1
2
3
4
[root@tdh39 gp510]# crontab -e 

[root@tdh39 gp510]# crontab -l
0 0 * * * /data/gp510/log_task.sh

保存上面的shell文件为log_task.sh,使用crontab -e进入编辑,添加一句0 0 * * * /data/gp510/log_task.sh(每日凌晨执行)并保存。使用crontab -l可以查看该调度。

重启crontab使配置时生效:

1
[root@tdh39 gp510]# service crond restart

查询缓存不足 statement_mem

设置每个查询在segment主机中可用的内存,默认125M。当扫描一张分区特别多的表时,会出现该错误ERROR: insufficient memory reserved for statement (memquota.c:228)
解决方法,可以通过修改配置文件并重启集群,也可以通过如下方式修改:

1
2
3
su gpadmin
gpconfig -c statement_mem -v 256MB
gpstop -u

gp重启步骤

1
2
3
su gpadmin
gpstop -M fast
gpstart
0%