错误提示:
错误原因:
一个目录下的子目录数量达到限制,默认的上限是 1048576。
每次执行hive语句时,都会在 hive.exec.scratchdir 配置的目录下生成一个临时目录,执行结束后会自动删除,如果异常中断则有可能会保留目录。
提供两种解决办法:
- 提高目录的限制上限,通过 dfs.namenode.fs-limits.max-directory-items 参数限制,最高不能超过 6400000
<property>
<name>dfs.namenode.fs-limits.max-directory-items</name>
<value>1048576</value>
</property>
- 使用脚本批量删除 dfs 过期目录
#!/bin/bash
usage="Usage: ./cleanup.sh [path] [days]"
if [ ! "$1" ]
then
echo $usage;
exit 1;
fi
if [ ! "$2" ]
then
echo $usage;
exit 1;
fi
now=$(date +%s);
i=1;
arr="";
hdfs dfs -ls $1 | while read f; do
file_date=`echo $f | awk '{print $6}'`;
file_name=`echo $f | awk '{print $8}'`;
diff=$(( ($now - $(date -d "$file_date" +%s)) / (24 * 60 * 60) ));
if [ $diff -gt $2 ]; then
if [ $(($i % 5000)) !=0 ]; then
arr=$arr" "$file_name;
i=$[$i+1];
else
hdfs dfs -rm -r $arr;
arr="";
i=1;
fi
fi
done
if [ $i != 1 ]; then
hdfs dfs -rmr -r $arr;
fi
批量删除 /tmp/hive/admin 下10天前创建的目录,每批 5000
./cleanup.sh /tmp/hive/admin 10
网友评论