2016-03-22 11 views
6

Tôi đang làm việc trên dự án phát trực tuyến Scala (2.11)/Spark (1.6.1) và sử dụng mapWithState() để theo dõi dữ liệu đã xem từ các đợt trước.Bản đồ SparkWithState xáo trộn tất cả dữ liệu đến một nút

Trạng thái được chia thành 20 phân vùng, được tạo bằng StateSpec.function(trackStateFunc _).numPartitions(20). Tôi đã hy vọng phân phối trạng thái trong toàn bộ cụm, nhưng có vẻ như mỗi nút giữ trạng thái hoàn chỉnh và việc thực hiện luôn được thực hiện chỉ một nút chính xác.

Locality Level Summary: Node local: 50 được hiển thị trong giao diện người dùng cho từng lô và lô hoàn chỉnh là ngẫu nhiên đọc. Sau đó, tôi viết thư cho Kafka và các phân vùng được lan truyền lại trên cụm. Tôi dường như không thể tìm ra lý do tại sao mapWithState() cần phải được chạy trên một nút duy nhất. Điều này không làm hỏng khái niệm phân vùng trạng thái nếu nó bị giới hạn bởi một nút thay vì cụm hoàn chỉnh? Không thể phân phối trạng thái bằng khóa?

+0

Tôi nghĩ bạn nên thêm DAG tia lửa của mình và thêm chi tiết hơn một chút về các loại bạn đang sử dụng với 'mapWithState'. –

Trả lời

2

tôi dường như không thể tìm ra lý do tại sao mapWithState cần phải được chạy trên một nút đơn

Nó không. Spark theo mặc định sử dụng một số HashPartitioner để phân chia khóa của bạn giữa các nút công nhân khác nhau trong cụm của bạn. Nếu vì một lý do nào đó bạn thấy tất cả dữ liệu của mình được lưu trữ trên một nút khác, hãy kiểm tra sự phân bố các khóa của bạn. Nếu đây là đối tượng tùy chỉnh bạn đang sử dụng làm khóa, hãy đảm bảo phương thức hashCode được triển khai đúng cách. Điều này có thể xảy ra nếu có sự cố với phân phối khóa. Nếu bạn muốn thử nghiệm điều này, hãy thử sử dụng các số ngẫu nhiên làm khóa của bạn và tìm kiếm giao diện người dùng Spark và xem liệu hành vi này có thay đổi hay không.

Tôi đang chạy mapWithState và dữ liệu đến được phân đoạn dựa trên khóa, vì tôi cũng có cuộc gọi phương thức reduceByKey trước khi giữ trạng thái và khi xem tab Storage trên giao diện người dùng Spark, tôi có thể thấy RDD khác nhau được lưu trữ trên các nút công nhân khác nhau trong cụm.

+0

Dữ liệu của tôi được phân chia bằng phát trực tiếp bằng khóa qua kafka nhưng tôi có cùng một vấn đề. Bạn có nhớ mở rộng câu trả lời của mình không? Làm cách nào để truy cập/chỉnh sửa trình phân hoạch băm và cách bạn áp dụng reduceByKey trước khi ghi vào cơ sở dữ liệu? – Andreas

+0

@Andreas Bạn đang gặp phải vấn đề gì? Phân chia thiên vị? –

+0

Cảm ơn bạn đã trả lời, tôi muốn tìm hiểu cách kiểm soát phân vùng từ khóa cho cả kafka và spark, như trong vấn đề của tôi, dữ liệu không cần phải xáo trộn. Trong thực tế, tôi quan sát sự xáo trộn, vì hàm băm được áp dụng cho khóa phức hợp của tôi sẽ gửi dữ liệu đi. Chi tiết về vấn đề của tôi bên dưới. – Andreas

0

Bạn đang chạy tia lửa trên cụm chế độ -deploy-mode? hãy kiểm tra xem.

Cũng đảm bảo rằng bạn đang cài đặt --num-executors 20 --executor-core 10 vì trừ khi bạn chạy với phân bổ động theo mặc định, nó sẽ gán 2 người thực thi.

Các vấn đề liên quan