2012-09-01 32 views
9

của Amazon Tôi đang tìm cách chuyển đổi một thư mục lớn các hình ảnh có độ phân giải cao (vài triệu) thành các hình thu nhỏ bằng cách sử dụng Python. Tôi có một bảng DynamoDB lưu trữ vị trí của mỗi hình ảnh trong S3.Viết một hàng đợi phân tán trong DynamoDB

Thay vì xử lý tất cả các hình ảnh này trên một trường hợp EC2 (sẽ mất vài tuần), tôi muốn viết một ứng dụng được phân phối bằng cách sử dụng một loạt các phiên bản.

Tôi có thể sử dụng các kỹ thuật nào để viết hàng đợi cho phép nút "kiểm tra" hình ảnh từ cơ sở dữ liệu, thay đổi kích thước và cập nhật cơ sở dữ liệu với kích thước mới của hình thu nhỏ được tạo?

Cụ thể là tôi lo lắng về nguyên tử và đồng thời - làm cách nào để ngăn hai nút kiểm tra cùng một công việc cùng lúc với DynamoDB?

Trả lời

10

Một cách tiếp cận bạn có thể thực hiện sẽ là sử dụng Amazon's Simple Queue Service(SQS) kết hợp với DynamoDB. Vì vậy, những gì bạn có thể làm là viết tin nhắn vào hàng đợi có chứa một cái gì đó giống như khóa băm của mục nhập hình ảnh trong DynamoDB. Mỗi trường hợp sẽ định kỳ kiểm tra hàng đợi và lấy tin nhắn. Khi một cá thể lấy một tin nhắn ra khỏi hàng đợi, nó sẽ trở thành vô hình đối với các trường hợp khác trong một khoảng thời gian nhất định. Sau đó, bạn có thể tra cứu và xử lý hình ảnh và xóa thông báo khỏi hàng đợi. Nếu vì một số lý do xảy ra lỗi khi xử lý hình ảnh, thông báo sẽ không bị xóa và nó sẽ hiển thị đối với các trường hợp khác để lấy.

Cách tiếp cận khác, có lẽ phức tạp hơn, là sử dụng conditional update mechanism của DynamoDB để triển khai sơ đồ khóa. Ví dụ, bạn có thể thêm một cái gì đó một thuộc tính 'beingProcessed' vào mô hình dữ liệu của bạn, đó là 0 hoặc 1. Điều đầu tiên một thể hiện có thể làm là thực hiện cập nhật có điều kiện trên cột này, thay đổi giá trị thành 1 iff giá trị ban đầu là 0. Có thể nhiều hơn để làm ở đây xung quanh làm cho nó một cơ chế khóa thích hợp/mạnh mẽ ....

+0

DynamoDB là công cụ sai cho công việc. Quá trình này rất đơn giản w/SQS. 1.DynamoDB = LargeImageLocations> SQS; SQS = Process> n * EC2 = UpdateLocation> DynamoDB –

+1

Câu "SQS có một cơ chế được xây dựng để ngăn chặn nhiều trường hợp đọc cùng một thông điệp" là một chút gây hiểu nhầm. Không có bảo đảm "một lần duy nhất". Tôi thấy bạn mô tả một giải pháp khóa với DynamoDB, nhưng tốt hơn loại bỏ câu lệnh trên. –

+0

Lưu ý rằng SQS không tuân thủ HIPAA, vì vậy nstehr gợi ý có thể là giải pháp khả thi nếu bạn không được phép lưu trữ một số thông tin nhất định trong thông điệp SQS. –

0

Cách tiếp cận tốt/mát mẻ là sử dụng EMR cho việc này. Có một lớp liên kết trong EMR để kết nối HIVE với DynamoDB. Sau đó bạn có thể đi qua Bảng của bạn gần như bạn làm với một bảng SQL và thực hiện các hoạt động của bạn.

Có một hướng dẫn tốt đẹp cho nó đây: http://docs.amazonwebservices.com/amazondynamodb/latest/developerguide/EMRforDynamoDB.html

Nó cho nhập khẩu/xuất khẩu nhưng có thể dễ dàng thích nghi.

2

Sử dụng khóa lạc quan của DynamoDB với phiên bản sẽ cho phép nút "kiểm tra" một công việc bằng cách cập nhật trường trạng thái thành "InProgress". Nếu một nút khác đã thử kiểm tra cùng một công việc bằng cách cập nhật trường trạng thái, nó sẽ nhận được một lỗi và sẽ biết để lấy một công việc khác.

http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/JavaVersionSupportHLAPI.html

Tôi biết đây là một câu hỏi cũ, vì vậy câu trả lời này là hơn đối với cộng đồng hơn các poster ban đầu.

+0

Sử dụng dynamo theo cách này dẫn đến các vấn đề nếu quá trình của bạn chết giữa chừng và cờ tiến trình không bao giờ bị xóa. – Chaos

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