2012-06-19 11 views
14

जब सुअर लिपियों कि स्टोर आदेश का उपयोग विकासशील मैं हर रन के लिए उत्पादन निर्देशिका को हटाना होगा या स्क्रिप्ट बंद हो जाता है और प्रदान करता है:डुबकी में एचडीएफएस को स्टोर (ओवरराइट) कैसे मजबूर करें?

2012-06-19 19:22:49,680 [main] ERROR org.apache.pig.tools.grunt.Grunt - ERROR 6000: Output Location Validation Failed for: 'hdfs://[server]/user/[user]/foo/bar More info to follow: 
Output directory hdfs://[server]/user/[user]/foo/bar already exists 

तो मैं कर रहा हूँ खोज करने के लिए एक में सुअर समाधान के लिए स्वचालित रूप से निर्देशिका को हटा दें, जो कि कॉल समय पर मौजूद नहीं है, तो यह भी दबाता नहीं है।

पिग लैटिन संदर्भ में मुझे शेल कमांड चालक एफएस मिला। दुर्भाग्यवश जब भी कुछ भी त्रुटि उत्पन्न करता है तो पिग स्क्रिप्ट टूट जाती है। इसलिए मैं उपयोग कर सकते हैं नहीं

fs -rmr foo/bar 

(मैं। ई। रिकर्सिवली निकालने के लिए) के बाद से यह टूट जाता है, तो निर्देशिका मौजूद नहीं है। एक पल के लिए मैंने सोचा कि मैं

fs -test -e foo/bar 

जो एक परीक्षण है और मुझे तोड़ना नहीं चाहिए या इसलिए मैंने सोचा था। हालांकि, सुअर फिर से एक गैर-मौजूदा निर्देशिका पर असफलता कोड और ब्रेक के रूप में test का रिटर्न कोड व्याख्या करता है।

सुअर परियोजना मेरी समस्या को संबोधित है और एक वैकल्पिक पैरामीटर अधिलेखित या FORCE_WRITEस्टोर आदेश के लिए सुझाव देने के लिए एक JIRA ticket नहीं है। वैसे भी, मैं आवश्यकता से बाहर सुअर 0.8.1 का उपयोग कर रहा हूं और ऐसा कोई पैरामीटर नहीं है।

उत्तर

40

अंत में मुझे grokbase पर एक समाधान मिला। चूंकि समाधान ढूंढने में बहुत लंबा समय लगेगा, मैं इसे यहां पुन: उत्पन्न करूंगा और इसमें जोड़ूंगा।

आप

STORE Relation INTO 'foo/bar'; 

फिर कथन का उपयोग, क्रम में निर्देशिका हटाने के लिए अपने उत्पादन संग्रहीत करना चाहते हैं मान लीजिए, आप स्क्रिप्ट

rmf foo/bar 

नहीं के शुरू में कॉल कर सकते हैं "," या उद्धरण आवश्यक है क्योंकि यह एक शेल कमांड है।

मैं इसे पुन: पेश नहीं कर सकता लेकिन कुछ समय पर मुझे एक त्रुटि संदेश (गायब फाइलों के बारे में कुछ) मिला जहां मैं केवल आरएमएफ मानचित्र/कमी के साथ हस्तक्षेप कर सकता हूं। इसलिए मैं किसी भी संबंध घोषणा से पहले कॉल डालने की सलाह देता हूं। एसईटी के बाद, रजिस्टरों और चूक ठीक होनी चाहिए।

उदाहरण:

SET mapred.fairscheduler.pool 'inhouse'; 
REGISTER /usr/lib/pig/contrib/piggybank/java/piggybank.jar; 
%default name 'foobar' 
rmf foo/bar 
Rel = LOAD 'something.tsv'; 
STORE Rel INTO 'foo/bar'; 
+0

के लिए: किसी एक फ़ाइल के लिए, मैं यह मेरी स्क्रिप्ट की शुरुआत में जोड़ने से समापन।मैं इसे तीन चरणों में करूँगा: 1) 'foobar-tmp' में स्टोर 2) आरएमएफ फू/बार 3) एमओ 'foobar-tmp' foo/bar –

+2

@MiguelPing: ऐसा लगता है जैसे आपका दृष्टिकोण चलाना चाहिए मेरी प्रारंभिक समस्या लेकिन 'foo/bar' के बजाय' foobar-tmp' के लिए। पहले स्टोर करना उस छिपी हुई त्रुटि का उत्पादन भी कर सकता है जिसे मैंने मानचित्र/कम करने के लिए जिम्मेदार ठहराया है। यदि आपका समाधान आपकी तरफ काम करता है तो क्या आप इसे एक उदाहरण स्क्रिप्ट के साथ जवाब में बदल सकते हैं और अपना सुअर संस्करण संख्या प्रदान कर सकते हैं? – valid

+0

@ valid मेरा समाधान आपके जैसा ही है, मैंने अभी गारंटी देने के लिए एक अतिरिक्त कदम जोड़ा है कि अगर 'आरएमएफ' और' स्टोर '(कहें, अपवाद) के बीच कुछ होता है तो आप डेटा खोना नहीं चाहते हैं। सुअर स्क्रिप्ट किसी भी समय असफल हो सकती हैं, इसलिए मेरा समाधान परमाणु नहीं है, लेकिन कम से कम आप डेटा खोने का जोखिम नहीं चलाते हैं। –

2

एक बार जब आप FS आदेश का उपयोग करें, वहाँ तरीके का एक बहुत यह करने के लिए। हालांकि यह वास्तव में अच्छा है, यह परमाणु नहीं है

-- Delete file (won't work for output, which will be a directory 
-- but will work for a file that gets copied or moved during the 
-- the script.) 
fs -touchz top_100 
rm top_100 

एक निर्देशिका

-- Delete dir 
fs -rm -r out 
संबंधित मुद्दे