Tôi có một công việc MapReduce quy định tại main.py
, mà nhập khẩu các mô-đun lib
từ lib.py
. Tôi sử dụng Hadoop Streaming để nộp công việc này đến cụm Hadoop như sau:Cách nhập mô-đun tùy chỉnh trong công việc MapReduce?
hadoop jar /usr/lib/hadoop-mapreduce/hadoop-streaming.jar -files lib.py,main.py
-mapper "./main.py map" -reducer "./main.py reduce"
-input input -output output
Trong hiểu biết của tôi, điều này sẽ đưa cả hai main.py
và lib.py
vào phân phối thư mục bộ nhớ cache trên mỗi máy tính và do đó làm cho mô-đun lib
sẵn đến main
. Nhưng nó không xảy ra: từ nhật ký tôi thấy rằng các tệp thực sự được sao chép vào cùng một thư mục, nhưng main
không thể nhập lib
, ném ImportError
.
Tại sao điều này xảy ra và làm cách nào để khắc phục sự cố?
UPD. Thêm thư mục hiện hành với con đường đã không làm việc:
import sys
sys.path.append(os.path.realpath(__file__))
import lib
# ImportError
dù, tải các module bằng tay đã làm các trick:
import imp
lib = imp.load_source('lib', 'lib.py')
Nhưng đó không phải là những gì tôi muốn. Vậy tại sao trình thông dịch Python thấy các tệp .py
khác trong cùng một thư mục, nhưng không thể nhập chúng? Lưu ý rằng tôi đã thử thêm một tệp __init__.py
trống vào cùng một thư mục mà không có hiệu lực.
Bạn đã kiểm tra 'sys.path' trong' main.py' để đảm bảo thư mục hoạt động được bao gồm chưa? – lmjohns3
@ lmjohns3: vâng, thư mục làm việc nằm trên đường dẫn lớp. BTW, nó không tự động được bao gồm cho chạy script? (chỉ tò mò) – ffriend
Tôi tin điều đó đúng với các tập lệnh Python được bắt đầu trên dòng lệnh, nhưng luồng Hadoop có thể bắt đầu một trình thông dịch Python theo một cách khác (không thực sự chắc chắn). Dù bằng cách nào, tôi vẫn nghĩ rằng điều này nghe có vẻ giống như một vấn đề đường dẫn. Xem http://www.litfuel.net/plush/?postid=195 để có thể phân phối các mô-đun của bạn theo cách khác. Ngoài ra, hãy thử viết các lệnh của bạn vào một kịch bản lệnh shell và truyền nó cho các đối số dòng lệnh '-mapper' và' -reducer'. – lmjohns3