2013-04-14 1 views
0

어디서나 내가 읽었을 때, 사람들은 Riak의 MapReduce를 전체 버킷에 사용해서는 안되며 목표를 달성하는 다른 방법이 있다고 말합니다. 그래도 어떻게 확신 할 수 없어. 또한 전체 버킷을 사용하는 것이 왜 느린 지 명확하지 않습니다. 버킷이 하나만있는 경우 전체 시스템에서 모든 항목을 검토해야합니다.Riak MapReduce : 필드별로 항목 그룹화 + 다른 필드 합계

판매 데이터를 나타내는 500K + 문서 목록이 있습니다. 이 데이터를 여러 가지 방식으로보아야합니다. 예를 들어, 매월 영업 수익은 얼마나 많은가? 각 제품은 얼마나 많은 수익을 올렸습니까? 주어진 달에 얼마나 많은 제품이 판매 되었습니까? 저는 MapReduce가 이러한 유형의 집계 문제를 해결하는 데 능숙하다고 생각했기 때문에 MapReduce가 이미 모든 키를 가지고 있다면 혼란 스럽습니다.

내 문서는 모두 'sales'라는 버킷에 있으며 다음 필드가있는 레코드입니다. {"id":1, "product_key": "cyber-pet-toy", "price": "10.00", "tax": "1.00", "created_at": 1365931758}.

지난 4 년 동안 매월 각 제품의 총 수익 (기본적으로 전체 양동이)을보고해야하는 경우를 예로 들어 보겠습니다. Riak의 MapReduce를 사용하면 어떻게 효율적으로 수행 할 수 있습니까? 데이터에 ID 맵 작업을 사용하려고해도 MySQL이 처리하는 ~ 30 초 후에 시간 초과가 발생합니다.

Erlang (프로토콜 버퍼 클라이언트 사용)에서이 작업을 수행하고 있지만 설명을위한 언어는 충분합니다.

는 해당 SQL (MySQL은) 다음과 같습니다
SELECT SUM(price)       AS revenue, 
     FROM_UNIXTIME(created_at, '%Y-%m') AS month, 
     product_key 
    FROM sales 
GROUP BY month, product_key 
ORDER BY month ASC; 

는 (지금은하지 않는 것이 중요합니다 주문).

+0

좋아, 알겠지만, Riak은 실제로 많은 데이터를 처리하지 않습니다. 많은 예제를 통해 페이스 북 친구들의 그래프를 트래버스하고, 트윗을 많이 처리하는 등 믿을 수 있습니다.하지만 실제로 리크는 핵심 가치 스토어입니다. 실제로 MapReduce는 무의미합니다. 왜냐하면 실제로 수행하기 위해 클라이언트 쪽에서 할 수있는 적은 양의 데이터로 작업하기 때문입니다. 다른 MapReduce 데이터베이스를 비교해 보겠습니다. 일반적인 MapReduce 문제 일 수도 있습니다. – d11wtq

답변

1

현재 자주 검색해야하는 문서 속성에 대한 2 차 색인을 만들고이 훨씬 작은 하위 키 집합을 MapReduce 작업의 입력으로 사용합니다.

http://docs.basho.com/riak/latest/tutorials/Secondary-Indexes---Examples/

나는 내가 사용했던 다른 시스템에 비해,이 같은 큰 맵리 듀스 작업을 실행하는 데 매우 비싼 것 같다 동의한다.

+0

그래, 보조 인덱스가 나의 유스 케이스에 도움이 될 것이라고 생각하지 않는다. 우리가 포함하는 데이터를 모으려고하기 때문에 항상 전체 버킷이 필요하다. 2 차 인덱스는 문서를 찾는 데 도움이되지만 전체 버킷이 필요하면 그 값은 손실됩니다. 어느 쪽이든, 500K 레코드를 가진 Riak이 평범한 것 같아요.) MapReduce 지원은 실제로 오도하는 것입니다 ... 실현 가능한 옵션이되기 전에 데이터 클라이언트 측을 처리 할 수 ​​있습니다. – d11wtq

2

KV 저장소의 MapReduce는 SQL 데이터베이스처럼 작동하지 않습니다. 사용 사례에 도움이되는 몇 가지 사항이 있습니다. 두 개 이상의 버킷을 사용하십시오. Sales 버킷 대신 제품, 지역 또는 월별로 분류 할 수 있으므로 데이터가 이미 일반적인보고 기준 중 하나로 분리됩니다. 각 필드에 대해 각 문서에 보조 색인을 추가하는 것이 좋습니다. 따라서 월 쿼리는 created_at 인덱스의 범위 쿼리 일 수 있습니다. ID 필드가 순차적으로 증가하고 매월 데이터를 가져와야하는 경우 각 달의 시작 및 종료 ID를 별도의 키에 저장하십시오 (데이터를 작성한 후에는 쉽지 않습니다.). 또한 각 문서에 일련의 키를 구분할 수도 있습니다. 값에 대한 json 문서로 id 키를 저장하는 대신 id-productid, id-createdat, id-price와 같은 각 필드에 대한 키를 저장하십시오. 이렇게하면 MapReduce를 처리하기 위해 디스크에서 읽고 RAM에 저장해야하는 데이터의 양을 최소화 할 수 있습니다.

다음과 같이 생각해보십시오 : 나는 500K 개의 문서를 MySQL 데이터베이스에 가지고 있으며 각 문서는 json 문자열로 구성되어 있습니다. 내 데이터베이스는 Sales라는 이름의 단일 테이블과 내 문서를 이진 Blob로 저장하는 Data라는 단일 열로 구성됩니다. 어떻게하면 날짜가 포함 된 문서 만 선택하고 매월 그룹화하는 빠르고 효율적인 SQL 문을 작성할 수 있습니까?

요점은 내가 선택한 데이터 저장소의 강점에 따라 데이터 개체의 구조를 디자인해야한다는 것입니다. Riak은 solr과 같은 검색을 사용하지 않는 한 JSON을 처리하는 데 특히 효율적이지 않지만 처리 할 수있는 데이터를 재구성 할 수있는 방법이있을 수 있습니다. 또는 다른 데이터 저장소가 사용자의 요구에 더 잘 맞을 수도 있습니다.