2012-09-27 13 views
9

में एन दिनों से पुरानी निर्देशिकाएं ढूँढना क्या हैडऑप fs -ls का उपयोग एन दिनों से अधिक (मौजूदा तारीख से) की सभी निर्देशिकाओं को खोजने के लिए किया जा सकता है?एचडीएफएस

मैं एचडीएफएस (एक पैटर्न से मेल खाने) पर सभी निर्देशिकाओं को खोजने और हटाने के लिए एक स्वच्छ दिनचर्या लिखने की कोशिश कर रहा हूं जो वर्तमान दिनांक से पहले दिन पहले बनाए गए थे।

+0

पहले समाधान में से एक आंशिक रूप से मददगार था। मैं एक पैटर्न से मेल खाने वाली सभी निर्देशिकाओं को ढूंढने और हटाने के लिए एक शेल स्क्रिप्ट लिख सकता था, लेकिन मुझे वास्तव में जो करना था वह केवल उन दिनों को हटा देता था जो एन दिनों से पुराने थे। (http://stackoverflow.com/questions/7733096/hadoop-bash-delete-filenames-matching-range) – vid12

उत्तर

16

यह स्क्रिप्ट सभी निर्देशिकाओं कि [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

असली समूहों के लिए यह एक अच्छा विचार, 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 
+0

क्या आप समझा सकते हैं कृपया fsimage का उपयोग करना बेहतर क्यों है? – Aliaxander

+0

यदि आपके पास लाखों फाइलें हैं 'fs -ls' शायद काम नहीं करेगी। तो आप या तो फाइल सिस्टम को फिर से चलाने के लिए अपना स्वयं का जावा कोड लिख सकते हैं या एक बार फंपमेज डंप कर सकते हैं और इसके बाद कई सरल ऑपरेशन चला सकते हैं और सरल यूनिक्स टूल का उपयोग कर सकते हैं। – octo

4

यदि आप ऐसा CDH वितरण का उपयोग करने की हैडोप का, यह बहुत उपयोगी HdfsFindTool कमांड के साथ आता है, जो कि लिनक्स के find कमांड की तरह व्यवहार करता है।

आप डिफ़ॉल्ट पार्सल जानकारी का उपयोग कर रहे हैं, तो यहां आप यह कर करेंगे:

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

कहाँ पथ खोज पथ के साथ और एन दिनों की संख्या के साथ बदलें चाहते हैं।

0

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

+0

कृपया अपने उत्तर के लिए उचित स्पष्टीकरण दें। – Anmol

+0

hdfs dfs -ls/hadoop/path/*.txt - यह भाग सभी .txt फ़ाइलों को खोजेगा awk '$ 6 <"2017-10-24"' - यह भाग स्थिति के साथ फ़ाइल की तारीख बनाने के लिए जांच करेगा। –

संबंधित मुद्दे