Sau khi nói chuyện với một người bạn của tôi từ Google, tôi muốn triển khai một số kiểu Job/Worker để cập nhật tập dữ liệu của mình.Tôi có nên học/sử dụng MapReduce hoặc một số loại song song khác cho tác vụ này không?
Tập dữ liệu này phản ánh dữ liệu của dịch vụ bên thứ 3, do đó, để thực hiện cập nhật, tôi cần thực hiện một số cuộc gọi từ xa đến API của họ. Tôi nghĩ rằng rất nhiều thời gian sẽ được chi tiêu chờ đợi phản hồi từ dịch vụ bên thứ 3 này. Tôi muốn tăng tốc mọi thứ và tận dụng tốt hơn thời gian tính toán của mình, bằng cách song song các yêu cầu này và giữ cho nhiều người trong số họ mở cùng một lúc, khi họ chờ phản hồi cá nhân của họ.
Trước khi tôi giải thích số liệu cụ thể của tôi và nhận được vào vấn đề, tôi muốn làm rõ những gì câu trả lời tôi đang tìm:
- Đây có phải là một dòng chảy đó sẽ là rất phù hợp với parallelizing với MapReduce?
- Nếu có, điều này có hiệu quả về chi phí để chạy trên mô đun Mapreduce của Amazon, hóa đơn theo giờ và làm tròn giờ khi công việc hoàn tất? (Tôi không chắc chính xác số tiền được tính là "Công việc", vì vậy tôi không biết chính xác mình sẽ bị lập hoá đơn như thế nào)
- Nếu no, Có hệ thống/mẫu khác nào tôi nên sử dụng không? và Có thư viện nào giúp tôi làm điều này trong python (Trên AWS, EC2 + EBS)?
- Có bất kỳ vấn đề nào bạn thấy với cách tôi đã thiết kế quy trình công việc này không?
Ok, bây giờ vào các chi tiết:
Bộ dữ liệu bao gồm những người dùng có các mục yêu thích và những người đi theo những người dùng khác. Mục đích là để có thể cập nhật hàng đợi của từng người dùng - danh sách các mục mà người dùng sẽ thấy khi họ tải trang, dựa trên các mục yêu thích của người dùng mà cô ấy theo dõi. Tuy nhiên, trước khi tôi có thể thu thập dữ liệu và cập nhật hàng đợi của người dùng, tôi cần đảm bảo rằng tôi có dữ liệu cập nhật nhất, là nơi các cuộc gọi API đến.
Có hai cuộc gọi tôi có thể thực hiện :
- Get người dùng tiếp theo - trả về tất cả những người sử dụng bị theo dõi bởi người sử dụng yêu cầu, và
- Get mục yêu thích - trả về tất cả các mục yêu thích của người sử dụng yêu cầu.
Sau khi tôi gọi để người dùng được theo dõi cho người dùng được cập nhật, tôi cần cập nhật các mục yêu thích cho từng người dùng đang được theo dõi. Chỉ khi tất cả các mục yêu thích được trả lại cho tất cả người dùng được theo dõi, tôi có thể bắt đầu xử lý hàng đợi cho người dùng ban đầu đó. dòng chảy này trông giống như:
Jobs trong dòng này bao gồm:
- Bắt đầu cập nhật Queue cho người dùng - Khai mạc quá trình này bằng cách lấy những người sử dụng tiếp theo người dùng được cập nhật, lưu trữ chúng và sau đó tạo Nhận các yêu thích công việc cho mỗi người dùng.
- Nhận yêu thích cho người dùng - Yêu cầu và cửa hàng, danh sách mục yêu thích cho người dùng được chỉ định, từ dịch vụ của bên thứ 3.
- Tính hàng đợi mới cho người dùng - Xử lý hàng đợi mới, bây giờ tất cả dữ liệu đã được tìm nạp, sau đó lưu trữ kết quả trong bộ nhớ cache được lớp ứng dụng sử dụng.
Vì vậy, một lần nữa, câu hỏi của tôi là:
- Đây có phải là một dòng chảy đó sẽ là rất phù hợp với parallelizing với MapReduce? Tôi không biết nếu nó sẽ cho phép tôi bắt đầu quá trình cho UserX, lấy tất cả các dữ liệu liên quan, và trở lại để xử lý hàng đợi của UserX chỉ sau khi tất cả đã xong.
- Nếu có, điều này có hiệu quả về chi phí để chạy trên mô đun Mapreduce của Amazon, hóa đơn theo giờ và làm tròn giờ khi công việc hoàn tất? Có giới hạn về số lượng "chuỗi" mà tôi có thể chờ đợi trên các yêu cầu API mở nếu tôi sử dụng mô-đun của mình không?
- Nếu không, Tôi có nên sử dụng hệ thống/mẫu khác không? và Có thư viện nào giúp tôi thực hiện điều này trong python (Trên AWS, EC2 + EBS không?)?
- Có bất kỳ vấn đề nào bạn thấy với cách tôi đã thiết kế quy trình công việc này không?
Cảm ơn bạn đã đọc, tôi mong được thảo luận với tất cả các bạn.
Sửa, để đáp ứng với JimR:
Cám ơn bài trả lời rắn. Trong bài đọc của tôi kể từ khi tôi viết câu hỏi ban đầu, tôi đã từ bỏ việc sử dụng MapReduce. Tôi chưa quyết định chắc chắn cách tôi muốn xây dựng điều này, nhưng tôi bắt đầu cảm thấy MapReduce là tốt hơn cho việc phân phối/song song tải máy tính khi tôi thực sự chỉ tìm cách song song các yêu cầu HTTP.
Tác vụ "giảm" của tôi là gì, phần mất tất cả dữ liệu được tìm nạp và đưa dữ liệu vào kết quả, không phải là tính toán chuyên sâu. Tôi khá chắc chắn nó sẽ gió lên được một truy vấn SQL lớn thực hiện cho một hoặc hai giây cho mỗi người dùng.
Vì vậy, những gì tôi đang nghiêng về phía là:
- Một phi MapReduce Job/Worker mô hình, viết bằng Python . Một người bạn Google của tôi đã biến tôi thành học Python vì điều này là do chi phí thấp và quy mô tốt.
- Sử dụng Amazon EC2 làm lớp tính toán. Tôi nghĩ điều này có nghĩa là tôi cũng cần một lát EBS để lưu trữ cơ sở dữ liệu của mình.
- Có thể sử dụng hàng đợi Tin nhắn đơn giản của Amazon. Có vẻ như phụ tùng amazon thứ 3 này được thiết kế để theo dõi hàng đợi công việc, di chuyển kết quả từ một nhiệm vụ sang đầu vào của một công cụ khác và xử lý một cách duyên dáng các tác vụ không thành công. Nó rất rẻ. Có thể đáng thực hiện thay vì hệ thống xếp hàng công việc tùy chỉnh.
Tôi đã sử dụng công cụ ứng dụng của google cho các yêu cầu cao song song và xử lý thời gian thực gần với loại vấn đề này. MapReduce có chi phí khởi động và chu kỳ công việc cao hơn nhiều so với tôi đang tìm kiếm. – kevpie
Thú vị. Tôi biết công cụ ứng dụng có thể sử dụng python, đó là những gì tôi đã được homing trong ngày để viết những công việc này, nhưng tôi không rõ ràng về cách khác tôi muốn sử dụng GAE cho việc này. Tôi không quen thuộc với cách GAE hoạt động, cũng không phải với cách để cụm từ vấn đề này, vì vậy tôi đang ở một mất mát để tìm câu trả lời của tôi. Bạn có bất kỳ tài nguyên nào khác mà tôi nên xem xét ở đây không? Cảm ơn vì tiền hỗ trợ! –
Tôi thực sự đã viết một quá trình python sử dụng các luồng và xếp hàng để thực hiện các yêu cầu web song song và xử lý dữ liệu. Nó hoạt động tốt, nhưng tôi đã không "hoàn toàn thông thạo" trong lập trình python, hoặc chủ đề, để làm cho nó thực sự đáng tin cậy, hoặc thực hiện tốt. Sau rất nhiều googling, và một số thất vọng, và các nhiệm vụ khác cần ưu tiên - tôi từ bỏ làm việc trên đó. Tôi có thể nhặt nó lên một lần nữa. Tôi đã đi đến kết luận tương tự về làm việc với MapReduce, vì tôi sẽ không thực sự tận dụng bất cứ điều gì nhưng song song được xây dựng thành hadoop. Dù sao, nếu bạn muốn trò chuyện thêm về phương pháp tiếp cận và giải pháp, lmk! –