책너두 (데이터 중심 애플리케이션 설계) 37일차 (~434p)

요약

  • 맵리듀스를 넘어 일괄처리의 대안에 대한 내용을 이해함.
    • 중간 상태 구체화
      • 맵리듀스 작업은 중간 상태를 파일로 기록하는데 이를 구체화라고 함. 유닉스 파이프와 비교하여 맵리듀스의 중간 상태 구체화에는 여러 단점이 있음.
    • 그래프와 반복 처리
      • 그래프 처리는 웹 검색 엔진 순서 결정, 추천 엔진, 머신러닝, 랭킹 시스템에서 중요하게 사용됨.
      • 데이터플로 엔진은 비순환 방향 그래프(DAG)를 사용하여 작업의 연산자를 배열하는데, 이는 데이터 자체가 그래프 형식인 것과 다름.
      • 맵리듀스는 완료까지 반복하는 개념을 표현하기 어려워 반복적 스타일로 구현되는 그래프 처리 알고리즘이 필요함.
    • 고수준 API와 언어
      • 고수준 API와 언어는 분산 일괄 처리용 수행 엔진 발전과 함께 인기를 얻었음 .
      • 맵리듀스 작업 작성의 어려움 때문에 하이브, 피그, 캐스캐이딩, 크런치 등의 고수준 언어와 API가 등장함.
      • 이러한 API는 관계형 스타일의 연산을 사용하여 작업을 간소화하고 대화식 사용을 가능하게 함.
      • 이를 통해 개발자는 적은 코드로 작업을 수행하고, 사용자와 장비 수준에서 효율적으로 작업을 처리할 수 있음.

메모

맵리듀스를 넘어

  • 2000년대 후반, 맵리듀스는 인기를 끌었으나 과대 포장된 면이 있었음.
    • 분산 시스템에서 맵리듀스는 단지 하나의 프로그래밍 모델일 뿐이며, 다른 도구가 더 적합할 수 있음.
    • 그러나 맵리듀스는 분산 파일 시스템에서 간단하게 추상화된 모델로 학습하기 유용함.
  • 단순함은 사용하기 쉬운 의미가 아니라 이해하기 쉽다는 의미임.
    • 실제로 맵리듀스 원시 API로 복잡한 연산을 구현하는 것은 어려움.
    • 이로 인해 맵리듀스 상에서 추상화된 다양한 고수준 프로그래밍 모델(피그, 하이브, 캐스캐이딩, 크런치)이 등장함.
    • 이러한 모델들은 맵리듀스를 이해하면 배우기 쉽고, 일괄 처리 태스크를 구현하기 편리함.
  • 그러나 맵리듀스 실행 모델 자체에도 문제가 있어서, 추상화 단계를 올려도 성능 저하가 발생할 수 있음.
    • 하지만 맵리듀스는 견고하고, 대규모 데이터를 처리할 때 신뢰성이 높음.
    • 특정 유형의 처리에 대해서는 다른 도구들이 더 빠를 수 있음.
  • 이 장의 나머지 부분에서는 일괄 처리 방법의 대안을 살펴보고, 11장에서는 스트림 처리로 넘어간다.

중간 상태 구체화

  • 맵리듀스 작업은 독립적이며, 작업 간의 주요 접점은 분산 파일 시스템 상의 입력과 출력 디렉터리임.
    • 한 작업의 출력을 다른 작업의 입력으로 사용하려면, 디렉터리 설정과 외부 워크플로 스케줄러를 이용해야 함.
    • 대개 한 작업의 출력은 같은 팀 내 다른 작업의 입력으로만 사용되며, 분산 파일 시스템 상의 파일들은 중간 상태(Intermediate state)에 불과하다.
  • 중간 상태를 파일로 기록하는 과정을 구체화(materialization)라 함.
    • 반대로 유닉스 파이프는 중간 상태를 완전히 구체화하지 않고 작은 인메모리 버퍼를 사용해 출력을 입력으로 스트리밍함.
  • 맵리듀스 접근법은 중간 상태를 완전히 구체화하는데, 유닉스 파이프에 비해 여러 단점이 있음.
    • 맵리듀스 작업은 입력을 생성하는 모든 선행 작업이 완료됐을 때만 시작 가능함.
    • 매퍼들은 중복되기도 하며, 대부분 매퍼 코드는 이전 리듀서의 일부가 될 수 있음.
    • 분산 파일 시스템에서 중간 상태를 저장하는 것은 과잉조치임.
      • 따라서, 중간 상태 구체화의 단점을 고려할 필요가 있다.

데이터플로 엔진

  • 데이터플로 엔진은 맵리듀스의 문제점을 해결하기 위해 개발된 분산 일괄 처리 연산 엔진임.
    • 대표적인 데이터플로 엔진으로는 스파크(Spark), 테즈(Tez), 플링크(Flink)가 있음.
    • 이들 엔진은 전체 워크플로를 독립된 하위 작업으로 나누지 않고 작업 하나로서 다룸.
    • 이 시스템을 데이터플로 엔진이라고 부르며, 연산자(operator)를 사용하여 처리 단계를 유연하게 조합할 수 있음.
  • 데이터플로 엔진은 맵리듀스와 달리 정렬 등의 비싼 작업을 필요할 때만 수행하며, 필요없는 맵 태스크는 없애고 최적화를 실현함.
    • 이는 스케줄러가 데이터 지역성 최적화를 가능하게 하고, 연산자 간 중간 상태를 메모리나 로컬 디스크에 기록함으로써 I/O 부담을 줄임.
    • 또한 데이터플로 엔진은 연산자들이 입력이 준비되는 즉시 실행을 시작할 수 있어 선행 단계 전체가 끝나기를 기다릴 필요가 없음.
    • 더불어 새로운 연산자를 실행할 때 기존의 자바 가상 머신(JVM)을 재활용하여 시작 부담이 적음.
  • 데이터플로 엔진을 사용하면 맵리듀스 워크플로와 동일한 연산을 구현할 수 있으며, 최적화로 인해 수행 속도가 빠름.
    • 피그, 하이브, 캐스캐이딩으로 구현된 워크플로를 코드 수정 없이 간단한 설정 변경만으로 맵리듀스에서 테즈나 스파크로 전환할 수 있음.
    • 테즈는 가벼운 라이브러리이며, 스파크와 플링크는 대형 프레임워크로 각각 고유한 특성을 가지고 있음.

내결함성

  • 내결함성은 분산 시스템에서 중요한 개념으로, 맵리듀스는 중간 상태를 모두 구체화해 쉽게 내결함성을 확보함.
    • 하지만 스파크, 플링크, 테즈는 HDFS에 중간 상태를 쓰지 않아 다른 접근법을 사용해야 함.
    • 장비가 실패할 경우, 유효한 데이터로부터 계산을 다시 수행해 복구함.
    • 이를 위해 프레임워크는 데이터의 연산 추적이 필요하며, 스파크는 RDD를 사용하고 플링크는 체크포인트를 남겨 재개할 수 있음.
  • 재연산 시, 연산자가 결정적인지 비결정적인지 파악이 중요함.
    • 연산자가 비결정적이라면 다운스트림 연산자도 재시작하고 새로운 데이터를 기준으로 다시 수행해야 함.
    • 연산자를 결정적으로 만들기 위해 비결정적 원인을 제거해야 하며, 고정된 시드를 사용하는 것이 한 방법임.
  • 데이터를 재연산하는 방식이 항상 최선은 아님.
    • 중간 데이터가 작거나 연산이 CPU 중심적일 경우, 재연산보다 중간 데이터를 파일로 구체화하는 것이 더 효과적일 수 있음.

구체화에 대한 논의

  • 구체화에 대한 논의에서 맵리듀스와 데이터플로 엔진의 차이를 이해하는 것이 중요함.
    • 맵리듀스는 각 명령의 출력을 임시 파일에 기록하는 것과 유사하며, 데이터플로 엔진(플링크 등)은 유닉스 파이프와 비슷하게 작동함.
    • 이는 연산자의 출력을 점진적으로 다른 연산자로 전달하고, 입력이 완료될 때까지 기다리지 않음.
  • 정렬 연산자는 출력을 생성하기 전에 전체 입력을 소비해야 하므로, 상태를 일시적으로 누적할 필요가 있음.
    • 그러나 워크플로의 다른 부분은 파이프라인 방식으로 실행 가능함.
    • 작업을 완료한 후에는 출력을 지속성 있는 곳에 저장해야 함.
    • 대개 출력은 분산 파일 시스템에 기록되며, 이 경우 데이터플로 엔진을 사용할 때 HDFS상에 구체화된 데이터셋은 주로 작업의 입력과 최종 출력임.
      • 이 방식은 맵리듀스와 비슷하지만, 데이터플로 엔진의 장점은 사용자가 모든 중간 상태를 직접 기록하는 부담을 줄여준다는 것임.

그래프와 반복 처리

  • 그래프와 반복 처리에서 그래프형 데이터 모델과 일괄 처리 맥락에서의 그래프 처리가 언급됨.
    • 그래프 처리는 추천 엔진, 머신러닝, 랭킹 시스템 등에서 중요하게 사용되며, 페이지랭크와 같은 알고리즘을 통해 웹 검색 엔진의 순서를 결정함.
  • 데이터플로 엔진(스파크, 플링크, 테즈)은 일반적으로 비순환 방향 그래프(DAG)를 사용하여 작업에 있는 연산자를 배열함.
    • 이는 데이터 자체가 그래프 형식인 그래프 처리와는 다름.
    • 이러한 혼동을 피하기 위해 이 둘을 구분하는 것이 중요하다.
  • 많은 그래프 알고리즘은 한 번에 하나의 간선을 순회하면서 특정 조건에 도달할 때까지 반복하는 방식으로 표현됨.
    • 이런 알고리즘을 이행적 폐쇄(transitive closure)라고 함.
    • 그래프는 분산 파일 시스템에 정점과 간선 목록이 포함된 파일 형태로 저장할 수 있다.
  • 일반적인 맵리듀스로는 완료할 때까지 반복이라는 개념을 표현할 수 없음.
    • 맵리듀스는 알고리즘의 반복적 속성을 고려하지 않고 항상 전체 입력 데이터셋을 읽어 완전히 새로운 출력 데이터셋을 생산함.
    • 이 접근법은 맵리듀스로 구현해도 동작하지만 상당히 비효율적임.
    • 이러한 한계 때문에 그래프 처리 알고리즘은 대개 반복적 스타일로 구현된다.

프리글 처리 모델

  • 프리글 처리 모델은 그래프를 최적화하는 방법으로 벌크 동기식 병렬(BSP) 연산 모델이 널리 사용되며, 아파치 지라프(Apache Giraph), 스파크 그래프 X(Graph X) API, 플링크 젤리 (Gelly) API 등이 유명한 BSP 구현체임.
    • 프리글 모델은 구글의 프리글 논문에서 소개되어 널리 보급되었다.
  • 프리글 모델에서 한 정점은 다른 정점으로 "메시지"를 보낼 수 있고, 이 메시지는 그래프에서 간선을 따라 보내짐.
    • 반복할 때마다 개별 정점에서 함수를 호출해 그 정점으로 보내진 모든 메시지를 전달함.
    • 프리글 모델의 핵심 차이점은 정점이 반복에서 사용한 메모리 상태를 기억한다는 점임.
    • 따라서 정점은 새로 들어오는 메시지만 처리하면 됨.
  • 프리글 모델은 액터 모델과 비슷한 면이 있으며, 각 정점을 액터로 볼 수 있음.
    • 정점 사이의 메시지는 내결함성과 지속성이 있지만, 메시지 통신은 고정된 횟수 안에 처리됨.
    • 각 반복에서 프레임워크는 이전 반복에서 보내진 모든 메시지를 전달함.
    • 액터 모델은 이러한 타이밍 보장을 하지 않는다.

내결함성

  • 내결함성은 프리글 작업 성능 향상에 도움을 주는 중요한 요소로, 정점 간 통신이 메시지 전달 방식을 사용하기 때문에 일괄 처리가 가능하고 대기 시간이 발생하지 않음.
    • 프리글 모델은 앞선 반복에서 보낸 모든 메시지가 다음 반복에 도착함을 보장함.
    • 이를 통해 프리글 프레임워크 차원에서 완벽한 결함 복구가 가능함.
  • 내결함성은 모든 정점의 상태를 주기적으로 체크포인트로 저장하여 보장됨.
    • 이는 전체 상태를 지속성 있는 저장소에 기록함으로써 이루어짐.
    • 노드에 장애가 발생하여 인메모리 상태가 손실되면, 전체 그래프 연산을 마지막 체크포인트로 되돌리고 연산을 재시작하는 것이 가장 간단한 해결책임.
    • 알고리즘이 결정적이고 메시지가 로그로 남는 경우, 손실된 파티션만 선택해서 복구할 수도 있음.

병렬 실행

  • 병렬 실행에서 프리글 프레임워크는 그래프를 파티셔닝하고 정점이 어떤 장비에서 실행될지와 메시지를 올바른 장소로 보내기 위해 네트워크 상에서 어떻게 라우팅할지를 결정함.
    • 프로그래밍 모델은 한 번에 정점 한 개를 다루기 때문에, 프리글 프레임워크는 그래프를 임의의 방법으로 파티셔닝할 수 있음.
  • 그러나 그래프 알고리즘은 장비 간 통신 오버헤드가 많이 발생할 수 있음.
    • 네트워크 상에서 메시지를 보내는 오버헤드 때문에 분산 그래프 알고리즘이 느려질 수 있음.
      • 따라서, 그래프가 단일 컴퓨터 메모리에 넣을 수 있는 크기라면 단일 장비 알고리즘이 분산 일괄 처리보다 성능이 좋을 가능성이 높음.
      • 그래프가 메모리보다 크지만 단일 컴퓨터의 디스크에 넣을 수 있다면, 그래프치와 같은 단일 장비 그래프 처리 프레임워크를 사용하는 것이 좋음.
      • 그래프가 단일 장비에 넣기에 너무 크면 프리글과 같은 분산 접근법을 사용해야 한다.
      • 효율적인 병렬 그래프 알고리즘은 여전히 연구가 진행 중인 분야다.

고수준 API와 언어

  • 고수준 API와 언어는 분산 일괄 처리용 수행 엔진이 발전하면서 인기를 얻게 됨.
    • 인프라가 크게 성장해 클러스터 상에서 페타바이트급 데이터를 처리할 수 있게 되면서, 프로그램 모델 개선과 처리 효율을 높이는 데 더 집중할 수 있게 됨.
  • 맵리듀스 작업 작성이 어렵기 때문에 하이브, 피그, 캐스캐이딩, 크런치 같은 고수준 언어나 API가 인기를 끌게 됨.
    • 또한, 테즈의 등장으로 맵리듀스 엔진에서 새로운 데이터플로로 옮겨갈 때 작업 코드를 새로 작성하지 않아도 됨.
    • 스파크와 플링크도 자체 고수준 데이터플로 API를 가지고 있음.
  • 이러한 데이터플로 API는 관계형 스타일의 빌딩 블록을 사용해 연산을 표현함.
    • 이 연산들은 다양한 조인과 그룹화 알고리즘을 사용해 구현됨.
    • 고수준 인터페이스는 코드를 적게 작성해도 되는 이점뿐만 아니라 대화식 사용을 지원함.
    • 이 개발 스타일은 데이터셋을 조사하고 처리하는 데 매우 유용함.
    • 고수준 인터페이스를 사용하면 사용자와 장비 수준에서 작업을 효율적으로 수행할 수 있음.

선언형 질의 언어로 전환

  • 선언형 질의 언어로 전환하면, 프레임워크가 조인 입력의 속성을 분석하여 자동으로 최적의 조인 알고리즘을 결정할 수 있음.
    • 하이브, 스파크, 플링크는 비용 기반의 질의 최적화기를 내장하고 있음.
    • 질의 최적화기는 성능 향상을 위해 중간 상태를 최소화하고 조인 순서를 변경함.
  • 맵리듀스와 데이터플로 계승자들은 SQL의 완전한 선언형 질의 모델과는 다름.
    • 맵리듀스는 함수 콜백 개념을 사용하여 사용자 정의 함수(매퍼 또는 리듀서)를 호출함.
    • 이를 통해 기존 라이브러리를 활용할 수 있다는 장점이 있음.
    • 이러한 특성은 오랜 시간 동안 MPP 데이터베이스와 맵리듀스를 구별해줌.
  • 그러나 데이터플로 엔진에서 선언적인 기능을 통합하면 이점이 있음.
    • 선언적 방법으로 표현되는 간단한 필터링과 매핑 연산을 사용하면, 질의 최적화기가 디스크에서 필요한 칼럼만 읽을 수 있음.
    • 벡터화 처리를 사용하여 CPU 캐시가 잘되게 하거나 함수 호출을 피하는 방식으로 성능을 향상시킬 수 있음.
  • 고수준 API에 선언적 측면을 포함하면서 실행 중에 이용할 수 있는 질의 최적화기를 가진 일괄 처리 프레임워크는 MPP 데이터베이스와 더 비슷해지면서 성능을 향상시킴.
    • 동시에, 일괄 처리 프레임워크는 임의의 코드를 실행하고 임의 형식의 데이터를 읽을 수 있는 확장성을 유지하여 유연성을 그대로 유지한다.

다양한 분야를 지원하기 위한 전문화

  • 다양한 분야를 지원하기 위한 전문화가 필요함.
    • 임의 코드 실행이 가능한 확장성은 유용하지만, 표준화된 처리 패턴을 가진 공통 사례도 많음.
    • 재사용 가능한 공통 빌딩 블록을 구현하는 것이 가치 있음.
    • 전통적으로 MPP 데이터베이스는 비즈니스 분석가와 보고서의 요구에 부합했지만, 이것은 일괄 처리가 사용되는 많은 분야 중 하나일 뿐임.
  • 증가하는 중요성을 가진 다른 분야는 통계학과 수치 알고리즘으로, 이들은 머신러닝 애플리케이션 구축에 필요함.
    • 예를 들어 머하웃(Mahout)은 맵리듀스, 스파크, 플링크 상에서 실행되는 다양한 머신러닝용 알고리즘 구현을 가지고 있음.
    • 매드립(MADlib)은 관계형 MPP 데이터베이스 내부에 이와 유사한 기능 구현이 있음.
  • 공간 알고리즘도 유용하다.
    • 예를 들어, k 최근접 이웃 알고리즘은 다차원 공간에서 주어진 아이템과 근접한 아이템들을 찾는 유사도 검색 알고리즘임.
    • 이는 유전자 분석 알고리즘에서도 중요하게 사용됨.
  • 일괄 처리 엔진은 점차 광범위한 영역에서 필요한 알고리즘을 분산 수행하는 데 사용되며, 일괄 처리 시스템과 MPP 데이터베이스는 더욱 비슷해 보이기 시작했음.
  • 이 둘은 결국 데이터를 저장하고 처리하는 시스템이기 때문임.

댓글

Designed by JB FACTORY