2011-02-03 33 views
9

Hi có tại SO,Hadoop (+ HBase/HDFS) vs Mysql (hoặc Postgres) - Tải về, dữ liệu có cấu trúc độc lập để được xử lý và truy vấn

Tôi muốn một số ý tưởng/ý kiến ​​về sau từ bạn đáng kính và đáng kính.

Tôi có một bản ghi 100M mà tôi cần xử lý. Tôi có 5 nút (trong một cụm đá) để làm điều này. Dữ liệu rất có cấu trúc và rơi độc đáo trong mô hình dữ liệu quan hệ. Tôi muốn làm những việc song song vì quá trình xử lý của tôi mất một thời gian.

Như tôi thấy, tôi có hai lựa chọn chính:

Cài đặt mysql trên mỗi nút và đặt 20 triệu bản ghi trên mỗi nút. Sử dụng nút đầu để ủy quyền truy vấn cho các nút và tổng hợp kết quả. Khả năng truy vấn ++, nhưng tôi có thể gặp phải một số vấn đề đau đầu khi tôi chọn chiến lược phân vùng, vv (Q. Đây có phải là những gì họ gọi là cụm mysql/postgres không?). Phần thực sự xấu là việc xử lý các hồ sơ được để lại cho tôi bây giờ để chăm sóc (làm thế nào để phân phối trên các máy vv) ...

Hoặc cài đặt Hadoop, Hive và HBase (lưu ý rằng điều này có thể không cách hiệu quả nhất để lưu trữ dữ liệu của tôi, vì HBase là cột định hướng) và chỉ xác định các nút. Chúng tôi viết tất cả mọi thứ trong mô hình MapReduce và, bang, chúng tôi sống hạnh phúc mãi mãi. Vấn đề ở đây là chúng tôi mất khả năng truy vấn "thời gian thực" (tôi biết bạn có thể sử dụng Hive, nhưng điều đó không được đề xuất cho các truy vấn thời gian thực - mà tôi cần) - vì tôi cũng có một số truy vấn sql bình thường để thực thi vào các thời điểm " chọn * từ rượu vang nơi màu = 'nâu' ".

Lưu ý rằng về lý thuyết - nếu tôi có 100M máy, tôi có thể thực hiện toàn bộ ngay lập tức vì mỗi bản ghi xử lý độc lập với nhau. Ngoài ra - dữ liệu của tôi là chỉ đọc. Tôi không dự tính bất kỳ cập nhật nào xảy ra. Tôi không cần/muốn 100 triệu bản ghi trên một nút. Tôi không muốn có dữ liệu dư thừa (vì có nhiều dữ liệu) vì vậy hãy giữ nó trong cả mysql/postgres và Hadoop/HBase/HDFS. không phải là một lựa chọn thực sự.

Nhiều Cảm ơn

+0

Một người bạn của tôi đã đăng cho tôi một cái gì đó như thế này: http://www.cloudera.com/blog/2009/03/database-access-with-hadoop/ đó là một bước nhỏ đi đúng hướng - nhưng tôi muốn nghe ý kiến ​​của bạn về thiết kế và cách tôi nên nói về nó ... – MalteseUnderdog

Trả lời

1

HI,

tôi đã có một tình huống mà tôi đã có nhiều bảng mà tôi tạo ra song song sử dụng SQLAlchemy và thư viện python đa xử lý. Tôi có nhiều tệp, mỗi tệp một bảng và tải chúng bằng các quy trình COPY song song. Nếu mỗi tiến trình tương ứng với một bảng riêng biệt, thì nó hoạt động tốt. Với một bảng, việc sử dụng COPY sẽ rất khó khăn. Bạn có thể sử dụng phân vùng bảng trong PostgreSQL, tôi đoán vậy. Nếu bạn quan tâm tôi có thể cung cấp thêm chi tiết.

Trân trọng.

2

Có một vài câu hỏi để hỏi trước khi đề xuất.
Bạn có thể xây dựng truy vấn của mình chỉ để truy cập bằng khóa chính không? Nói cách khác - nếu bạn có thể tránh tất cả các phép nối và quét bảng. Nếu vậy - HBase là một lựa chọn, nếu bạn cần tốc độ đọc/ghi rất cao.
Tôi không quan tâm đến việc Hive là lựa chọn tốt khi xem xét khối lượng dữ liệu thấp. Nếu bạn mong đợi chúng phát triển đáng kể - bạn có thể xem xét nó. Trong mọi trường hợp, Hive là tốt cho khối lượng công việc phân tích - không phải cho loại xử lý OLTP.
Nếu bạn cần mô hình quan hệ với các phép nối và quét - tôi nghĩ giải pháp tốt có thể là một nút chính và 4 nô lệ, với sự sao chép giữa chúng. Bạn sẽ trực tiếp tất cả các ghi vào tổng thể, và cân bằng đọc trong toàn bộ cụm. Nó đặc biệt tốt nếu bạn có nhiều lần đọc hơn sau đó viết.
Trong lược đồ này, bạn sẽ có tất cả 100 triệu bản ghi (không khớp) trên mỗi nút. Trong mỗi nút, bạn có thể sử dụng phân vùng nếu thích hợp.

8

Bạn có thể chứng minh rằng MySQL là nút cổ chai không? 100 triệu bản ghi không nhiều và có vẻ như bạn không thực hiện các truy vấn phức tạp. Không biết chính xác loại xử lý nào, dưới đây là những gì tôi sẽ làm, theo thứ tự sau:

  1. Giữ 100M trong MySQL. Hãy xem tiện ích Sqoop của Cloudera để nhập các bản ghi từ cơ sở dữ liệu và xử lý chúng trong Hadoop.
  2. Nếu MySQL là nút cổ chai trong (1), hãy xem xét thiết lập sao chép nô lệ, điều này sẽ cho phép bạn song song lượt đọc mà không có sự phức tạp của cơ sở dữ liệu bị phân loại. Vì bạn đã tuyên bố rằng bạn không cần viết lại cơ sở dữ liệu, nên đây là giải pháp khả thi. Bạn có thể sao chép dữ liệu của mình tới nhiều máy chủ nếu cần.
  3. Nếu bạn đang chạy truy vấn chọn phức tạp từ cơ sở dữ liệu, và (2) vẫn không khả thi, hãy xem xét sử dụng Sqoop để nhập bản ghi của bạn và thực hiện bất kỳ biến đổi truy vấn nào bạn yêu cầu trong Hadoop.

Trong trường hợp của bạn, tôi sẽ chống lại sự cám dỗ để thoát khỏi MySQL, trừ khi điều đó là hoàn toàn cần thiết.

1

Bạn cũng có thể xem xét sử dụng Cassandra. Gần đây tôi đã phát hiện ra bài viết này trên HBase vs. Cassandra mà tôi đã được nhắc nhở khi tôi đọc bài đăng của bạn.

Ý chính của nó là Cassandra là giải pháp NoSQL đáng sợ cao với truy vấn nhanh, loại âm thanh như giải pháp bạn đang tìm kiếm.

Vì vậy, tất cả phụ thuộc vào việc bạn có cần duy trì mô hình quan hệ của mình hay không.

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