[지데넓얕] 하둡과 맵리듀스 스파크의 관계  


하둡 (Hadoop)


https://www.ibmbigdatahub.com/blog/what-hadoop



"하둡은 간단한 프로그래밍 인터페이스를 통해 클러스터 환경에서 대용량 데이터에 대한 분산 처리를 하는 소프트웨어 라이브러리다.


하둡의 정식명칭은 아파치 하둡 (Apache Hadoop) 이며 scalable, distributed computing 을 위한 소프트웨어 플랫폼입니다. 하둡은 오픈 소스 프로젝트이고 아파치 재단에 의해 관리됩니다. 하둡은 "데이터를 읽고 처리하는 속도가 데이터의 양을 따라잡지 못한다" 라는 문제에서 출발했습니다. 하드디스크 입출력 속도는 보통 100MB/s 정도입니다. 하지만 기업환경에서 마주하는 데이터는 최소 기가바이트 (GB) 에서 테라바이트(TB), 페타바이트 (PB) 까지 이르는 경우가 많습니다.  하둡의 필요성을 생각해보기 위해 예를 들어 설명해보겠습니다. 아래의 상황에서 하둡이 유용할 수 있습니다. 


1) 하드 디스크는 1TB짜리 인데, 3TB 데이터를 저장하고 싶을 때

2) 100 개의 파일에 대해 똑같은 작업을 해서 결과를 합치는 분산 컴퓨팅을 하고자 할 때 

3) TB 단위 이상의 데이터를 빠르게 Disk I/O (로드 또는 저장) 하고 싶을 때 


하둡의 두 가지 키워드는 scalable distributed computing 입니다. scalable 은 확장 가능하다는 뜻으로 자원을 추가하더라도 코드의 수정 등을 할 필요 없이 동일한 방법으로 프로세싱을 할 수 있다는 의미입니다. distributed computing 은 분산 컴퓨팅을 의미하여 Job 을 적절한 크기로 쪼갠 후, 분산된 자원원을 통해 계산하고 결과를 합치는 작업을 말합니다. 



맵 리듀스 (Map-Reduce)



A BIG DATA PROCESSING FRAMEWORK BASED ON MAPREDUCE WITH APPLICATION TO INTERNET OF THINGS (2016)


"맵 리듀스는 아파치 하둡 프로젝트의 서브 프로젝트로, 분산 컴퓨팅을 위한 프레임워크다. "


하둡의 맵리듀스는 distributed computing 을 위한 프레임워크입니다. 맵리듀스는 하둡의 서브 프로젝트라고 볼 수 있습니다. 맵리듀스는 Job 의 스케쥴링, 모니터링, 에러 핸들링 등을 수행합니다. 맵 리듀스는 인풋 데이터를 독립적인 청크로 나누고 이를 병렬적으로 처리합니다. 맵리듀스는 하둡 파일 시스템 HDFS (Hadoop Distributed File System) 으로부터 데이터를 불러오고 저장할 수 있습니다. 맵 리듀스의 이해를 위해 다음과 같은 예를 들어봅시다. 


ex) 100개의 문서가 있고, 그 문서에서 단어의 빈도수 예를 들면, 'dog', 'cat', 'bird', 'fish', ... 의 수를 세서 결과를 보여주는 프로그램을 작성하라. 100개 이상의 컴퓨터를 보유하고 있다. 문서의 크기가 다 다르고 메모리 문제로 한 컴퓨터에서는 평균 1개의 문서만 로드할 수 있다. 


간단하게 생각해보면 100개의 컴퓨터에 각각 1개의 문서를 할당해 단어 빈도수를 세고, 이를 합치면 되겠죠. 이것도 분산 컴퓨팅의 일종입니다. 하지만 이것은 그렇게 간단한 문제는 아닙니다. 예를 들어, 실행 도중 몇몇 컴퓨터에서 갑자기 오류가 날 수 있습니다. 또 각각의 컴퓨터에서 계산한 단어 빈도수를 한 컴퓨터에서 합산해서 보여주고자 할 때, 컴퓨팅 자원의 문제로 합산이 불가능할 수 있습니다. 또한 각 문서의 크기가 달라 한 컴퓨터당 하나의 문서를 할당하는 것이 비효율적일 수도 있습니다. 즉, 다양한 상황을 고려한 하나의 분산 컴퓨팅 프레임워크가 필요합니다. 


https://stackoverflow.com/questions/47531863/why-key-is-not-unique-in-mapreduce-function



맵 리듀스는 '분산 컴퓨팅을 실제로 어떻게 할 것인가?' 에 대한 잘 알려진 답변입니다. 맵 리듀스는 크게 리듀스로 나뉩니다. 맵에서 인풋데이터는 "키-값 쌍" 으로 변화되고, 스플릿 단위로로 나뉘어서 각 노드에 할당됩니다. 맵은 리듀스를 위한 키-값쌍을 만들어냅니다. 이 때, 키-값쌍은 사용자에 의해 정의될 수 있습니다. 리듀스 태크스는 맵의 아웃풋 키-값 쌍을 인풋으로 받아 최종 결과를 출력합니다. 예를 들어, 위 문제에서 인풋 데이터를 (문장의 오프셋, 문장 텍스트) 의 키-값 쌍으로 정의해볼 수 있습니다. 이렇게 인풋 데이터를 키-값 쌍으로 나누고 노드에 할당하는 것을 Splitting 이라고 합니다. Splitting 에서 인풋데이터는 입력 스플릿 (input split) 또는 단순히 스플릿이라고 부르는 고정된 크기의 조각으로 분리합니다. 문서 단위로 노드에 할당하는 것보다 스플릿 단위로 할당하는 것이 더욱 빠릅니다. 또한 한 컴퓨터에서 불가능했던 일을 가능하게 할 수 있습니다. 



스파크 (Spark)


https://dzone.com/articles/apache-spark-fast-big-data


"스파크는 하둡 위에서 동작할 수 있는 인메모리 프로세싱 엔진이다." 


위 맵 리듀스 절차는 통해 분산 컴퓨팅을 어떻게하는지 감을 잡으셨을 거라고 생각합니다. 하지만 실제로 이를 코드로 구현하는 것은 복잡합니다. 하둡 라이브러리의 객체를 상속 받아 메소드 오버라이딩을 하고 최종적으로 구현된 클래스를 모아 jar 형태로 만들어 배치형태로 하둡에 제출해야합니다. 즉, 하둡의 맵-리듀스는 ad-hoc 데이터 분석에 적합하지 않습니다. 따라서 맵-리듀스를 보다 유저 친화적으로 할 수 있는 다양한 방법이 제시되었습니다. 그 중 하나가 스파크입니다. 


스파크의 기본적인 특성

  • 스파크는 분산 인메모리 프로세싱 엔진입니다. 스파크는 반드시 하둡과 같이 사용될 필요는 없습니다. 하지만 스파크는 하둡을 지원합니다. 예를 들면 스파크는 하둡이 사용하는 파일 시스템인 HDFS (Hadoop Distributed File System) 의 데이터를 읽어올 수도 있고, 반대로 데이터를 쓸 수도 있습니다. 
  • 스파크는 HDFS 에 저장된 데이터를 하둡 코어 라이브러리를 호출함으로써 메모리로 불러온 후, 변환 및 계산 등을 거쳐 최종 원하는 결과물을 산출합니다. 스파크는 인메모리 프로세싱을 하기 때문에 Disk I/O 가 많이 일어나는 하둡의 맵-리듀스보다 특정 작업 (ex. multi-pass map reduce)에서는 더 빠르게 수행될 수 있습니다. 
  • 스파크는 여러가지의 분산 데이터베이스나 파일 시스템을 수용할 수 있습니다. 하둡 뿐만 아니라 카산드라를 사용을 할 수도 있습니다. 카산드라는 CQL (Cassandra Query Language) 이라는 고유의 SQL 문법이 있는데, 이는 SQL 의 서브셋으로 다양한 데이터 추출을 이용하기가 힘들다고 알려져 있습니다. 카산드라에 스파크를 결합해 추가적인 데이터 프로세싱을 사용할 수 있기 때문에 카산드라 자체만을 통해 못하는 일을 할 수 있습니다.
  • 스파크의 한 가지 장점은 stream processing 이라고 하는 실시간 데이터처리 입니다. 스파크는 실시간 데이터 처리를 위해 세팅이 될 수 있고, micro-batches 단위로 데이터 프로세싱을 수행할 수 있으며, 결과를 하둡 HDFS, 카산드라 같은 파일 시스템에 저장할 수 있습니다. 


스파크의 아키텍쳐


https://towardsdatascience.com/getting-started-with-apache-spark-ad9d59e71f6f


스파크의 주요 개념은 Resilient Distributed Datasets (RDD) 와 directed acyclic graph (DAG) execution engine 입니다. RDD 는 스파크에서 사용되는 데이터셋으로 각 단어는 다음과 같은 뜻이 있습니다. 

  • Resilient: 분산되어 있는 데이터에 에러가 생겨도 복구할 수 있는 능력
  • Distributed: 클러스터의 여러 노드에 데이터를 분산에서 저장 
  • Dataset: 분산된 데이터의 모음 


스파크에서 RDD 에 대해 수행할 수 있는 연산은 크게 1) transfomation 2) action 으로 나눌 수 있습니다. transformation 은 인풋데이터로부터 새로운 데이터셋을 만들어내는 것이고 (ex. map, filter), action 데이터셋으로부터 계산 (ex. reduce or count)을 하는 것입니다. 스파크에서는 DAG engine 을 통해 맵리듀스의 느린 부분 (multi-pass map reduce, multi-stage execution model)을 제거해 상당한 성능 향상도 가능합니다. 


RDD 를 통한 분석 워크 플로우는 다음과 같이 요약해볼 수 있습니다.



https://www.edureka.co/blog/spark-architecture/#Overview


Reference