2012-09-27 14 views
9

Czy można użyć opcji hadoop fs -ls, aby znaleźć wszystkie katalogi starsze niż N dni (od bieżącej daty)?Znajdowanie katalogów starszych niż N dni w HDFS

Próbuję napisać procedurę czyszczenia, aby znaleźć i usunąć wszystkie katalogi w HDFS (pasujące do wzorca), które zostały utworzone na N dni przed bieżącą datą.

+0

Jednym z wcześniejszych rozwiązań było częściowo pomocne. Mógłbym napisać skrypt powłoki, aby znaleźć i usunąć wszystkie katalogi pasujące do wzorca, ale to, co naprawdę musiałem zrobić, to usunąć te, które były starsze niż N dni. (http://stackoverflow.com/questions/7733096/hadoop-bash-delete-filenames-matching-range) – vid12

Odpowiedz

16

Skrypt ten zawiera wszystkie katalogi, które są starsze niż [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 
4

Dla prawdziwych klastrów nie jest to dobry pomysł, aby użyć ls. Jeśli masz uprawnienia administratora, bardziej odpowiednie jest użycie fsimage.

Modyfikuję powyższy skrypt, aby zilustrować pomysł.

najpierw pobrać fsimage

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

przekonwertować go na tekst (taki sam efekt jak LSR daje)

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

Scenariusz:

#!/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 
+0

Czy mógłbyś wyjaśnić proszę, dlaczego lepiej jest użyć fsimage? – Aliaxander

+0

Jeśli masz miliony plików "fs -ls" prawdopodobnie nie będzie działać. Więc możesz albo napisać swój własny kod java, aby powtórzyć system plików, albo zrzucić fsimage raz i uruchomić wiele późniejszych operacji przy użyciu tego i prostych narzędzi unixowych. – octo

4

Jeśli zdarzy ci się być za pomocą CDH dystrybucji z Hadoop, jest wyposażony w bardzo przydatne polecenie, które zachowuje się jak polecenie Linuksa find.

Jeśli używasz informacji domyślnych paczek, oto jak chcesz to zrobić:

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

Jeżeli chcesz zastąpić ścieżkę ścieżką wyszukiwania i N z liczbą dni.

0

HDFS DFS -ls /hadoop/path/*.txt|awk '$ 6 < "24/10/2017"'

+0

proszę podać prawidłowe wyjaśnienie swojej odpowiedzi. – Anmol

+0

hdfs dfs -ls /hadoop/path/*.txt - Ta część wyszuka wszystkie pliki .txt awk '6 $ <"2017-10-24"' - ta część sprawdzi, czy data utworzenia pliku jest zgodna z warunkiem. –

Powiązane problemy