2014-05-07 14 views
11

मैं क्लौडेरा के हैडूप (0.20.2) का उपयोग कर रहा हूं, तो निर्देशिका बनाने के लिए हैडॉप को कैसे रखा जाए।यदि वे मौजूद नहीं हैं

इसलिए उदाहरण के लिए, अगर मैं HDFS में कोई निर्देशिका था और आपके द्वारा लिखा गया:

इस संस्करण के साथ, अगर मैं फाइल सिस्टम में एक फ़ाइल में कहें, लेकिन निर्देशिका संरचना मौजूद नहीं था, यह स्वतः ही माता पिता निर्देशिका बनाया

Hadoop FS रखो myfile.txt /some/non/existing/path/myfile.txt

यह निर्देशिका के सभी बनाने होगा: कुछ, गैर, मौजूदा और पथ और डाल फ़ाइल वहाँ पर।

अब, हैडूप (2.2.0) की एक नई पेशकश के साथ निर्देशिकाओं का यह स्वत: निर्माण नहीं हो रहा है। पैदावार से ऊपर एक ही आदेश:

पुट: `/ कुछ/गैर/मौजूदा/path/': इस तरह के कोई फ़ाइल या निर्देशिका

मैं एक समाधान है बस Hadoop FS करने के लिए -mkdir पहले , हर डाल के लिए, लेकिन यह अच्छा प्रदर्शन करने वाला नहीं है।

क्या यह कॉन्फ़िगर करने योग्य है? कोई सलाह?

+0

क्यों यह अच्छा प्रदर्शन नहीं करेगा? – climbage

+0

>> यह अच्छा प्रदर्शन क्यों नहीं करेगा? क्योंकि प्रत्येक 'put' के लिए मैं एक mkdir कर रहा हूं - जो कि अधिकांश समय की आवश्यकता नहीं हो सकती है, इसलिए यह उच्च थ्रूपुट स्थितियों में प्रदर्शन को प्रभावित करने जा रहा है। – owly

+0

क्या आपने अपना खुद का समाधान लिखने पर विचार किया है? मैं आश्चर्यचकित हूं कि 'कॉल' पर ध्यान दिया जाता है कि प्रत्येक कॉल को वीएम शुरू करना है, कॉन्फ़िगरेशन पढ़ना है, आदि ... – climbage

उत्तर

18

अब आप hadoop fs -mkdir -p <path>

+0

यह काम करता है! धन्यवाद – ajkush

+0

यह सवाल कैसे है? – hlagos

1

hadoop fs ... का उपयोग करने के बजाय अब मान्य नहीं है का उपयोग करना चाहिए: hdfs dfs -mkdir ....

+0

hadoop dfs -mkdir/mnt/hdfs अस्वीकृत: hdfs कमांड निष्पादित करने के लिए इस स्क्रिप्ट का उपयोग बहिष्कृत किया गया है। इसके बजाय hdfs कमांड का उपयोग करें। – Anshul

0

HDFS में एक गैर मौजूदा निर्देशिका में एक फ़ाइल को रखने के लिए एक दो चरण की प्रक्रिया की आवश्यकता है। जैसा कि @ आरटी-वैबोर ने कहा है, कई गायब पथ तत्व बनाने के लिए mpdir को '-p' विकल्प का उपयोग करें। लेकिन चूंकि ओपी ने फ़ाइल को एचडीएफएस में कैसे रखा है, निम्नलिखित एचडीएफएस भी डालते हैं, और ध्यान दें कि आप (वैकल्पिक रूप से) जांच सकते हैं कि पॉट सफल हुआ है, और सशर्त रूप से स्थानीय प्रति को हटा दें।

पहले hdfs में प्रासंगिक निर्देशिका पथ बनाएं, और फिर फ़ाइल को hdfs में रखें। आप यह जांचना चाहते हैं कि फ़ाइल hdfs में रखने से पहले मौजूद है। और आप लॉग/शो करना चाहते हैं कि फ़ाइल को सफलतापूर्वक hdfs में रखा गया है। निम्नलिखित सभी चरणों को जोड़ती है।

fn=myfile.txt 
if [ -f $fn ] ; then 
    bfn=`basename $fn` #trim path from filename 
    hdfs dfs -mkdir -p /here/is/some/non/existant/path/in/hdfs/ 
    hdfs dfs -put $fn /here/is/some/non/existant/path/in/hdfs/$bfn 
    hdfs dfs -ls /here/is/some/non/existant/path/in/hdfs/$bfn 
    success=$? #check whether file landed in hdfs 
    if [ $success ] ; then 
    echo "remove local copy of file $fn" 
    #rm -f $fn #uncomment if you want to remove file 
    fi 
fi 

और आप एक खोल स्क्रिप्ट में इस बंद कर सकते हैं, एक Hadoop पथ, और फ़ाइलों की एक सूची ले रही है (यह भी केवल एक बार पथ बना),

#!/bin/bash 
hdfsp=${1} 
shift; 
hdfs dfs -mkdir -p /here/is/some/non/existant/path/in/hdfs/ 
for fn in $*; do 
    if [ -f $fn ] ; then 
    bfn=`basename $fn` #trim path from filename 
    hdfs dfs -put $fn /here/is/some/non/existant/path/in/hdfs/$bfn 
    hdfs dfs -ls /here/is/some/non/existant/path/in/hdfs/$bfn >/dev/null 
    success=$? #check whether file landed in hdfs 
    if [ $success ] ; then 
     echo "remove local copy of file $fn" 
     #rm -f $fn #uncomment if you want to remove file 
    fi 
    fi 
done 
संबंधित मुद्दे