10

hadoop fs -ls を使用して、(現在の日付から) N 日より古いすべてのディレクトリを検索できますか?

現在の日付の N 日前に作成された (パターンに一致する) HDFS 上のすべてのディレクトリを検索して削除するためのクリーンアップ ルーチンを作成しようとしています。

4

5 に答える 5

17

このスクリプトは、より古いすべてのディレクトリを一覧表示します[days]

#!/bin/bash
usage="Usage: $0 [days]"

if [ ! "$1" ]
then
  echo $usage
  exit 1
fi

now=$(date +%s)
hadoop fs -lsr | grep "^d" | while read f; do 
  dir_date=`echo $f | awk '{print $6}'`
  difference=$(( ( $now - $(date -d "$dir_date" +%s) ) / (24 * 60 * 60 ) ))
  if [ $difference -gt $1 ]; then
    echo $f;
  fi
done
于 2012-09-27T08:33:24.317 に答える
7

CDHHadoop のディストリビューションを使用している場合、Linux のコマンドのように動作する非常に便利なHdfsFindToolfindコマンドが付属しています。

デフォルトの区画情報を使用している場合は、次のようにします。

hadoop jar /opt/cloudera/parcels/CDH/jars/search-mr-*-job.jar \
org.apache.solr.hadoop.HdfsFindTool -find PATH -mtime +N

PATH を検索パスに置き換え、N を日数に置き換えます。

于 2016-09-15T15:29:39.210 に答える
4

実際のクラスターでは、ls を使用するのは得策ではありません。管理者権限を持っている場合は、fsimage を使用する方が適しています。

アイデアを説明するために上記のスクリプトを変更します。

まず、fsimage を取得します

curl "http://localhost:50070/getimage?getimage=1&txid=latest" > img.dump

それをテキストに変換します(lsrが与えるのと同じ出力)

hdfs oiv -i img.dump -o fsimage.txt

脚本:

#!/bin/bash
usage="Usage: dir_diff.sh [days]"

if [ ! "$1" ]
then
  echo $usage
  exit 1
fi

now=$(date +%s)
curl "http://localhost:50070/getimage?getimage=1&txid=latest" > img.dump
hdfs oiv -i img.dump -o fsimage.txt
cat fsimage.txt | grep "^d" | while read f; do 
  dir_date=`echo $f | awk '{print $6}'`
  difference=$(( ( $now - $(date -d "$dir_date" +%s) ) / (24 * 60 * 60 ) ))
  if [ $difference -gt $1 ]; then
    echo $f;
  fi
done
于 2012-09-27T14:03:03.753 に答える