2012-09-27 14 views
9

È possibile utilizzare hadoop fs -ls per trovare tutte le directory più vecchie di N giorni (dalla data corrente)?Ricerca di directory più vecchie di N giorni in HDFS

Sto cercando di scrivere una routine di pulizia per trovare ed eliminare tutte le directory su HDFS (corrispondenti a un modello) che sono stati creati N giorni prima della data corrente.

+0

Una delle soluzioni precedenti è stato parzialmente utile. Potrei scrivere uno script di shell per trovare ed eliminare tutte le directory che corrispondono a un pattern, ma quello che dovevo veramente fare era cancellare solo quelli che erano più vecchi di N giorni. (http://stackoverflow.com/questions/7733096/hadoop-bash-delete-filenames-matching-range) – vid12

risposta

16

Questo script elenca tutte le directory che sono più vecchi di [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

Per i cluster reali non è una buona idea, usare ls. Se disponi dei diritti di amministratore, è più adatto per utilizzare fsimage.

Modifica lo script sopra per illustrare l'idea.

prima, fetch fsimage

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

convertirlo in un testo (stessa uscita LSR dà)

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

Script:

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

Puoi spiegare perché è meglio usare fsimage? – Aliaxander

+0

Se hai milioni di file 'fs -ls' probabilmente non funzionerebbe. Quindi potresti scrivere il tuo codice java per iterare il filesystem o eseguire il dump di fsimage una volta ed eseguire molte operazioni successive usando questo e semplici strumenti unix. – octo

4

Se vi capita di fare uso di CDH distribuzione di Hadoop, viene fornito con un utilissimo comando HdfsFindTool, che si comporta come il comando di Linux find.

Se si sta utilizzando le informazioni di pacchi di default, ecco come lo faresti:

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

Dove si dovrebbe sostituire PATH con il percorso di ricerca e N con il numero di giorni.

0

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

+0

per favore dare una spiegazione adeguata alla risposta. – Anmol

+0

hdfs dfs -ls /hadoop/path/*.txt - Questa parte cercherà tutti i file .txt awk '$ 6 <"2017-10-24"' - questa parte controllerà la data di creazione del file con condizione. –

Problemi correlati