Sử dụng Apache Spark để làm ML. Tiếp tục nhận được lỗi nối tiếp


7

Vì vậy, tôi đang sử dụng Spark để phân tích tình cảm và tôi liên tục gặp lỗi với các bộ nối tiếp mà nó sử dụng (tôi nghĩ) để truyền các đối tượng python xung quanh.

PySpark worker failed with exception:
Traceback (most recent call last):
  File "/Users/abdul/Desktop/RSI/spark-1.0.1-bin-    hadoop1/python/pyspark/worker.py", line 77, in main
    serializer.dump_stream(func(split_index, iterator), outfile)
  File "/Users/abdul/Desktop/RSI/spark-1.0.1-bin-    hadoop1/python/pyspark/serializers.py", line 191, in dump_stream
    self.serializer.dump_stream(self._batched(iterator), stream)
  File "/Users/abdul/Desktop/RSI/spark-1.0.1-bin-    hadoop1/python/pyspark/serializers.py", line 123, in dump_stream
    for obj in iterator:
  File "/Users/abdul/Desktop/RSI/spark-1.0.1-bin-    hadoop1/python/pyspark/serializers.py", line 180, in _batched
    for item in iterator:
TypeError: __init__() takes exactly 3 arguments (2 given)

và mã cho serial serial có sẵn ở đây

và mã của tôi ở đây


Câu trả lời:


10

Lỗi tuần tự hóa thường gặp nhất trong (Py) Spark có nghĩa là một phần mã phân tán của bạn (ví dụ: các hàm được truyền đến map) có sự phụ thuộc vào dữ liệu không tuần tự hóa . Xem xét ví dụ sau:

rdd = sc.parallelize(range(5))
rdd = rdd.map(lambda x: x + 1)
rdd.collect()

Tại đây bạn đã phân phối bộ sưu tập và chức năng lambda để gửi cho tất cả công nhân. Lambda hoàn toàn tự chứa, vì vậy thật dễ dàng để sao chép biểu diễn nhị phân của nó sang các nút khác mà không phải lo lắng.

Bây giờ hãy làm cho mọi thứ thú vị hơn một chút:

f = open("/etc/hosts")
rdd = sc.parallelize(range(100))
rdd = rdd.map(lambda x: f.read())
rdd.collect()
f.close()

Bùng nổ! Lỗi lạ trong mô-đun serialization! Điều vừa xảy ra là chúng tôi đã cố gắng vượt qua f, đó là một đối tượng tập tin, cho công nhân. Rõ ràng, đối tượng tệp là một điều khiển dữ liệu cục bộ và do đó không thể được gửi đến các máy khác.


Vì vậy, những gì xảy ra trong mã cụ thể của bạn? Không có dữ liệu thực tế và biết định dạng bản ghi, tôi không thể gỡ lỗi hoàn toàn, nhưng tôi đoán vấn đề đó xuất phát từ dòng này:

def vectorizer(text, vocab=vocab_dict):

Trong Python, các đối số từ khóa được khởi tạo khi hàm được gọi lần đầu tiên. Khi bạn gọi sc.parallelize(...).map(vectorizer)ngay sau định nghĩa của nó, vocab_dictcó sẵn tại địa phương , nhưng nhân viên từ xa hoàn toàn không biết gì về nó. Do đó, hàm được gọi với ít tham số hơn dự kiến ​​sẽ dẫn đến __init__() takes exactly 3 arguments (2 given)lỗi.

Cũng lưu ý rằng bạn theo mô hình sc.parallelize(...)...collect()cuộc gọi rất xấu . Trước tiên, bạn trải bộ sưu tập của mình ra toàn bộ cụm, thực hiện một số tính toán và sau đó kéo kết quả. Nhưng gửi dữ liệu qua lại là khá vô nghĩa ở đây. Thay vào đó, bạn chỉ có thể thực hiện các tính toán này cục bộ và chỉ chạy các quy trình song song của Spark khi bạn làm việc với các bộ dữ liệu thực sự lớn (như bạn chính amazon_dataset, tôi đoán vậy).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.