Soft skills/지데넓얕 (2)

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


하둡 (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


[지데넓얕] Data Science와 Data Engineering 은 무엇이 다를까?


2020년 부터 블로그 포스팅 컨텐츠의 일환으로 "지적 데이터과학을 위한 넓고 얕은 지식 (지데넓얕)" 을 진행해볼까 합니다. 제목은 많이 알려진 책인 지적대화를 위한 넓고 얕은 지식 (채사장) 을 패러디한 것이며, 목적은 데이터과학 관련 지식을 전문적으로 다루기 보다는 상식 수준에서 쉽게 다루어보는 것입니다! 첫번째 포스팅으로는 Data science 와 Data engineering 의 차이점에 대해서 정리해보겠습니다. 


Data Science


Data Science 는 이름에서도 알 수 있듯, Data + Science 이다. '데이터' 를 통해 '과학' 을 하는 것입니다. 사실 Data science란 용어는 매우 모호한 단어입니다. 전통적인 연구 (Traditional research) 에서도 데이터를 통해 과학을 하는데 이와 무엇이 다르냐고 할 수 있습니다. 또한 오래전부터 있어왔던 개념인 정보학 (Informatics) 과는 무엇이 다른 것일까요? 이러한 단어의 모호함 때문에 Data science 라는 이름만 보고는 무엇을 하는 건지 명확히 아는데 어려움을 겪습니다.




데이터과학은 구체적으로 '도메인 빅데이터'에 '통계' 와 'IT 기술'을 접목시켜 과학을 하는 것입니다. 이는 위그림에 잘 표현되어 있습니다. 데이터과학에는 3가지 구성 요소가 있습니다. 1) Computer science 2) Statistics 3) Domain knowledge 입니다. 과학이란 새로운 사실을 발견하는 것입니다. 사전적 정의에 따르면 과학은 "검증된 방법으로 얻어 낸 자연계에 관한 체계적 지식 체계" 이지만, 자연계이외에도 포괄적으로 빅데이터에 통계, IT 기술을 접목시켜 Business insight 도출, 의사 결정을 하는 것도 데이터과학이라고 부릅니다. 즉, 과학이라는 것은 데이터과학에서 폭넓은 의미로 쓰이며, '도메인 빅데이터'에 '통계' 와 'IT 기술'을 접목해 문제를 해결하는 것 정도로 데이터 과학을 요약할 수 있습니다. 


데이터 과학자 (Data scientist) 는 크게 두 가지 종류가 있다고 생각합니다. 첫 번째는 머신러닝 전문가로서, 여러 도메인의 문제 해결에 도움을 주는 데이터 과학자 입니다 (Machine learning engineer or scientist). 즉, 위 그림에서 Machine learning 에 중점을 두면서 여러 도메인의 문제를 푸는 사람입니다. 이 경우 머신러닝의 최신 동향 파악 및 최신 기술 (State-of-the-art) 의 활용에 강점이 있습니다. 두 번째는 특정 도메인에 국한해 빅데이터에 IT 와  통계 지식을 접목해 문제를 해결하는 사람 (Domain expert) 입니다. 위 그림에서 Domain knowledge 에 폭넓은 이해와 함께 필요한 IT 기술, 통계학적 지식을 접목해 문제를 해결하는 사람입니다. 이 경우 도메인 지식을 활용한 Feature 선정, 공학도메인에서 문제를 스스로 찾고 이를 공학적으로 formulation 하는 능력에 강점이 있습니다. 


Data Engineering


위 데이터 과학의 정의를 보면 데이터과학자들의 역할이 매우 광범위합니다. 데이터 공학 (Data engineering) 은 대규모의 데이터를 효율적으로 관리하고 처리하며 가공을 통해 분석에 적합한 형태 or 데이터과학자가 사용할 수 있는 형태로 만드는 것과 관련이 있습니다. 큰 회사의 경우 데이터의 크기가 매우 크고, 이를 저장하기 위하여 분산 시스템을 활용하며, Database management system, text file 에 데이터를 저장합니다. 이러한 데이터 저장 시스템에 데이터를 저장하고 필요할 때 추출해서 처리하기 위한 방법론을 데이터 공학이라고 이야기합니다. 데이터 과학자와 데이터 공학자는 카레이서와 카트를 만드는 사람으로 비유할 수 있습니다. 카레이서는 카트가 없다면 달릴 수 없듯, 빅데이터 분석에서 데이터공학자 없이 데이터 과학자가 존재하기 힘듭니다. 하지만 데이터 공학자는 실제 데이터과학 접목을 통해 Product 를 만들었을 때, 덜 주목 받을 수 있습니다. 왜냐하면 전체 Product 개발의 pipeline 을 봤을 때, 초기 단계에 있는 일을 하기 때문입니다. 데이터 공학은 빅데이터 처리 시스템이 갖추어지지 않은 작은 규모의 기관에서는 그 역할이 축소될 수 있고, 데이터과학자가 겸임을 하기도 합니다.  


https://www.elderresearch.com/consulting-services/data-engineering


위 그림은 대규묘 데이터 활용의 파이프라인에서 Data engineering 이 담당하는 역할을 잘보여줍니다. 데이터 공학자는 비지니스 데이터를 분산 시스템에 정형화된 형태로 저장 (위 그림의 Immutable data store) 하고 필요할 때, 이를 Extract, Load, Transform (ETL) 해서 분석에 적합한 형태 (위 그림의 Analytic base table) 로 만듭니다. 데이터 과학자는 이 데이터를 통해 데이터 과학을 합니다. 


데이터 과학과 데이터 공학의 공통점과 차이점은 아래와 같이 요약을 해볼 수 있습니다. 


공통점

데이터과학 

데이터공학 

소프트웨어 기술 

빅데이터

통계학

머신러닝

도메인지식

빅데이터 Infrastructure 

분산처리 기술 (Hadoop, Spark)

분산시스템 데이터처리 Pipeline 

실시간 처리 시스템