hdfs exceeded directory item limit

错误提示:

hdfs exceeded directory item limit_第1张图片
错误提示

错误原因:
一个目录下的子目录数量达到限制,默认的上限是 1048576。
每次执行hive语句时,都会在 hive.exec.scratchdir 配置的目录下生成一个临时目录,执行结束后会自动删除,如果异常中断则有可能会保留目录。

提供两种解决办法:

  • 提高目录的限制上限,通过 dfs.namenode.fs-limits.max-directory-items 参数限制,最高不能超过 6400000

      dfs.namenode.fs-limits.max-directory-items
      1048576

  • 使用脚本批量删除 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

你可能感兴趣的:(hdfs exceeded directory item limit)