2012-11-12 2 views
6

:MapReduce 쿼리에서 Riak이 실패합니다. 어떤 구성을 사용합니까? 내가 riak/riak-JS 다음과 같은 문제로 실행과 함께에서 nodejs 응용 프로그램 작업입니다

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

이 corretly와 버킷 로그에 저장된 모든 155.000 항목을 반환 요청을 실행

자신의 아이디 :

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

내가지도 - Funktion을 지정하고 양동이에있는 항목 중 일부만을 사용하는 경우는

를 기록 619,483,210

모든 것이 잘 작동 다음과 같은 예상 출력이 반환됩니다

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

지금 riak이

db.mapreduce  
    .add('logs') 
    .map(function(v) {return ["asd"]; })  
    .run(); 
버킷의 "로그"의 모든 항목 (약 155.000 작은 JSON 문서 등)를 매핑하려면

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

여기에서 일어나지 않습니다

는 난 단지 오류가? 오류 객체에는 아무 것도 쓸 수 없습니다.

업데이트 :

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

링크 :

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

riaks에 map_js_vm_count를 증가 후 메시지로 변신, 36의 app.config : riak 콘솔은 다음과 같은 여러 번 말했다 Basho Labs Riak Driver riak-js

답변

4

basho.com의 Bryan이 내 질문에 답변했습니다 :

안녕하세요, 고넬료. Riak 구성에 대해 조금 설명해 주시겠습니까? 특히 클러스터에있는 노드 수와 app.config의 ring_creation_size는 무엇입니까?

예를 들어 한 노드 개발 클러스터에서 기본 설정 {ring_creation_size, 64}을 사용하는 경우이 동작이 발생할 가능성이 큽니다. 155,000 개의 항목으로 64 개의 모든 vnode를 작동시킬 수 있습니다.

첫 번째 경우 map_js_vm_count를 높이기 전에 해당 64 개의 노드가 단지 8 개의 자바 스크립트 VM을 사용하여 싸우므로 일부는 시간이 초과 될 정도로 오래 기다리게되어 "모든 VM이 사용 중입니다"라는 로그 메시지가 표시됩니다 .

두 번째 경우 map_js_vm_count를 높이면 36 개의 Javascript VM이 쿼리 시간 초과에 도달하기 전에 155,000 개의 항목을 모두 처리하지 못할 가능성이 높습니다. "시작 전에 피팅이 사라졌습니다"라는 로그 메시지는 vnode에 여전히 입력이 도착하는 동안 쿼리를 실행하는 파이프가 종료되었음을 나타냅니다.

Javascript VM과의 상호 작용이 필요하지 않으므로 맵 기능이없는 단순한 경우 이러한 동작 중 하나가 표시되지 않습니다. 또한이 경우 개체를 디스크에서 읽지 않아도 리소스 경합이 더욱 완화됩니다.

내가 예상하는 두 가지 구성 솔루션은 ring_creation_size를 낮추고 쿼리 제한 시간을 높이는 데 도움이됩니다. 단일 노드 클러스터에서 ring_creation_size를 16 또는 8로 낮추면 Javascript VM에 대한 경합이 줄어들며 맵 기능 처리시 병렬 처리가 덜 시도되기 때문입니다. 쿼리 시간 초과 ('run'함수 또는 이와 유사한 함수에 대한 인수 여야하지만 riak-js 클라이언트에 익숙하지 않음)를 설정하면 종료하기 전에 더 많은 시간을 종료해야합니다. 느린 처리를 극복하십시오.

Erlang에서 맵 기능을 다시 작성하는 것이 더 빠르며 동일한 종류의 VM 경합을 가지지 않으므로 도움이됩니다. 그러나 초기 단계 개발에서 사용하기 쉽지는 않습니다.

는 HTH는 브라이언

+1

안녕 브라이언, 당신의 훌륭한 답변을 주셔서 감사합니다, 그것은 riak의 깊은 지식을 많이 도왔다. 맞습니다. 기본 노드가 하나 인 개발 클러스터를 사용하고 있습니다. 링 크기를 8로 줄이면 모든 것이 잘됩니다. –

관련 문제