2012-11-12 48 views
6

tôi đang làm việc trên một ứng dụng nodejs kết hợp với riak/riak-js và chạy vào các vấn đề sau đây:Riak thất bại trong các truy vấn MapReduce. Cấu hình nào sẽ sử dụng?

Chạy yêu cầu này

db.mapreduce 
    .add('logs') 
    .run(); 

corretly trả về tất cả 155.000 mục lưu trữ trong các bản ghi xô với họ ID:

[ 'logs', '1GXtBX2LvXpcPeeR89IuipRUFmB' ], 
[ 'logs', '63vL86NZ96JptsHifW8JDgRjiCv' ], 
[ 'logs', 'NfseTamulBjwVOenbeWoMSNRZnr' ], 
[ 'logs', 'VzNouzHc7B7bSzvNeI1xoQ5ih8J' ], 
[ 'logs', 'UBM1IDcbZkMW4iRWdvo4W7zp6dc' ], 
[ 'logs', 'FtNhPxaay4XI9qfh4Cf9LFO1Oai' ], 
.... 

Nếu tôi chỉ định một bản đồ-Funktion và chỉ sử dụng một vài trong số các mục trong xô đăng

db.mapreduce 
    .add([['logs', 'SUgJ2fhfgyR2WE87n7IVHyBi4C9'], ['logs', 'EMtywD1UFnsq9rNRuINLzDsHdh2'], ['logs', 'ZXPh5ws8mOdASQFEtLDk8CBRn8t']]) 
    .map(function(v) {return ["asd"]; }) 
    .run(); 

tất cả mọi thứ đang làm việc tốt và sau đây, sản lượng dự kiến ​​sẽ được trả về:

[ 'asd', 'asd', 'asd' ] 

Nếu tôi bây giờ muốn riak để lập bản đồ tất cả các mục (khoảng 155.000 tài liệu json nhỏ) trong xô "nhật ký"

db.mapreduce  
    .add('logs') 
    .map(function(v) {return ["asd"]; })  
    .run(); 

tôi chỉ nhận được lỗi:

{ [Error: [object Object]] message: '[object Object]', statusCode: 500 } 

gì xảy ra ở đây? Trong Lỗi-đối tượng không có gì hữu ích được viết.

Cập nhật: Các riak-console nói nhiều lần như sau:

[notice] JS call failed: All VMs are busy. 

Sau incrementing map_js_vm_count trong riaks app.config đến 36, thông điệp biến thành:

[error] Pipe worker startup failed:fitting was gone before startup 

Links: Basho Labs Riak Driver riak-js

Trả lời

4

Bryan từ basho.com đã trả lời câu hỏi của tôi:

Xin chào, Cornelius. Bạn có thể mô tả một chút, cấu hình Riak của bạn? Cụ thể, có bao nhiêu nút trong cụm của bạn và ring_creation_size từ bạn app.config là gì?

Nếu, ví dụ: bạn đang sử dụng thiết lập mặc định {ring_creation_size, 64} trên cụm phát triển một nút, hành vi này rất có thể xảy ra. 155.000 mục là đủ để có được tất cả 64 vnodes hoạt động.

Trong trường hợp đầu tiên, trước khi tăng map_js_vm_count, 64 mã vnode đó chỉ chống lại 8 máy ảo Javascript và do đó một số có khả năng bị bỏ đói đủ lâu để hết thời gian chờ, điều này sẽ khiến thông báo nhật ký "Tất cả máy ảo bận" .

Trong trường hợp thứ hai, sau khi tăng map_js_vm_count, có khả năng 36 máy ảo Javascript đó không thể xử lý tất cả 155.000 mục trước khi hết thời gian truy vấn. Thông báo đăng nhập "đã bị gỡ bỏ trước khi khởi động" đang nói rằng đường ống đang chạy truy vấn bị tắt trong khi vẫn có các đầu vào đến vnodes.

Bạn không thấy một trong các hành vi này trong trường hợp đơn giản mà không có chức năng bản đồ vì không có tương tác với máy ảo Javascript là bắt buộc. Ngoài ra, trong trường hợp đó, các đối tượng thậm chí không được đọc hết đĩa, tiếp tục giảm bớt tranh chấp tài nguyên.

Hai giải pháp cấu hình mà tôi mong đợi sẽ giúp ích nhiều nhất là giảm ring_creation_size và tăng thời gian chờ truy vấn. Giảm ring_creation_size xuống 16, hoặc thậm chí 8 trên một cụm nút đơn sẽ gây ra ít tranh chấp cho các máy ảo Javascript vì sẽ có ít nỗ lực song song trong xử lý chức năng bản đồ. Tăng thời gian chờ truy vấn (nên là một đối số cho hàm 'chạy' hoặc tương tự, nhưng tôi không quen với máy khách riak-js), sẽ cho truy vấn thêm thời gian để hoàn thành trước khi tắt, có thể cần thiết để khắc phục quá trình xử lý chậm.

Viết lại chức năng bản đồ của bạn trong Erlang cũng sẽ hữu ích, vì nó sẽ nhanh hơn và sẽ không có cùng loại tranh chấp VM. Nhưng, tôi hiểu, điều đó không dễ sử dụng trong giai đoạn phát triển ban đầu.

HTH, Bryan

+1

Hi Bryan, cảm ơn vì câu trả lời tuyệt vời của bạn, nó giúp rất nhiều cho một sự hiểu biết sâu sắc hơn về riak. Bạn nói đúng, tôi đang sử dụng cụm phát triển mặc định một nút. Sau khi giảm kích thước vòng xuống 8 như bạn đã đề cập, mọi thứ đều hoạt động tốt. –