300x250

Scala 언어를 사용한 Spark Framework에서의 빅데이터 분석 공부를 시작해보려 한다.

 

목차

     

     

     

     

     

    Introduction of Analyzing Big Data

     

     

     

     

    1) Challenges of Data Science

     

     

     

    (1) 빅데이터 분석이란?

     

    빅데이터 분석의 예

    • 수많은 거래 건 수와 수많은 feature들을 사용하여 신용카드 사기 탐지하는 모델 만들기
    • 수많은 사용자들에게 수많은 물품들 중 적절한 것을 추천하기
    • 수많은 변수가 존재하는 주식 시장에서 Financial Risk 예측하기
    • 질병과의 관련성을 탐지하기 위해 수많은 인간의 'genome' 다루기

     

    우리는 현재 빅데이터의 시대에 살고 있다.

    이에 따라 이전보다 훨씬 많은 정보들을 모으고, 저장하고, 처리하는 tool들이 생겨났다.

    '오픈 소스 소프트웨어'라는 ecosystem 덕에 'Apache Hadoop'등과 같은 방대한 데이터를 저장하고 다루는 framework들을 쉽게 배울 수 있게 되었다.

     

    하지만 단순히 그러한 도구들을 사용할 줄 아는것과, 그런 도구들로 유용한 일을 하는 것은 다르다.

    여기서, Data Science라는 것은 Raw Data를 의미있는, 유용한 Data로 바꾸는 일을 말한다.

    그러기 위해서는 Domain 지식을 이해하고, 문제를 정의해서 문제를 풀 수 있어야 한다.

     

    작은 size의 Data Set을 분석하는 다양한 Open Source Famework들이 있다. (예를 들어, R, PyData stack, Octave, MATLAB 등등...) 하지만 Huge Data Set을 다루기 위해서는 단순히 이 Framework들을 확장해서는 안된다. 여기서 'Challenges of Distributed Computing'이라는 문제가 발생한다.

     

    Cluster(네트워크로 연결된 독립된 하드웨어), 단순히 말해서 여러 대의 컴퓨터로 방대한 데이터를 다룰 때에는 다음과 같은 가정을 갖는다.

    1. Network transfer rates

    데이터의 양이 많아지면 여러 Disk의 network들로부터 데이터를 읽어야 한다. 즉, 데이터를 읽어오는 과정에서 '통신'이 필요하다. 그런데 네트워크의 통신속도 (Network transfer rates)는 memory로의 접근보다 느리다. 그러므로 데이터 의존성이 넓은 알고리즘은 사용이 불가능하다.

    2. Node failure

    한 컴퓨터에 문제가 생기게 되면 백업을 하지 않는 이상 그 disk의 데이터가 모두 날아간다. 여러 컴퓨터가 작동하므로 그만큼 failure(node가 죽는 등의 현상)이 일어날 확률이 높아진다.

     

    따라서, 'Distributed Computing'상황에 잘 맞는 새로운 프로그래밍 패러다임이 필요해졌다. 

     

     

     

    (2) The Challenges of Data Science

     

    1. Preprocessing of Data

     

    데이터의 분석에서 가장 중요한 것은 '전처리'이다. 가장 중요하고, 가장 시간이 오래 걸리고, 가장 어렵다. 하지만 전처리가 제대로 되지 않는다면 좋은 결과를 얻을 수 없다.

    데이터는 복잡하므로 cleansing, munging, fusing, mushing  등의 noise를 제거하는 과정이 필요하다.

    하지만 데이터의 양이 기하급수적으로 늘어남에 따라 사람이 수작업으로 이런 전처리를 해주는 것은 불가능해졌다.

    모델의 성능을 최적화하기 위해, 의미있는 feature들을 추출하는 과정이 매우 중요해졌다.

     

    예를 들어, 어떤 웹사이트에서의 사기 거래를 감지하려 한다고 할 때,

    먼저 가능한 feature(특징, 변수)들을 다양하게 고른 후에, 이렇게 고른 feature들을 벡터로 바꾸어 Meachine Learning Algorithm 학습에 사용한다.

     

    2. Iteration

    ML(머신러닝) 사용 시에는 모델을 반복적으로 학습을 시키게 된다. 학습이라는 것이 곧 Input data를 반복적으로 scan하며 어떤 값에 수렴하는 과정이라 볼 수 있는데, Framework에서 각각의 반복마다 같은 data set을 disk에서 읽어오게 된다면 'disk IO delay (disk에서 memory로 데이터를 읽을 때마다 발생하는 딜레이)' 때문에 전체 과정이 매우 느려질 것이다.

     

    3. Data application

    Data Science의 핵심은 데이터를 유용하게 만드는 것이라고 언급했다. 그러므로 단순히 잘 작동하는 모델을 만드는 일이 다가 아니라, 실제 산업 현장에서의 Production Service의 일부라고 볼 수 있다. 따라서 연구실에서 실험적으로 데이터를 이해하고, 이론을 테스트하고 적용하는 것에 그치지 않고, 정제된 데이터들을 생산적으로 활용할 수 있어야 할 것이다. 이러한 관점에서 보았을 때, 'R, Python'등은 개발자 친화적인, 즉 실시간성이 떨어지는 언어이다. 반면에 Java, C++ 등은 실시간성이 좋아 실제 산업 현장에서 사용하기 적합하다.

     

    → 결국 우리가 필요한 것은 Modeling이 쉽고, production system에도 잘 적용할 수 있는 Framework이다.

    → 이에 가장 잘 맞는 Framework이 바로 'Spark'이다!

     

     

     

    2) Introduction to Apache Spark

     

    Spark는 기계들의 cluster들에 걸쳐서 distributing program을 개발할 때 적절한 open source framework이다.

    Java, Scala, Python, R과 같이 high-level API를 제공하고, Spark SQL, MLlib, GraphX, Spark Streaming 등의 higher-level tool들도 제공한다. 특히 Spark는 Scala라는 프로그래밍 언어로 구현이 되어 있어, Scala라는 언어도 배울 것이다.

     

     

     

    (1) Compared to Apache Hadoop's 'MapReduce'

     

    이와 비교해서 Apache Hadoop의 MapReduce라는 Framework이 있다. 하지만 이 Framework는 수 백개, 수 천개의 cluster를 다루는, 매우 방대한 data를 다루는 데에 적합하다.

    특히 MapReduce는 'Linear Scalability'라는 특징을 갖는데, 간단히 설명하자면 데이터 사이즈가 2배로 증가했을 때 단순히 클러스터에 컴퓨터를 두 배로 증가시켜 데이터를 커버할 수 있다는 것이다.

    이런 특징으로 방대한 작업을 여러 작은 task로 쪼개서 진행할 수 있다는 장점이 있다.

     

    MapReduce와 Spark의 유사점

    • Linear Scalability
    • Fault Tolerance : 한 node(특정 컴퓨터)가 죽었을 때 복구할 수 있다는 성질

     

    Spark가 MapReduce보다 나은 점

    • MapReduce의 경우 map-then-reduce format, 즉 data를 mapping한 후 reduce하는 과정을 항상 거쳐야 하는데 반해 Spark는 더 일반적인 Directed Acyclic Graph (DAG)를 실행할 수 있다.
      • MapReduce는 distributed filesystem에서 중간중간에 결과들을 써 주어야 한다.
      • Spark는 pipeline이라는 과정에서 결과를 써 주는 과정을 생략하고 바로 다음 step으로 넘어갈 수 있어 disk IO 시간이 짧다
    • MapReduce에 비해 Spark는 좀 더 개발자 친화적이다.
      • 좀 더 간단한 코드로 구현할 수 있다.
    • In-memory processing이 가능하다
      • Dataset & DataFrame abstraction을 통해 개발자들이 메모리 상에서 pipeline 과정을 구체화할 수 있어서 Spark는 계산을 다시 하거나 disk로부터 reload할 필요가 없다. → ML과 같이 반복적인 알고리즘이나 실시간으로 구현이 필요할 경우 적절하다.

     

     

    728x90
    • 네이버 블러그 공유하기
    • 네이버 밴드에 공유하기
    • 페이스북 공유하기
    • 카카오스토리 공유하기