[14주차] Spark

2023. 6. 28. 15:00BOOTCAMP/프로그래머스 인공지능 데브코스

1. Big Data: 데이터 팀의 역할

  • 데이터 팀의 미션

신뢰할 수 있는 데이터를 바탕으로 부가가치 생성, 데이터는 새로운 오일 등이라고 하지만, 항상 데이터 팀의 부가가치를 창출하는 것. 사측에서 기대하는 만큼, 어떤 이익을 창출해 줄지 고민해야 함.

  • 데이터 팀의 목표 1

-고품질의 데이터를 제공하여 정책 결정에 사용

-결정과학(Decision Science)라고 부르기도 함

데이터 참고 결정(data informed decisions)을 가능하게 함

vs. 데이터 기반 결정(data driven decisions)

  • 데이터 팀의 목표 2

-고품질 데이터를 필요할 때 제공하여 사용자의 서비스 경험 개선

머신 러닝과 같은 데이터 기반 알고리즘을 통해 개선

예) 개인화를 바탕으로한 추천(Recommendation)과 검색 기능 제공

하지만 사람의 개입/도움이 반드시 필요(human-in-the-loop)

 

  • 데이터 팀의 발전 - 1. 데이터 인프라 구축

-데이터 인프라: 데이터 웨어하우스와 ETL(Extract, Transform, Load)

데이터 웨어하우스: 회사에 필요한 모든 데이터들을 저장하는 중앙 데이터베이스

ETL(Extract, Transform, Load): 소스에 존재하는 데이터들을 데이터 웨어하우스로 복사해 오는 코드를 지칭, 보통 파이썬으로 작성

-데이터 인프라의 구축은 데이터 엔지니어가 수행함

 

  • 데이터 웨어하우스란?

-회사에 필요한 모든 데이터를 모아놓은 중앙 데이터베이스(SQL)

데이터의 크기에 맞게 어떤 데이터베이스를 사용할지 선택

크기가 커진다면 AWS의 Redshift, 구글 클라우드의 BigQuery, 스노우플레이크(Snowflake)나 오픈소스 기반의 하둡/스파크를 사용하는 것을 추천: 이 모두 SQL을 지원

-중요 포인트는 프로덕션용 데이터베이스와 별개의 데이터베이스라는 점

-데이터 웨어하우스 구축은 진정한 데이터 조직이 되는 첫번째 스텝

 

  • ETL(Extract, Transform, Load)이란? (1)

-다른 곳에 존재하는 데이터를 가져다가 데이터 웨어하우스에 로드하는 작업

Extract: 외부 데이터 소스에서 데이터를 추출

Transform: 데이터의 포맷을 원하는 형태로 변환

Load: 변환된 데이터를 최종적으로 데이터 웨어하우스로 적재

 

  • ETL(Extract, Transform, Load)이란? (2)

-이는 코딩을 필요로 하며 가장 많이 쓰이는 프레임 워크는 Airflow

Airflow는 오픈소스 프로젝트 파이썬3 기반

에어비앤비, 우버, 리프트, 쿠팡 등에서 사용

AWS와 구글클라우드에서도 지원

흔한 데이터 소스의 경우 SaaS(Software as a Service) 사용 가능

FiveTran, Stitch Data, …

 

  • 데이터 팀의 발전 - 2. 데이터 분석 수행

-데이터 분석이란?

회사와 팀별 중요 지표(metrics) 정의하고, 대시보드 형태로 시각화(visualization)

이외에도 데이터와 관련한 다양한 분석/리포팅 업무 수행

중요 지표의 예: 매출액, 월간/주간 액티브 사용자수, …

이는 데이터 분석가 (Data Analyst)가 맡는 일임

 

  • 시각화 대시보드란?

-보통 중요한 지표를 시간의 흐름과 함께 보여주는 것이 일반적

지표의 경우 3A(Accessible, Actionable, Auditable)가 중요

-가장 널리 사용되는 대시보드:

구글 클라우드의 룩커(Looker)

세일즈포스의 태블로(Tableau)

마이크로소프트의 파워 BI(Power BI)

오픈소스 아파치 수퍼셋(Superset)

 

2. Big Data: 데이터 팀의 구성원

  • 데이터 엔지니어(Data Engineer)
    • 데이터 인프라(데이터 웨어하우스와 ETL) 구축
  • 데이터 분석가(Data Analyst)
    • 데이터 웨어하우스의 데이터를 기반으로 지표를 만들고 시각화 (대시보드)
    • 내부 직원들의 데이터 관련 질문 응답
  • 데이터 과학자(Data Scientist)
    • 과거 데이터를 기반으로 미래를 예측하는 머신러닝 모델을 만들어 고객들의 서비스 경험을 개선 (개인화 혹은 자동화 혹은 최적화)
    • 작은 회사에서는 한 사람이 몇개의 역할을 동시에 수행하기도 함
  • 데이터 엔지니어의 역할
    • 기본적으로 소프트웨어 엔지니어
      • 파이썬이 대세, 자바 혹은 스칼라와 같은 언어도 아는 것이 좋음
    • 데이터 웨어하우스 구축
      • 데이터 웨어하우스를 만들고, 이를 관리. 클라우드로 가는 것이 추세
        • AWS의 Redshift, 구글클라우드의 BigQuery, 스노플레이크
      • 관련해서 중요한 작업 중의 하나는 ETL 코드를 작성하고, 주기적으로 실행해 주는 것
        • ETL 스케줄러 혹은 프레임웍이 필요 (Airflow라는 오픈소스가 대세)
      • 데이터 분석가와 과학자 지원
        • 데이터 분석가, 데이터 과학자들과의 협업을 통해 필요한 툴이나 데이터를 제공해 주는 것이 데이터 엔지니어의 중요한 역할 중의 하나
  • 머신러닝 모델링 사이클
    • 보통 A/B 테스트를 통해 이뤄짐
      • 가설 → 데이터 수집, 분석, 모델개발, 모델 론칭, 테스트 시작 → 비즈니스 개선(매출증대, 경비절약)
  • 폭포수 개발방법론 vs. 애자일 개발방법론

Requirements → Design → Implementation → Verification → Maintenance

한 사이클을 빠르게 돌리면, 접근 방법에 대한 아이디어가 생김. 문제에 대해 더 이해하고, 어떤 이슈가 있는지 포텐셜 한 문제를 해결할 수 있있습니다.

  • A/B 테스트란? (1)
    • 온라인 서비스에서 새 기능의 임팩트를 객관적으로 측정하는 방법
      • 의료 쪽에서 무작위 대조 시험(Randomized Controlled Trial)
    • 새로운 기능을 론칭함으로 생기는 위험 부담을 줄이는 방법
      • 100%의 사용자에게 론칭하는 것이 아니라 작게 시작하고, 관찰 후 결정
      • 실제 예제: 추천을 기계학습기반으로 바꾼 경우
        • 먼저 5%의 사용자에게만 론칭하고, 나머지 95%의 사용자와 매출액과 같은 중요 지표를 가지고 비교
        • 5% 대상으로 별문제 없으면 10%, 20% 이런 식으로 점진적으로 키우고, 최종적으로 100%로 론칭
  • A/B 테스트란? (2)
    • 보통 사용자들을 2개의 그룹으로 나누고, 시간을 두고 관련 지표를 비교
      • 한 그룹은 기존 기능에 그대로 노출(control)
      • 다른 그룹은 새로운 기능에 노출(test)
    • 가설과 영향받는 지표를 미리 정하고, 시작하는 것이 일반적
      • 지표의 경우 성공/실패 기준까지 생각해 보는 것이 중요
  • 중앙집중 구조: 모든 데이터 팀원들이 하나의 팀으로 존재
    • 일의 우선순위는 중앙 데이터팀이 최종 결정
    • 데이터 팀원들간의 지식과 경험의 공유가 쉬워지고, 커리어 경로가 더 잘 보임
    • 하지만 현업부서들의 만족드는 상대적으로 떨어짐

  • 분산 구조: 데이터팀이 현업 부서별로 존재
    • 일의 우선 순위는 각 팀별로 결정
    • 데이터 일을 하는 사람들 간의 지식/경험의 공유가 힘들고, 데이터 인프라나 데이터의 공유가 힘들어짐
    • 현업부서들의 만족도는 처음에는 좋지만, 많은 수의 데이터 팀원들이 회사를 그만두게 됨

  • 중앙집중과 분산의 하이브리드 모델
    • 가장 이상적인 조직 구조
    • 데티어 팀원들의 일부는 중앙에서 인프라적인 일을 수행하고, 일부는 현업팀으로 파견식으로 일하되 주기적으로 일을 변경
    • 데이터팀 안에서 커리어 경로가 만들어짐

  • 데이터 인프라가 첫 번째 스텝
    • 데이터 인프라 없이는 데이터 분석이나 모델링은 불가능
      • 하지만 아주 작은 회사에서 생존이 더 중요한 문제라 데이터 인프라는 조금 더 성장한 뒤에 걱정해도 됨
      • 첫 번째 팀원은 인프라 구축 이외에도 약간의 분석/모델링 스킬이 있는 사람이 최적
    • 고려점
      • 클라우드 vs. 직접 구성
      • 배치 vs. 실시간: 처음부터 실시간으로 할 필요 없음

 

Big Data: Spark 소개

  • 빅데이터의 정의와 예
    • 빅데이터의 정의 1
      • “서버 한대로 처리할 수 없는 규모의 데이터”
      • 2012년 4월 아마존 클라우드 콘퍼런스에서 아마존의 data scientist인 존 라우저(John Rauser)가 내린 정의 분산 환경이 필요하냐에 포커스
        • 판다스로 처리해야 할 데이터가 너무 커서 처리가 불가능하다면 어떻게 할 것인가?
    • 빅데이터의 정의 2
      • “기존의 소프트웨어로는 처리할 수 없는 규모의 데이터”
      • 대표적인 기존 소프트웨어 오라클이나 MySQL과 같은 관계형 데이터베이스
        • 분산환경을 염두에 두지 않음
        • Sclae-up 접근방식 (vs. Scale-out)
          • 메모리 추가, CPU 추가, 디스크 추가
    • 빅데이터의 정의 3
      • 4V(Volume, Velocity, Variety, Varecity)
      • Volume: 데이터의 크기가 대용량
      • Velocity: 데이터의 처리 속도가 중요
      • Variety: 구조화/비구조화 데이터 둘 다
      • Veracity: 데이터의 품질이 좋은지
    • 빅데이터의 예제 - 디바이스 데이터
      • 모바일 디바이스
        • 위치정보
      • 스마트 TV
      • 각종 센서 데이터 (IoT 센서)
      • 네트워킹 디바이스
    • 빅데이터의 예 - 웹 페이지
      • 수십조 개 이상의 웹 페이지 존재
      • 이를 크롤링하여 중요한 페이지를 찾아내고 (페이지 랭크) 인덱싱하는 것은 엄청난 크기의 데이터 수집과 계산을 필요로 함
      • 사용자 검색어와 클릭 정보 자체도 대용량
        • 이를 마이닝하여 개인화 혹은 별도 서비스 개발이 가능
          • 검색어 자동 완성, 동의어 찾기, 통계 기반 번역
      • 이런 문제를 해결하면서 구글이 빅데이터 기술의 발전에 지대한 공헌을 하게 됨

하둡의 등장과 소개

-기존 기술과는 전혀 다른 방식을 택함으로써 대용량 데이터 처리를 가능하게 해 준 하둡에 대해 알아보자

  • 대용량 처리 기술이란?
    • 분산 환경 기반(1대 혹은 그 이상의 서버로 구성)
      • 분산 컴퓨팅과 분산 파일 시스템이 필요
    • Fault Tolerance
      • 소수의 서버가 고장 나도 동작해야 함
    • 확장이 용이해야 함
      • Scale Out이라고 부름
  • 하둡(Hadoop)의 등장
    • Doug Cutting이 구글랩 발표 논문들에 기반해 만든 오픈소스 프로젝트
      • 2003년 The Google File System
      • 2004년 MapReduce: Simplified Data Processing on Large Cluster
    • 처음 시작은 Nutch라는 오픈소스 검색엔진의 하부 프로젝트
      • 하둡은 Doug Cutting의 아들의 코끼리 인형의 이름
      • 2006년에 아파치 톱레벨 별개 프로젝트로 떨어져 나옴
    • 크게 두 개의 서브 시스템으로 구현됨
      • 분산 파일 시스템인 HDFS
      • 분산 컴퓨팅 시스템 MapReduce
        • 새로운 프로그래밍 방식으로 대용량 데이터 처리의 효율을 극대화하는데 맞춤
  • MapReduce 프로그래밍의 문제점
    • 작업에 따라서는 MapReduce 프로그래밍이 너무 복잡해짐
    • 결국 Hive처럼 MapReduce로 구현된 SQL 언어들이 다시 각광을 받게 됨
      • SQL in Hadoop
      • 빅데이터가 뜨면서 SQL이 한물갔다가 평가되었지만, 다시 각광을 받음
    • 또한 MapReduce는 기본적으로 배치 작업에 최적화 (not realtime)

SQL는 소규모 데이터 처리에 필요? MapReduce의 복잡성에 의해 다시금 SQL 각광

 

  • 하둡(Hadoop)의 발전
    • 하둡 1.0은 HDFS위에 MapReduce라는 분산컴퓨팅 시스템이 도는 구조
      • 다른 분산컴퓨팅 시스템은 지원하지 못함
    • 하둡 2.0에서 아키텍처가 크게 변경됨
      • 하둡은 기반 분산처리 시스템이 되고, 그 위에 애플리케이션 레이어가 올라가는 구조
      • Spark은 하둡 2.0위에서 어플리케이션 레이어로 실행됨
        • 손쉬운 개발을 위한 로컬 모드도 지원: 이번 강좌에서는 로컬 모드 사용
  • HDFS - 분산 파일 시스템
    • 데이터를 블록단위로 저장
      • 블록의 크기는 128MB(디폴트)
    • 블록 복제 방식 (Replication)
      • 각 블록은 3군데에 중복 저장됨
      • Fault tolerance를 보장할 수 있는 방식으로 이 블록들은 저장됨

 

Spark 소개

하둡은 1세대 빅데이터 처리기술이라면 Spark은 2세대 빅데이터 기술이라 할 수 있습니다.

 

  • Spark의 등장
    • 버클리 대학의 AMPLab에서 아파치 오픈소스 프로젝트로 2013년 시작
      • 나중에 DataBricks라는 스타트업 창업
    • 하둡의 뒤를 잇는 2세대 빅데이터 기술
      • 하둡 2.0을 분산환경으로 사용 가능
        • 자체 분산환경도 지원함
      • Scala로 작성됨
    • MapReduce의 단점을 대폭적으로 개선
      • Pandas와 굉장히 흡사 (서버 한대 버전 vs. 다수 서버 분산환경 버전)
    • 현재 Spark 버전 3이며 이번 강좌에서는 이를 사용
      • 현재 Scala, Java, Python 3으로 프로그래밍이 가능
      • 머신 러닝 관련해서 많은 개선이 있었음 (GPU 지원 포함)
  • Spark vs. MapReduce
    • Spark은 기본적으로 메모리 기반
      • 메모리가 부족해지면 디스크 사용
      • MapReduce는 디스크 기반
    • MapReduce는 하둡 위에서만 동작
      • Spark은 하둡(YARN) 이외에도 다른 분산 컴퓨팅 환경 지원
    • MapReduce는 키와 밸류 기반 프로그래밍
      • Spark은 판다스와 개념적으로 흡사
    • Spark은 다양한 방식의 컴퓨팅을 지원
      • 배치 프로그래밍, 스트리밍 프로그래밍, SQL, 머신 러닝, 그래프 분석
  • Spark의 구조
    • 드라이버 프로그램의 존재
    • Spark은 하둡 2.0(혹은 하둡 3.0) 위에 올라가는 어플리케이션
  • Spark 프로그래밍 개념
    • RDD (Resilient Distributed Dataset)
      • 로우레벨 프로그래밍 API로 세밀한 제어가 가능
      • 하지만 코딩의 복잡도 증가
    • Dataframe & Dataset (판다스의 데이터프레임과 흡사)
      • 하이레벨 프로그래밍 API로 점점 많이 사용되는 추세
      • SparkSQL을 사용한다면 이를 쓰게 됨
    • 보통 Scala, Java, Python 중의 하나를 사용
      • PySpark 모듈
  • Spark 세션
    • Spark 프로그램의 시작은 Spark 세션(SparkSession)을 만드는 것
    • Spark 세션을 통해 Spark이 제공해 주는 다양한 기능을 사용
      • Spark 콘텍스트, Hive 컨텍스트, SQL 컨텍스트
      • Spark 2.0 전에는 기능에 따라 다른 콘텍스트를 생성해야 했음
from pyspark.sql import SparkSession

spark = SparkSession \
	.builder \
    .appName("Python Spark create RDD example") \
    .config("spark.some.config.option", "some-value") \
    .getOrcreate()
sc = spark.sparkContext

spark와 sc를 이용해 RDD와 데이터프레임을 조작하게 됨

  • Spark 데이터 구조
    • 크게 3가지의 자료구조가 존재
      • RDD (Resilient Distributed Dataset)
        • 로우레벨 데이터로 클러스터 내의 서버에 분산된 데이터를 지칭
        • 레코드별로 존재하며 구조화된 데이터나 비구조화된 데이터 모두 지원
      • Dataframe과 Dataset
        • RDD위에 만들어지는 하이레벨 데이터로 RDD와는 달리 필드 정보를 갖고 있음 (테이블)
        • Dataset은 Dataframe과는 달리 타입 정보가 존재하며 컴파일 언어에서 사용가능
          • 컴파일 언어: Scala/Java에서 사용가능
        • PySpark에서는 Dataframe을 사용함
          • SparkSQL을 사용하는 것이 더 일반적
  • Spark 데이터 구조 - RDD
    • 변경이 불가능한 분산 저장된 데이터
      • RDD는 다수의 파티션으로 구성되고, Spark 클러스터내 서버들에 나눠 저장됨
      • 로우레벨의 함수형 변환 지원 (map, filter, flatMap 등등)
    • RDD가 아닌 일반 파이썬 데이터는 parallelize 함수로 RDD로 변환

 

  • SparkSQL이란?
    • SparkSQL은 구조화된 데이터 처리를 위한 Spark 모듈
    • 대화형 Spark 셸이 제공됨
    • 하둡 상의 데이터를 기반으로 작성된 Hive 쿼리의 경우 변경 없이 최대 100배까지 빠른 성능을 가능하게 해 줌
    • 데이터 프레임을 SQL로 처리 가능
      • RDD 데이터는 결국 데이터 프레임으로 변환한 후에 처리 가능
      • 외부 데이터 (스토리지나 관계형 데이터베이스)는 데이터프레임으로 변환한 후 가능
      • 데이터프레임은 테이블이 되고 (특정 함수 사용) 그다음부터 sql함수를 사용가능
  • SparkSQL 사용법 - 외부 데이터베이스 연결 (1)
    • 외부 데이터베이스 기반으로 데이터 프레임 생성
      • SparkSession의 read 함수를 사용하여 테이블 혹은 SQL 결과를 데이터프레임으로 읽어옴
    • Redshift 연결 예제
      • SparkSession을 만들 때 외부 데이터베이스에 맞는 JDBC jar을 지정
      • SparkSession의 read 함수를 호출
        • 로그인 관련 정보와 읽어오고자 하는 테이블 혹은 SQL을 지정
        • 결과가 데이터 프레임으로 리턴됨
      • 앞서 리턴된 데이터프레임에 테이블 이름 지정
      • SparkSession의 sql 함수를 사용
  • SparkSQL 사용법 - 외부 데이터베이스 연결 (2)
    • SparkSession을 만들때 외부 데이터베이스에 맞는 JDBC jar을 지정
from pyspark.sql import SparkSession

spark = SparkSession \
	.builder \
	.appName("Python Spark SQL basic example")\
	.config("spark.jars",
"/usr/local/lib/python3.6/dist-packages/pyspark/jars/RedshiftJDBC42-no-awssdk-1.
  • SparkSQL 사용법 - 외부 데이터베이스 연결 (3)
    • Spark Session의 read 함수를 호출(로그인 관련 정보와 읽어오고자 하는 테이블 혹은 SQL을 지정) 결과가 데이터 프레임으로 리턴됨
df_user_session_channel = spark.read\
	.format("jdbc")\
	.option("driver", "com.amazon.redshift.jdbc42.Driver")\
.option("url, ...
  • SparkSQL 사용법 - SQL 사용 방법
    • 데이터 프레임을 기반으로 테이블 뷰 생성: 테이블이 만들어짐
      • createOrReplace TempView: sparkSession이 살아있는 동안 존재
      • createGlobalTempView: Spark 드라이버가 살아있는 동안 존재
    • Spark Session의 sql 함수로 SQL 결과를 데이터 프레임으로 받음

Big Data: Spark MLlib 소개와 머신러닝 모델 빌딩

  • Spark MLib 소개 (1)
    • 머신러닝 관련 다양한 알고리즘, 유틸리티로 구성된 라이브러리
      • Classification, Regression, Clustering, Collaborative Filtering, Dimensionality Reduction.
      • 아직 딥러닝은 지원이 미약
    • 여기에는 RDD 기반과 데이터프레임 기반의 두 버전이 존재
      • spark.mllib vs. spark.ml
        • spark.mllib가 RDD 기반이고, spark.ml은 데이터프레임 기반
        • spark.mllib는 RDD위에서 동작하는 이전 라이브러리로 더 이상 업데이트가 안됨
      • 항상 spark.ml을 사용할 것
  • Spark MLlib의 장점
    • 원스톱 ML 프레임워크
      • 데이터프레임과 SparkSQL 등을 이용해 전처리
      • Spark MLlib를 이용해 모델 빌딩
      • ML Pipeline을 통해 모델 빌딩 자동화
      • MLflow로 모델 관리하고 서빙
    • 대용량 데이터도 처리 가능
  • Spark MLlib 소개: MLflow
    • 모델의 관리와 서빙을 위한 Ops 관련 기능도 제공
    • MLflow
      • 모델 개발과 테스트와 관리와 서빙까지 제공해 주는 End-to-End 프레임워크
      • MLflow는 파이썬, 자바, R, API를 지원
      • MLflow는 트래킹(Tracking), 모델(Models), 프로젝트(Projects)를 지원
  • Spark MLlib 제공 알고리즘
    • Classification:
      • Logistic regression, Decision tree, Randaom forest, Gradient-boosted tree, …
    • Regression:
      • Linear regression, Decision tree, Random forest, Gradient-boosted tree, …
    • Clustering:
      • K-means, LDA(Latent Dirichlet Allocation), GMM(Gaussian Mixture Model), …
    • Collaborative Filtering
      • 명시적인 피드백과 암묵적인 피드백 기반
      • 명시적인 피드백의 예) 리뷰 평점
      • 암묵적인 피드백의 예) 클릭, 구매 등등

→ 명시적인 피드백을 하는 게 좋지만, 그렇지 못할 시엔 암묵적인 피드백이 진행됨

'BOOTCAMP > 프로그래머스 인공지능 데브코스' 카테고리의 다른 글

[16주차] NLP II와 Visual Recognition  (0) 2023.07.21
[15주차] NLP  (0) 2023.06.28
[13주차] monthly project3  (0) 2023.06.28
[12주차] SQL과 데이터분석  (0) 2023.06.27
[11주차] CNN & RNN  (0) 2023.06.27