2013-08-29 82 views
18

Tôi biết rằng có những câu hỏi tương tự như này, chẳng hạn như:Làm rõ trường hợp sử dụng cho Hadoop so với RabbitMQ + Cần tây

nhưng tôi đang yêu cầu này bởi vì tôi đang tìm kiếm một sự khác biệt đặc biệt hơn được hỗ trợ bởi một vài ví dụ về trường hợp sử dụng.

Vì vậy, tôi là một người dùng python ai muốn làm chương trình hoặc/cả:

  1. Are quá lớn để
  2. Đi quá lâu để

làm trên một máy đơn và xử lý chúng trên nhiều máy. Tôi đã quen thuộc với gói đa xử lý (một máy) trong python, và tôi viết mã kiểu mapreduce ngay bây giờ. Tôi biết rằng chức năng của tôi, ví dụ, dễ dàng song song.

Trong hỏi thông thường của tôi thông minh CS lời khuyên-givers, tôi đã phrased câu hỏi của tôi là:

"Tôi muốn có một công việc, chia nó thành một loạt các nhiệm vụ nhỏ được thực hiện đồng thời trên một loạt các máy móc, sau đó các kết quả đó sẽ được tổng hợp và xử lý theo một số chức năng khác, có thể là giảm hoặc có thể là hướng dẫn để thêm vào cơ sở dữ liệu vào một cơ sở dữ liệu chẳng hạn. "

Theo phân tích này trong trường hợp sử dụng của tôi, tôi nghĩ rằng tôi cũng có thể sử dụng Hadoop hoặc một bộ công nhân Celery + nhà môi giới RabbitMQ. Tuy nhiên, khi tôi hỏi những người đưa ra nhà hiền triết, họ trả lời tôi như thể tôi hoàn toàn điên rồ khi nhìn Hadoop và Celery như những giải pháp có thể so sánh được. Tôi đã đọc một chút về Hadoop, và cũng về Celery --- Tôi nghĩ rằng tôi có một nắm bắt khá tốt về những gì cả hai làm --- những gì tôi dường như không hiểu là:

  1. Tại sao họ được coi là riêng biệt, quá khác biệt?
  2. Cho rằng chúng dường như được nhận như những công nghệ hoàn toàn khác nhau --- theo cách nào? Các trường hợp sử dụng phân biệt trường hợp nào với nhau hoặc tốt hơn cho trường hợp khác?
  3. Vấn đề gì có thể được giải quyết với cả hai trường hợp, và khu vực nào sẽ đặc biệt ngu ngốc khi sử dụng cái này hay cái kia?
  4. Có cách nào tốt hơn, đơn giản hơn để có được chức năng Pool.map() đa xử lý giống như nhiều máy không? Hãy tưởng tượng vấn đề của tôi không bị hạn chế bởi dung lượng lưu trữ, mà bởi CPU và RAM cần thiết để tính toán, do đó không có vấn đề gì trong việc có quá ít không gian để giữ kết quả trả về từ người lao động. (ví dụ, tôi đang làm một cái gì đó giống như mô phỏng nơi tôi cần tạo ra nhiều thứ trên các máy nhỏ hơn bằng một giá trị từ cơ sở dữ liệu, nhưng chúng được giảm trước khi chúng trở về máy/cơ sở dữ liệu nguồn.)

Tôi hiểu Hadoop là tiêu chuẩn dữ liệu lớn, nhưng Celery cũng được hỗ trợ tốt; Tôi đánh giá cao rằng nó không phải là java (các python API streaming đã sử dụng cho hadoop nhìn không thoải mái với tôi), vì vậy tôi muốn được nghiêng để sử dụng tùy chọn Celery.

Trả lời

20
  1. Họ đều giống nhau ở chỗ cả hai thể giải quyết vấn đề mà bạn mô tả (map-giảm).Họ là khác nhau trong Hadoop đó là hoàn toàn xây dựng để giải quyết chỉ usecase và Celey/RabbitMQ được xây dựng để tạo điều kiện thực hiện nhiệm vụ trên các nút khác nhau bằng cách sử dụng thông điệp đi qua. Cần tây cũng hỗ trợ các giai đoạn khác nhau. Hadoop đang giải quyết vấn đề giảm bản đồ bằng cách có một hệ thống tập tin lớn và đặc biệt mà từ đó người lập bản đồ lấy dữ liệu của nó, gửi nó đến một loạt các nút bản đồ và giảm nó vào hệ thống tập tin đó. Điều này có lợi thế là nó thực sự nhanh chóng trong việc này. Nhược điểm là nó chỉ hoạt động trên đầu vào dữ liệu dựa trên văn bản, Python không thực sự được hỗ trợ và nếu bạn không thể thực hiện (một chút) các lần sử dụng khác nhau. Cần tây là một thực thi tác vụ dựa trên thông điệp. Trong đó bạn xác định các nhiệm vụ và nhóm chúng lại với nhau trong một quy trình làm việc (có thể là một luồng công việc map-reduce). Ưu điểm của nó là nó dựa trên python, bạn có thể khâu các tác vụ với nhau trong một luồng công việc tùy chỉnh. Nhược điểm là sự phụ thuộc của nó vào nhà môi giới/kết quả phụ trợ duy nhất và thời gian thiết lập của nó.

  2. Vì vậy, nếu bạn có một vài giá trị log của Gb và không quan tâm để viết bằng Java và có một số máy chủ để phụ tùng được sử dụng riêng để chạy Hadoop, hãy sử dụng nó. Nếu bạn muốn linh hoạt trong việc chạy các tác vụ công việc, hãy sử dụng Celery. Hoặc .....

  3. Có! Có một dự án mới từ một trong những công ty đã giúp tạo ra giao thức nhắn tin AMQP được sử dụng bởi RabbitMQ (và những người khác). Nó được gọi là ZeroMQ và phải mất phân phối tin nhắn/thực hiện để cấp độ tiếp theo bằng cách đi xuống một mức độ trừu tượng so với Celery. Nó định nghĩa các ổ cắm mà bạn có thể liên kết với nhau theo nhiều cách khác nhau để tạo ra các liên kết nhắn tin giữa các nút. Bất cứ điều gì bạn muốn làm với những tin nhắn này là tùy thuộc vào bạn để viết. Mặc dù điều này nghe có vẻ như "những gì tốt là một wrapper mỏng xung quanh một ổ cắm" nó thực sự là ở mức độ trừu tượng bên phải. Ngay bây giờ tại công ty chúng tôi, chúng tôi đang tiết lộ tất cả các tin nhắn cần tây của chúng tôi và xây dựng lại nó với ZeroMQ. Chúng tôi thấy rằng Celery chỉ là quá ý kiến ​​về cách nhiệm vụ nên được thực hiện và rằng các thiết lập/config nói chung là một nỗi đau. Ngoài ra, người môi giới ở giữa mà phải xử lý tất cả lưu lượng truy cập đã trở thành phần lớn của một nút cổ chai.

Tiếp tục:

  • Đếm lần xuất hiện của "the" trong một cuốn sách với càng ít lập trình càng tốt và rất nhiều thời gian thiết lập/config: Hadoop
  • Tạo Nhiệm vụ nguyên tử và có thể làm cho chúng hoạt động cùng với không nhiều lập trình và nhiều thời gian cài đặt/cấu hình: Celery
  • Kiểm soát hoàn toàn việc cần làm với thư của bạn và cách lập trình chúng hầu như không có thời gian thiết lập/cấu hình: ZeroMQ
  • Cơn đau không có thời gian cài đặt/cấu hình: Ổ cắm
+0

Tôi đang điều tra điều này và tôi tin rằng bạn nói đúng và điều này cực kỳ hữu ích. ZeroMQ là khá tuyệt vời cho đến nay. Đây là một nơi xốp kỳ lạ giữa máy tính phân tán và định tuyến thông điệp thích hợp, lập trình mạng. Vẫn cố gắng sắp xếp nó ra. – Mittenchops

+0

Tôi yêu ZeroMQ. Cảm ơn! – Mittenchops

+1

@Mittenchops Vui mừng vì đã thắng bạn. Phải mất một thời gian để đi qua các rào cản ban đầu, nhưng cũng có giá trị nó. – RickyA