2012-09-27 11 views
9

¿Se puede usar hadoop fs -ls para buscar todos los directorios anteriores a N días (a partir de la fecha actual)?Búsqueda de directorios anteriores a N días en HDFS

Estoy tratando de escribir una rutina de limpieza para buscar y eliminar todos los directorios en HDFS (que coincidan con un patrón) que se crearon N días antes de la fecha actual.

+0

Una de las soluciones anteriores fue parcialmente útiles. Podía escribir un script de shell para buscar y eliminar todos los directorios que coincidían con un patrón, pero lo que realmente necesitaba hacer era eliminar solo los que tenían más de N días. (http://stackoverflow.com/questions/7733096/hadoop-bash-delete-filenames-matching -range) – vid12

Respuesta

16

Este script se enumeran todos los directorios que tienen más de [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

Para los clústeres reales no es una buena idea, utilizar ls. Si tiene derechos de administrador, , es más adecuado usar fsimage.

Modifico la secuencia de comandos de arriba para ilustrar la idea.

primero, ir a buscar fsimage

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

convertir a texto (misma salida que LSR da)

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

Guión:

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

¿Podría explicar por qué es mejor usar fsimage? – Aliaxander

+0

Si tiene millones de archivos, 'fs -ls' probablemente no funcionaría. Por lo tanto, puede escribir su propio código Java para iterar el sistema de archivos o volcar fsimage una vez y ejecutar muchas operaciones posteriores utilizándolo y herramientas sencillas de Unix. – octo

4

Si sucede utilizar CDH distribución de Hadoop, viene con un comando HdfsFindTool muy útil, que se comporta como el comando find de Linux.

Si está utilizando la información de los paquetes por defecto, así es como usted lo haría:

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

el lugar donde quiere sustituya la ruta con la ruta de búsqueda y N con el número de días.

0

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

+0

por favor dé una explicación adecuada a su respuesta. – Anmol

+0

hdfs dfs -ls /hadoop/path/*.txt - Esta parte buscará todos los archivos .txt awk '$ 6 <"2017-10-24"' - esta parte verificará para crear la fecha del archivo con la condición. –

Cuestiones relacionadas