一次集群文件无故被删问题排查
前言
发现集群部分目录文件丢失,但是都有一定的规律,比如该目录下,只留了七天的数据。这个事情挺严重的,需要排查一下具体问题。
[cluster]$ hadoop fs -ls /data/logs/log1Found 6 itemsdrwxr-xr-x - user supergroup 0 2016-07-15 01:13 /data/logs/log12016-07-14drwxr-xr-x - user supergroup 0 2016-07-16 01:12 /data/logs/log12016-07-15drwxr-xr-x - user supergroup 0 2016-07-17 01:11 /data/logs/log12016-07-16drwxr-xr-x - user supergroup 0 2016-07-18 01:11 /data/logs/log12016-07-17drwxr-xr-x - user supergroup 0 2016-07-19 01:13 /data/logs/log12016-07-18drwxr-xr-x - user supergroup 0 2016-07-20 01:12 /data/logs/log12016-07-19排查思路和过程
我的思路主要是这样:先定位到哪台机器执行了这些操作,然后再在这台机器上找到登录的人和具体执行的脚本。
1. history 查看
通过history查看,在我们所有的机器上查看了一番,发现没有相关的命令,猜测可能是脚本,但是脚本的话,就更难找了。
2. crontab 查看
然后再查看crontab的情况。
各个用户看了一下,没发现什么明显带有删除命令的脚本
3.fsimage文件
上面两步都没用,就只有通过hadoop平台自身的命令了。
首先想到的就是fsimage文件,但是这里面只包含了文件的信息,没有操作记录。
hdfs oiv -i fsimage_#### -p XML -o f1.xml<inode><id>16777220</id><type>FILE</type><name>data.146702594sad3850</name><replication>2</replication><mtime>1467025974881</mtime><atime>14670fds25943899</atime><perferredBlockSize>134217728</perferredBlockSize><permission>user:supergroup:rw-r--r--</permission><blocks><block><id>1089131808</id><genstamp>15409803</genstamp><numBytes>672</numBytes></block></blocks></inode>4.edits_#### 文件
然后就找到edits文件,但是edits文件里面只记录了一定时间内的操作记录,过了这个某个时间点就会被合并到fsimage中。最新的edits文件,没有找到相关目录的操作。
hdfs oev -i edits_#### -o e1.xml<RECORD> <OPCODE>OP_ADD</OPCODE> <DATA> <TXID>1259598798</TXID> <LENGTH>0</LENGTH> <INODEID>22356685</INODEID> <PATH>/dir/dir/dir/dir/2016-07-20/dir/dir/file</PATH> <REPLICATION>2</REPLICATION> <MTIME>1468975996348</MTIME> <ATIME>1468975996348</ATIME> <BLOCKSIZE>134217728</BLOCKSIZE> <CLIENT_NAME>DFSClient_NONMAPREDUCE_1299808995_33</CLIENT_NAME> <CLIENT_MACHINE>ip地址</CLIENT_MACHINE> <OVERWRITE>true</OVERWRITE> <PERMISSION_STATUS> <USERNAME>plat</USERNAME> <GROUPNAME>supergroup</GROUPNAME> <MODE>420</MODE> </PERMISSION_STATUS> <RPC_CLIENTID>0931bf92-7d76-4e48-8914-73d6d5dbf4b0</RPC_CLIENTID> <RPC_CALLID>2793790</RPC_CALLID> </DATA> </RECORD>5.偶然存在的一个脚本
这时候突然想到,我之前为了记录每天的数据新增量,写了个脚本,每天记录各个目录的数据大小。我通过这个脚本的变化,就能定位到该目录是哪天突然减少的,然后再查当天的日志就可以了。
幸运的是,的确找到了。
执行hadoop fs -du -h /lagou~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~记一次hdfs容量。当前时间是: 2016-07-19 09:00:00^M执行hadoop fs -df -h /Filesystem Size Used Available Use%hdfs://host:8020 xx T xx T xx T xx %执行hadoop fs -du -h /178.2 G 356.5 G /dir10 0 /dir2......315.4 G 631.8 G /dir428.3 G 58.8 G /dir53.9 G 7.9 G /dir66.每小时定时备份元数据
找到之后是哪一天的问题后,就是怎么获取那一天的edits文件了,这时候就是看你之前的人品了,我前段时间刚开始备份namenode的元数据信息,每隔1小时将所有的元数据信息备份一下,这次用上了~
通过一天24小时所有的文件操作日志,就能找到具体的操作ip了。
既然已经定位到了某个ip,那么就可以在该机器仔细找一下原因。
然后就找到了操作的时间。
7.定位执行脚本
再次仔细检查该机器上所有用户的crontab的脚本,以及调度任务里面的脚本,就找到了如下内容:
[]$ crontab -l10 1 * * * /bin/sh /dir/daily.sh >> /dir/daily.logif [ $opt == 'compress' ]; then echo "------------------" echo "压缩文件 /data/logs " echo "------------------" hadoop jar /dir/jar.jar 'compress' "$cnt_date" /data/logsif [ $opt == 'delete' ]; then echo "------------------" echo "删除文件 /data/logs" echo "------------------" hadoop jar /dir/jar.jar 'delete' "$cnt_date" /data/logs暂时定位到了该脚本,里面删除的目录和丢失数据的目录完全吻合。定位到脚本后,后面的问题都容易解决了。呵呵呵呵。
简单说一下,这个脚本最明显的问题就是,删除操作执行之前,没有判断是否压缩成功。
总结
凡是对数据操作的程序都要慎重。
2016-07-28 13:08:00 hzct
作者:dantezhao | 简书 | CSDN | GITHUB 文章推荐:http://dantezhao.com/readme 个人主页:http://dantezhao.com 文章可以转载, 但必须以超链接形式标明文章原始出处和作者信息