2016-08-13 26 views
9

Tôi nhận được yêu cầu viết hàng loạt để nói 20 phím từ khách hàng. Tôi có thể ghi chúng vào C * trong một lô hoặc viết chúng theo cách không đồng bộ và đợi trong tương lai để hoàn thành chúng.Cassandra: Viết tối ưu hóa hàng loạt

Soạn thảo hàng loạt dường như không phải là tùy chọn goo theo tài liệu vì tỷ lệ chèn của tôi sẽ cao và nếu các khóa thuộc các điều phối viên phân vùng khác nhau sẽ phải làm thêm.

Có cách nào trong datastax lái xe java mà tôi có thể khóa nhóm có thể thuộc về cùng một phân vùng và sau đó câu lạc bộ chúng vào nhỏ lô và sau đó làm invidual unlogged batch ghi trong async. Trong đó cách tôi thực hiện các cuộc gọi rpc ít đến máy chủ tại cùng một điều phối viên sẽ phải viết cục bộ. Tôi sẽ sử dụng chính sách nhận biết mã thông báo.

Trả lời

7

Ý tưởng của bạn là đúng, nhưng không có cách tích hợp sẵn, bạn thường làm điều đó theo cách thủ công.

Quy tắc chính ở đây là sử dụng TokenAwarePolicy, do đó, một số điều phối sẽ xảy ra ở phía trình điều khiển. Sau đó, bạn có thể nhóm các yêu cầu của mình bằng sự bình đẳng của khóa phân vùng, có thể là đủ, tùy thuộc vào khối lượng công việc của bạn.

Ý tôi là gì bằng cách 'nhóm theo sự bình đẳng của khóa phân vùng`, ví dụ: bạn có một số dữ liệu trông giống như

MyData { partitioningKey, clusteringKey, otherValue, andAnotherOne } 

Sau đó, khi chèn một số đối tượng như vậy, bạn nhóm chúng theo MyData.partitioningKey. Đối với tất cả các giá trị paritioningKey, bạn lấy tất cả các đối tượng với cùng một partitioningKey và bọc chúng trong BatchStatement. Bây giờ bạn có một số BatchStatements, do đó, chỉ cần thực hiện chúng.

Nếu bạn muốn đi xa hơn và cassandra băm bắt chước, thì bạn nên nhìn vào siêu dữ liệu cụm qua getMetadata phương pháp trong com.datastax.driver.core.Cluster lớp, có phương pháp getTokenRanges và so sánh chúng với kết quả của Murmur3Partitioner.getToken hoặc bất kỳ phân vùng khác bạn đã cấu hình trong cassandra.yaml. Tôi chưa bao giờ thử bản thân mình.

Vì vậy, tôi khuyên bạn nên triển khai phương pháp tiếp cận đầu tiên và sau đó đánh giá ứng dụng của bạn. Tôi đang sử dụng cách tiếp cận đó cho bản thân, và khối lượng công việc của tôi hoạt động tốt hơn nhiều so với không có lô, cho phép các lô đơn lẻ mà không cần nhóm.

+0

Làm thế nào để phím batch để đi đến cùng nút ? - hiện dữ liệu khách hàng phơi bày các thẻ thuộc về mỗi nút, vì vậy tha tôi có thể murmurhash và sau đó nhóm chúng? – Peter

+0

Được trả lời bằng chỉnh sửa. – folex

+0

bạn có thể giải thích "bạn có thể nhóm các yêu cầu của bạn bằng sự bình đẳng của khóa phân vùng" hơn một chút không? Tôi không hiểu phần này – Peter

0

Đã đăng nhập lô nên được sử dụng cẩn thận trong Cassandra vì chúng áp dụng phí bổ sung. Nó cũng phụ thuộc vào phân phối khóa phân vùng. Nếu ghi số lượng lớn của bạn nhắm mục tiêu một phân vùng duy nhất thì sử dụng Kết quả hàng loạt không được yêu cầu trong một thao tác chèn đơn lẻ.

Nói chung, viết chúng invidually theo cách async có vẻ là một aproach tốt như chỉ ở đây: https://medium.com/@foundev/cassandra-batch-loading-without-the-batch-the-nuanced-edition-dd78d61e9885

Bạn có thể tìm mẫu mã trên trang web trên làm thế nào để xử lý nhiều async viết: https://gist.github.com/rssvihla/26271f351bdd679553d55368171407be#file-bulkloader-java https://gist.github.com/rssvihla/4b62b8e5625a805583c1ce39b1260ff4#file-bulkloader-java

EDIT:
xin vui lòng đọc thêm: https://inoio.de/blog/2016/01/13/cassandra-to-batch-or-not-to-batch/#14

Chi phí cho một phân đoạn duy nhất là bao nhiêu?

Không có nhật ký lô được ghi cho các lô phân đoạn duy nhất. Điều phối viên không có thêm bất kỳ công việc nào (đối với đa phân vùng viết) vì mọi thứ đều đi vào một phân vùng duy nhất. Đơn lô phân đoạn được tối ưu hóa: chúng được áp dụng với một đơn RowMutation [10].

Trong một vài từ: các phân vùng đơn lẻ không tải nhiều hơn nữa trên máy chủ so với ghi bình thường.


gì một chi phí đa phân vùng mẻ?

Hãy để tôi chỉ trích dẫn Christopher Batey, bởi vì ông đã tóm tắt này rất tốt trong bài của ông “Cassandra chống mẫu: lô Logged” [3]:

Cassandra [là lần đầu tiên] viết tất cả những điều khoản để nhật ký lô. lô nhật ký được nhân rộng thành hai nút khác trong trường hợp điều phối viên không thành công. Nếu điều phối viên thất bại thì một bản sao khác cho lô nhật ký sẽ tiếp quản. [..] Điều phối viên phải làm nhiều việc hơn bất kỳ nút nào khác trong cụm.

Một lần nữa, trong đạn gì đã được thực hiện:

  1. serialize các báo cáo hàng loạt
  2. viết lô serialized vào bảng hàng loạt hệ thống log
  3. lặp lại của hàng loạt serialized này để 2 nút
  4. tọa độ ghi vào các nút giữ các phân vùng khác nhau
  5. trên succe ss tháo hàng loạt serialized từ nhật ký hàng loạt (cũng trên 2 bản sao)

Hãy nhớ rằng lô unlogged cho nhiều phân vùng đang bị phản đối kể từ khi Cassandra 2.1.6