devthewild

Spark로 빅데이터 입문, 5주차 및 후기

5주차. 스파크로 머신러닝 시작

이번 주의 제목은 노트가 아니라 메모 겸 후기다. 5주차에는 수업이 없고 과제와 퀴즈만 있다.

Lab 4. 스파크로 머신러닝 시작

영화 목록과 평점 이력을 트레이닝 셋으로 해서 내가 영화 평점을 몇 개 입력해서 다른 영화의 내 평점을 예측하도록 기계학습을 해보는 과제이다. 스파크의 머신러닝 라이브러리(MLlib)에서의 협업 필터링(Collaborative Filtering) 에서는 ALS(Alternating Least Squares)라는 알고리즘을 사용하는데, 유사도를 평가하는 데는 평균 제곱근 오차(Root Mean Square Error; RMSE) 라는 방법을 사용한다. 정확한 의미는 이해하지 못했지만, 순서대로 따라가니 풀 수 있었다.

Lab 4. Quiz

RMSE의 값에 대한 의미(예상값과 실제값이 같을 때의 결괏값)를 묻는 간단한 문제들이었다.

후기

세 번째 과제를 진행하다가 TF-IDF에 대한 이해가 부족해서 자료를 찾다가 영어로 된 글을 계속 읽다 보니 지루해져서 계속 미뤘는데, 결국 기한을 넘겨서 그냥 하던 데 까지만 제출했다. 그래서 이번 과제는 알고리즘(ALS)에 대한 이해가 부족해도 그냥 최대한 설명을 자세히 읽고 이리저리 시도해보다가 다 풀긴 했다.

내용을 다 이해하지는 못했지만, 좋은 입문 강의다. 강의 시작에서 언급했듯이 파이썬 기본 문법 정도만 알고 있으면 진행하는 데 큰 무리는 없을 것이라 생각한다. 어차피 기초적인 개념부터 설명하는 강의라, 과제할 때 파이썬 문법의 문제인지 스파크를 잘못 사용한 것인지에 대해 구분할 수 있을 정도면 되지만, 그렇지 않을 때는 어렵다기보다 상당히 까다로울 것이다.

기초적인 개념부터 설명한다고 위에서 말했지만, 개념과 역사, 사례를 넓게 훑고 지나가면서 책, 논문 등의 자료들을 레퍼런스로 많이 소개해서 깊게 알고 싶은 분야에 대한 좋은 진입점을 제시해준다. 당연히 입문 강의는 그렇다고 생각하지만 A to Z로 가르쳐주길 원하는 사람에게는 맞지 않는 강의다.

가장 마음에 들었던 것들을 꼽자면, 하나는 모든 강의가 5분 내로 되어있다는 점이고 나머지 하나는 FPPiS처럼 과제가 단계별 테스트로 되어있다는 점이다.

입문 강의라 많은 개념을 깊게 설명할 수 없으므로 개념별로 간단하게 설명을 하기 지나가는데, 덕분에 지하철/버스에서 이동 중에 틈틈이 듣고 나중에 1.5배속으로 빠르게 복기하면서 퀴즈를 풀면 두세 번 반복하는 느낌이라 오래(과제가 끝나기 전까지) 기억에 남는다. 이동하는 시간은 어차피 낭비하는 시간이라고 생각했는데 꽤 요긴하게 쓰였다.

그리고 단계별 테스트로 되어있다는 것도 입문 과목에서 큰 장점이라고 생각하는데, 과제를 던져주고 알아서 해결하는 방법을 찾는 것도 중요하지만 가장 정석적인 단계를 알려주기 위해서는 과제를 단계별로 나누고 각각의 단계를 어떻게 진행할지에 대한 설명을 사이사이에 주고, 하나가 통과해야 그다음으로 넘어갈 수 있으니 다음 문제를 보고 이전 문제의 의도를 가늠해볼 수 있기도 하다. 물론 하나가 막혀버리면 그다음의 모든 것을 못한다는 게 단점이지만 그렇게 난이도 조절을 못 한 과제는 아니라고 생각한다.


사실 다 마치고 나서도 이제 무엇을 해야할지 막막하지만, 소재의 문제이지 방법에 대한 것은 한번 과정을 거쳤으니 어떤 식으로 접근해야 할지에 대한 감을 대충 알았다.

참고로 edX에서는 한 학교가 주제에 따라 코스웍을 제공하는 X시리즈 인증이 있는데, 이 강의(CS100.1x)는 Berkeley에서 진행하는 빅데이터 코스인 BerkeleyX의 두 단계 중 첫 번째다. 두 번째 단계(CS109.1x)는 확장 가능한 머신 러닝(Scalable Machine Learning) 이라는 제목으로 29일부터 시작한다. 수학적 사고와 알고리즘 개념, 그리고 기본적인 머신 러닝에 대한 개념이 필요하며, 알고리즘, 확률, 선형대수, 미적분을 접해본 적이 있고, 파이썬 경험이 있거나 빠르게 익힐 수 있으면 된다. 듣긴 하겠지만, 이 과목처럼 완주하겠다는 생각으로 듣는 것은 아니고 재미있는 부분까지만.

Spark로 빅데이터 입문, 4주차 노트

4주차. 데이터 품질, 탐헌적 데이터 분석과 머신 러닝

Lecture 7. 데이터 품질

데이터 클리닝

  • 왜곡: 처리과정에서 변질된 표본들
  • 선택편견: 값에 따른 표본의 가능도(likelihood)
  • 좌우검열: 데이터가 무한대일 때 시작과 끝을 어떻게 자를지
  • 의존성: 표본이 독립적인지 아닌지에 대한 판단
  • 정확성과 (과정의)간소에 대한 트레이드오프
  • 단위 통일, 중복 제거 등

문제

  • 텍스트 파싱
  • 같은 엔티티 다른 표현(2 vs two, NYC vs NewYork)
  • 비구조적-구조적 전환시 primary key
  • 너무 길어서 잘리는 필드
  • 형식 문제(특히 날짜)

수집

  • 과정에서 무결성 체크
  • 구조에 없는건 기본값

전송

  • 신뢰할만한 프로토콜인가
  • 받은 데이터의 확인이 가능한가(checksum)

분석의 어려움

  • 크기, 성능
  • 모델에 적용
  • 전문지식 부족
  • 다트판(때려맞추기)
  • 대충 경험(특정 상황에만 맞는 분석)

품질 측정

  • 스키마 일치
  • 정확성, 접근성, 해석가능
  • Lab2에서 정규식을 통한 형식 일치 확인

용어?

  • 개체 식별(entity resolution)
  • 중복 검출(DeDup: Detection Duplicated)

표준화

Lecture 8. 탐험적 데이터 분석과 머신 러닝

기술통계 vs 추론통계(위키피디아)

업무에서의 목적

  • 간단한 통계
  • 가설 검증
  • 분류
  • 예측

탐험적 데이터분석

  • 기본 테크닉 소개
  • 통계요약의 문제: 같은 요약이라도 다른 데이터일 수 있다

정규 분포

  • 평균, 표준편차
  • 중심극한정리(Central Limit Theorem): n이 무한대로 가면 정규분포에 가까워진다.

다른 중요한 분포

Spark의 mllib

  • NumPy와 함께 사용가능(pySpark >= 0.9)
  • 여기에서는 영화평점 예측
    • collaborative filtering
    • k rank = user(a) x movie feature(b)

Lab 3. 텍스트 분석과 개체 식별

  1. 텍스트 유사성으로 개체 식별 - Bags of Words
  1. 텍스트 유사성으로 개체 식별- TF-IDF를 사용한 가중치 적용된 BOW
  1. 텍스트 유사성으로 개체 식별- 코사인 유사도(Cosine Similarity)
  2. 역참조(inverted index)를 통한 효율적인 개체 식별
  3. 그래프(plot)을 통한 결과 분석

Lab 3. 퀴즈

Lab 3에서 배운 것들 재확인


pySpark Docset

  • Dash용 pySpark API문서
  • 설정의 다운로드 -> 좌하단의 사용자 제공(User Contibuted) -> pySpark 검색

Spark로 빅데이터 입문, 3주차 노트

Lecture 5. 반구조적 데이터

자료 형태

  • 구조적: 정형(schema) 데이터. RDB, formatted msg
  • 반구조적: schema를 그때그때. XML, JSON, mp3tag
  • 비구조적: plain text

파일이란

  • byte의 나열
  • FS를 통한 상하구조
  • POSIX interface(이건 왜?)

테이블

  • 처음부터 구조를 잘 짜야
  • 같은 데이터도 타입문제(2 vs 2.0)
  • 이력관리

취합 문제

  • 필드가 다를 때
  • 데이터 단위가 다름
  • 같은 값인데 표현이 다름

pandas

  • data analysys + modeling for python
  • DataFrame: named column
  • R도 비슷한 data frame 지원

DF in pySpark

  • 1.3부터 RDD 확장으로 지원
  • pandas, R의 DF와 같지만 분산환경
  • pandas DF와 convert 쉬움
  • pandas -> pySpark시 driver 메모리 꽉 찰 수 있음 주의
  • RDD는 Scala구현체가 Python구현체보다 두 배 이상 빠름
  • DF는 RDD Scala보다 두 배쯤 빠르고 Py/Scala 비슷

Apache Common Log Format의 데이터를 분석해보자

  • 컨텐츠 통계: status code, size
  • 404 횟수
  • 하루에 단일host는 얼마나?
  • 하루에 요청은 얼마나?
  • 호스트당 평균 요청은?
  • 하루에 404는?

로그 마이닝

  • splunk를 통해 event log, disk error, network, cpu/memory usage 등 통계 및 분석

read/write

  • binary가 항상 빠르다
  • 압축 알고리즘과 rw속도는 어느 정도 trade-off

Lecture 6. 구조적 데이터

RDB

  • relation: schema + instance
  • sparse에 약하다

SQL 기초

  • select, (inner, outer)join
  • join in Spark
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
x = sc.parallelize([("a", 1), ("b", 4)])
y = sc.parallelize([("a", 2), ("a", 3)])
x.join(y).collect
// [('a', (1, 2)), ('a', (1, 3))]

x = sc.parallelize([("a", 1), ("b", 4)])
y = sc.parallelize([("a", 2)])
x.leftOuterJoin(y).collect()
// [('a', (1, 2)), ('b', (4, None))]

x.rightOuterJoin(y).collect()
// [('a', (1, 2))]

x = sc.parallelize([("a", 1), ("b", 4)])
y = sc.parallelize([("a", 2), ("c", 8)])
x.fullOuterJoin(y).collect()
// [('a', (1, 2)), ('c', (None, 8)), ('b', (4, None))]

Lab 2. 로그 분석

Apache Log Format을

  1. 정규식으로 나눠서
  2. 종류별 aggregation
  3. key, value로 나눠서 plot
  4. 그리기 위해 2, 3번의 반복이 많아 분량에 비해 생각할꺼리는 적음
  5. 아마도 python 사용에 익숙치 않은 사람들을 위한 단순반복으로 추정

tip.

저번 과제에 비해 데이터가 커서연산할 때 시간이 많이 걸리므로 REPL이나 편한 python 툴을 꺼내놓고 기다리면서 다음 셀에서 어떻게 하면 될지 간단히 테스트해보면 좋다.


Spark로 빅데이터 입문, 1-2주차 노트

edX에서 Spark로 빅데이터 입문(Introduction to Big Data with Apache Spark)을 듣고 있다. UC Berkeley의 Anthony Joseph 교수가 진행하는 수업으로, 실제 데이터를 가지고 과제 4개를 진행하면서 Spark로 빅데이터 분석하는 방법을 배운다고 하는데, 수업 난이도 자체는 높지 않다. 대상은 Python 경험자로 분산 컴퓨팅/Spark에 대한 지식은 없어도 된다고 되어있다. 환경 설정도 Jupyter(IPython Notebook의 새 이름)와 PySpark가 이미 세팅된 환경을 Vagrant로 제공해주는데, Vagrant의 이름만 알고 있는 정도였지만 동영상에서 OS별로 제공하는 동영상을 보고 따라하는데 무리는 없었다.

실습은 노트북 파일에서 비어있는 부분을 채우면서 진행하면 되는데, 의도에 대한 설명은 코드 위에 충분히 자세하게 되어있고 단계별 진행이다보니 정확히 읽지 않아도 코드를 보면서 따라가면 유추가 가능하다. 단순히 유행어(Buzzword) 이상으로 Big Data나 Spark에 대해 배워보고 싶은 사람들에게 추천할 겸, 몇달 뒤에 잊어먹을 나 자신을 위해서 기록을 남겨본다.

1주차

환경설정: Jupyer + PySpark가 세팅된 vagrant 올리기

수업 목표

  • Data Science를 배워보자
  • 실제 데이터를 다루는 과정
  • Spark(w/ mllib)를 써보자

Lecture 1. Big Data와 Data Science 소개

  • 데이터 분석의 역사
  • 원인 ≠ 상관관계
  • 충분한 데이터가 필요
  • 현재를 분석하는건 쉽고 미래를 예측하는건 어렵다
  • 사건에 대한 중요한 요인을 모두 알고 있어야한다
  • (MySpcae 사례를 통한 페이스북 유행시기 추정 -> 실패)

빅데이터는 어디에서?

  • 사용자들이 올리는 컨텐츠들(웹/모바일) - 페이스북, 인스타그램, 옐프
  • 생체정보/과학쪽 연산

그래프 데이터

  • 많은 데이터들이 그래프 구조
  • SNS, 네트워크 등

사람이 보기에 너무 많은 정보

  • 아파치 서버 로그
  • IoT의 센서 측정기록

빅데이터를 어떻게 다룰까

  • Crowdsourcing
  • Physical modeling
  • Sensing
  • Data Assimilation

많은 사람들에게서 정보를 얻어 분석한 다음에 중요한 정보를 시각화

Lecture 2. Data Science는 어떻게? 데이터 준비하기

  • 코딩 + 도메인 지식만으로는 잘못된 분석의 가능성
  • Data Science = 코딩 + 도메인 + 통계지식

The Data Science Venn Diagram

Database와 Data Science의 차이

  • 데이터가 중요하다 / 싸다
  • 원자성이 중요 / 결과적으로 유지만되면 오케이
  • 과거를 조회 / 미래를 예측
  • 정해진 복잡도 / 하다보면 됨

방법

  • Jim Gray 모델 vs Ben Fry 모델 vs Jeff Hammerbacher 모델

어려움

  • 실제 데이터는 너무 더러움
  • 이전에 발견한 패턴/가설이 선입견

준비: ETL

  • extract: 데이터 추출
  • transform: 가공
  • load: 모아놓는다

2주차

Lecture 3. 빅 데이터, Spark

왜 필요한가?

  • 페이스북의 하루 로그는 60TB
  • 이제 머신 하나에서 다룰 수 없다

거대한 문서에서 단어를 세는 예제

  • 머신 n-to-1
    • 문단 별 단어 카운트는 n개에서 나눠서 해도 된다
    • 합치는 작업을 1개에서 한다면 병목
  • 머신 n-to-n
    • 합치는 작업도 단어별로 n개에서 나눠서
    • 이게 Map/Reduce 개념
  • 문제
    • 머신끼리 데이터 보내는건 느리다
    • 하나가 실패하면? -> 그 머신만 다시 시작
    • 하나가 느리면? -> 하나 더 돌리고 먼저 끝난걸 선택
  • 문제 2
    • 작업을 반복해서할 때 디스크에 저장하면 I/O가 병목
    • 메모리에 올려서 작업하면? -> Spark

Spark

  • 위에서 말한 실패하거나 느린 노드를 자동으로 처리
  • Core와 컴포넌트 4개 Spark SQL, Spark Streaming, MLlib, GraphX로 구성
  • disk에 넣기 위해 serialization/deserialization 할 필요가 없으므로 100배 이상 빠르다

특징

  • 다양한 경우에 쓸 수 있는 엔진
  • 리니지(immutable을 이용한 이력관리)의 lazy eval

Lecture 4. Spark 기초

  • 어플리케이션(driver)에서 SparkContext로 시작
  • worker는 클러스터 혹은 로컬 스레드
  • 분산된 worker의 추상화가 RDD

맨 처음 실행하면

  • SparkContext 객체의 인스턴스 sc 생성
  • sc로 로컬의 worker 접근, 혹은 hdfs, mesos 접근

RDD는

  • 만들어지면 불변
  • transform되는 과정(lineage)을 추적해서 재사용 가능
  • 파티션을 설정하면 그만큼 병렬처리

연산은

  • transformation, action 두 종류
  • transform: lazy eval, action까지 미뤄둠
  • persis(cache)는 메모리/디스크 저장
1
2
data = [1, 2, 3, 4, 5]
rDD = sc.parallelize(data, 4)

혹은

1
file = sc.textFile("README.md", 4)

transformation

  • map, filter, distinct, flatMap,

action

  • 바로 계산
  • reduce, take, collect, takeOrdered
1
2
3
lines = sc.textFile("...", 4)
comments = lines.filter(isComment)
print lines.count(), comments.count()

lines 연산을 한번, lines+comments 연산을 한번해서 중복. 그럴 때는 중간에 lines.cache()

key-value transformation

  • reduceByKy, sortByKe, groupByKey
  • groupByKey는 데이터가 이동하므로 네트워크/대량에서는 주의
1
2
rdd // [(1,2), (3,4), (3,6)]
rdd.reduceByKey(lambda a, b: a + b) // [(1,2), (3,10)]

closure

  • broadcase: driver가 쓰면 worker들이 읽기 가능
  • accumulator: worker들이 쓰기만 가능 driver만 접근가능

Lab 1. Spark 과제

구텐베르크 프로젝트에서 셰익스피어 전집의 데이터로 단어 세기

  • 특수문자 제거
  • 띄어쓰기로 단어 구분
  • 중복 제거를 위해 소문자로 변환
  • 최빈 15개 단어

참고로 강의노트(PDF)가 공개되어있다.