python app उपप्रोसेस, पाइप, पॉपन के साथ अजगर का उपयोग करते हुए फाइलों को पढ़ना/लिखना त्रुटि देता है




हिंदी को इंग्लिश में लिखना (2)

मैं एक अजगर स्क्रिप्ट के अंदर फाइलों को पढ़ने (खुली) और hdfs में लिखने का प्रयास कर रहा हूं। लेकिन त्रुटि हो रही है क्या कोई मुझे बता सकता है कि यहाँ क्या गलत है

कोड (पूर्ण): sample.py

#!/usr/bin/python

from subprocess import Popen, PIPE

print "Before Loop"

cat = Popen(["hadoop", "fs", "-cat", "./sample.txt"],
            stdout=PIPE)

print "After Loop 1"
put = Popen(["hadoop", "fs", "-put", "-", "./modifiedfile.txt"],
            stdin=PIPE)

print "After Loop 2"
for line in cat.stdout:
    line += "Blah"
    print line
    print "Inside Loop"
    put.stdin.write(line)

cat.stdout.close()
cat.wait()
put.stdin.close()
put.wait()

जब मैं निष्पादित करता हूं:

hadoop jar /usr/local/hadoop/share/hadoop/tools/lib/hadoop-streaming-2.5.1.jar -file ./sample.py -mapper './sample.py' -input sample.txt -output fileRead

यह ठीक से निष्पादित होता है, मैं उस फ़ाइल को नहीं ढूँढ पा रहा था जो कि एचडीएफएस संशोधितफ़ाइल में बनाना चाहता था

और जब मैं निष्पादित करता हूं:

 hadoop fs -getmerge ./fileRead/ file.txt

File.txt के अंदर, मुझे मिल गया:

Before Loop 
Before Loop 
After Loop 1    
After Loop 1    
After Loop 2    
After Loop 2

क्या कोई मुझे बता सकता है कि मैं यहाँ क्या गलत कर रहा हूं ?? मुझे नहीं लगता कि यह sample.txt से पढ़ता है


क्या कोई मुझे बता सकता है कि मैं यहाँ क्या गलत कर रहा हूं ??

आपका sample.py एक उचित मैपर नहीं हो सकता है एक मैपर शायद इसकी इनपुट को stdin पर स्वीकार करता है और इसके blah.py को परिणाम लिखता है, उदा। blah.py :

#!/usr/bin/env python
import sys

for line in sys.stdin: # print("Blah\n".join(sys.stdin) + "Blah\n")
    line += "Blah"
    print(line)

उपयोग:

$ hadoop ... -file ./blah.py -mapper './blah.py' -input sample.txt -output fileRead

इसे बदलकर अपनी put उप प्रक्रिया को अपने आप में cat स्टड आउट लेने की कोशिश करें

put = Popen(["hadoop", "fs", "-put", "-", "./modifiedfile.txt"],
            stdin=PIPE)

इस मामले में

put = Popen(["hadoop", "fs", "-put", "-", "./modifiedfile.txt"],
            stdin=cat.stdout)

पूर्ण स्क्रिप्ट:

#!/usr/bin/python

from subprocess import Popen, PIPE

print "Before Loop"

cat = Popen(["hadoop", "fs", "-cat", "./sample.txt"],
            stdout=PIPE)

print "After Loop 1"
put = Popen(["hadoop", "fs", "-put", "-", "./modifiedfile.txt"],
            stdin=cat.stdout)
put.communicate()






hadoop-streaming