• 세븐 데이터베이스라는 책을 읽으면서 다양한 유형의 NoSQL을 설치하고 사용해보고 있다.

  • 맵 리듀스는 분산된 여러 노드에 걸쳐서 병행으로 작업을 실행하기 위한 알고리즘 프레임워크이다. 장애에 대응 가능한 파티션된 데이터 스토어에서 커스텀 쿼리를 실행하는데 유용한 도구가 되었다.

  • 맵 리듀스는 두 부분으로 나누어서 처리되는데 첫 번재 부분에서는 map() 함수를 사용하여 데이터 리스트 (데이터들이 저장된 자료 구조)를 다른 타입의 리스트로 변환한다.

  • 그리고 둘째 부분에서는 reduce() 함수를 이용하여 변환된 데이터 리스트를 하나 이상의 스칼라 값들로 변환한다. 이런 형태로 처리함으로써 시스템에서는 각 작업들을 더 작은 컴포넌트들로 쪼개어 대규모 서버 클러스터에 결처서 병렬로 실행시킬 수 있다.

예시


map = function (v) {
  var parsedData = JSON.parse(v.values[0].data);
  if (parsedData.country == 'CA')
      return [{count : 1}];
  else
      return [{count: 0}];
}

reduce = function(mappedVals) {
  var sums = {count : 0};
  for (val i in mappedVals) {
      sums[count] += mappedVals[i][count];
  }
  return [sums];
}
  • 일치하는 문서는 {count: 1}로 연관시켜서 모든 카운트들의 계산을 축약 시킴으로써 {country: 'CA'}를 포함하는 값들의 합계를 구할 수 있다.

  • 데이터베이스에서는 모든 결과를 애플리케이션 서버에 전송하고, 애플리케이션 서버의 코드에서 데이터의 합산과 같은 어떤 액션을 수행하는게 일반적이다.

  • 맵 리듀스는 반대의 방법으로 실행된다. 데이터베이스로부터 데이터를 알아내서 클라이언트에서 실행하는 대신에, 맵 리듀스는 모든 데이터베이스 노드에게 데이터 처리 알고리즘을 전달한다. 그리고 각 노드는 그 알고리즘의 결과를 반환하는 책임을 갖는다.

  • 이때 서버의 각 객체(데이터)는 데이터를 모아서 그룹화하는 어떤 공통적인 키에 맵(연관) 처리 된다. 그리고 일치되는 모든 키들은 어떤 단일의 값으로 리듀스(축약) 된다.

  • 이는 각 서버에서 알고리즘을 데이터로 전송한 다음에 반환된 데이터를 다른 서버의 알고리즘에 전송하는 것이 더 빠르기 때문이다.

Riak 에서의 맵 리듀스


curl -X POST -H "content-type:application/json" \
http://localhost:10018/mapred --data @-
{
    "inputs": [
        ["rooms", "101"],
        ["rooms", "102"],
        ["rooms", "103"]
    ],
    "query": [{
                "map": {
                "language": "javascript",
                "source": "function(v) {
                    var parsed_data = JSON.parse(v.values[0].data);
                    var data = {};
                    data[parsed_data.style] = parsed_data.capacity;
                    return [data];
                }"
        }
    }]
}
  • 위의 코드는 Riak 에서 맵 처리를 하는 모습이다..
curl - X POST - H "content-type:application/json"\
http: //localhost:10018/mapred --data @-
    {
        "inputs": "rooms",
        "query": [{
                "map": {
                    "language": "javascript",
                    "bucket": "my_functions",
                    "key": "map_capacity"
                }},
                {
                    "reduce": {
                        "language": "javascript",
                        "source": "function(v) {
                            var totals = {};
                            for (var i in v) {
                                for (var style in v[i]) {
                                    if (totals[style]) totals[style] += v[i][style];
                                    eles totals[style] = v[i][style];
                                }
                            }
                            return [totals];
                        }"
                }
            }]
    }

키필터


  • 최근에 추가된 것이 키필터라는 개념이다. 키필터는 맵 리듀스 실행 전에 각 키를 필터링 하는 명령어들의 모음이다. 키 필터는 원하지 않는 값을 맵 리듀스 하지 않게 도와주는 역할을 한다.

  • 맵 리듀스는 데이터를 그룹으로 묶어서 어떤 중요한 분석을 수행할 수 있는 강력한 도구이다.

일관성과 지속성


  • 리액 서버 아키텍처에서는 단일 지점 장애가 생기지 않도록 한다 (즉, 모든 노드가 주종 관계가 없이 동등하다.) 그리고 서버 노드들이 연결된 클러스터를 원하는 대로 늘리거나 줄일 수 있게 해준다. 이것은 대규모의 분산 처리 시 중요하다. 설사 몇몇 노드에 장애가 생겨서 반응이 없을지라도 우리 데이터베이스를 항상 가용한 상태로 유지하기 때문이다.

  • 다수의 서버에 걸치는 데이터분산은 내재된 문제점을 가지고 있다. 만일 네트워크의 분할이 생길 때 우리 데이터베이스가 계속 실행되기를 원한다면 (즉 일부 메시지들이 유실된다면) 타협을 해야한다.

  • 이러한 경우 서버에 대한 요청을 가용한 (Available) 상태로 두거나, 또는 요청을 거절하고 우리 데이터의 일관성 (Consistency)를 보장하게 할 수 있다. 일관성과 가용성 및 분할 장애 대응 (Partition tolerance) 모두가 완벽하게 가능한 분산 데이터베이스 생성은 불가능하다. 이러한 세 가지 특성 중 두 개만 함께 가질 수 있다. (분할 장애 대응과 일관성, 분할 장애 대응과 가용성, 또는 일관성과 가용성이 있지만 분산되지 않음)

  • 이것을 CAP(일관성 (Consistency), 가용성 (Availalbity), 분할 장애 대응 (Partition tolerance)) 원리라고 한다.

참고 문헌


>> Home