NoSQL
•
NoSQL은 consistency를 speed와 맞바꾼 것이다.
•
large scale computing을 할 때 distribute computation을 해야한다.
•
필요한 소프트웨어 스택
◦
분산 파일 시스템
▪
큰 블럭, 데이터 복제, 미디어 실패를 막기위한 redundancy 등
◦
MapReduce programming 시스템
▪
hardware failure에 대응하고 cluster를 효율적으로 computing 해야함
•
physical organization of compute nodes
◦
파일은 redundantly하게 저장되야함
◦
연산은 태스크로 나눠져야하는데, 하나의 태스크가 실패해도 다른 태스크에 영향을 주지 않고 다시 시작될 수 있어야한다.
•
Distributed File System
◦
기본적으로 파일이 업데이트가 덜 되고 많이 읽히거나 추가되야한다.
◦
file은 chunk로 나뉜다. 보통 64메가 단위. chunk는 다른 컴퓨트 노드에 복제된다. 다른 컴퓨팅 노드도 다른 랙에 위치해야한다.
◦
master node
▪
chunk 파일을 찾는데 사용되는 파일
▪
마스터 노드도 복제될 수 있다..
◦
client library for file access
▪
마스터에게 chunk 서버를 찾으라고 말하는 것
▪
directly connect할 수 있다.
•
구현
◦
GFS → 구글
◦
HDFS → 하둡
MapReduce
1.
task를 mapping하기
2.
key에 대해서 묶기
3.
task reducing해서 결과 내기
•
Word counting
◦
map: input을 읽어서 key-value pair를 생산
◦
group by key: 같은 키에 대해서 pair를 묶기
◦
reduce: 키에 대한 모든 값들을 묶어서 output으로 만들기
•
Workflow systems
◦
MapReduce를 확장해서 acyclic network of function을 만드는 것
•
workflow는 completion이 되면 아웃풋을 deliever하는 거다.
•
task fail이 나면 아무것도 전달되지 않는다.
•
master controller는 그러면 실패한 애들을 restart를 하면 됨.
Apache Spark
•
Resilient distributed dataset (RDD)
◦
스파크의 핵심 데이터 추상화
◦
한 타입의 오브젝트 파일이다.
◦
function으로 넘어가는 애들
◦
여러 chunks로 분리될 수 있고, 다른 컴퓨팅 노드에 있다.
◦
스파크는 RDD에 대한 손실에 resilient하다.
•
Spark program
◦
Transformation: RDD에서 RDD를 생산하는 function
◦
Actions: RDD를 특정한 데이터로 바꾸는 작업
•
Map
◦
function을 파라미터로 받아서 RDD에 돌아가면서 적용하는 거다.
◦
MapReduce의 Map과는 다름
▪
MapReducesms 1:N이 됬는데, Spark에서는 1:1만 됨.
•
Flatmap
◦
MapReduce의 Map과 비슷하게, object를 특정한 리스트로 mapping 시킴
◦
그래서 RDD object에 대해서 flatten 해진다.
•
Filter
◦
Transformation인데 특정한 걸 걸러내는데 쓰임
•
Reduce
◦
action으로써 RDD 대신 value를 return함.
◦
받는 function type이 (V,V) ⇒ V임.
•
관계형 operation 도 몇 개 있다
◦
Join
▪
각 키쌍에 대해서 조인처럼 해줌.,
◦
GroupByKey
▪
각 키쌍에 대해서 key로 정렬을 해줌.
•
MapReduce랑 비교
◦
RDD가 chunk로 나뉘고, 다른 computing node로 가는 거는 비슷하다.
◦
RDD에 대한 transformation 또한 chunk에 대해서 Parallel하게 가는 것도 같다.
◦
두 가지 나아진 점
▪
Lazy evalution of RDD
•
실제로 action이 수행되는 시점에 RDD가 생성된다.
•
마지막에 저장이 될 때 메모리에서 필요한 만큼 읽어서 쭉 연산을 하고 drop하는 식
•
이러면 중간중간 disk에 저장할 필요도 없고, 시간도 준다.
▪
Lineage for RDD
•
lazy evaluation을 위해 RDD간 관계를 저장해놓기 때문에, 중간 단계가 유실되면 그 전꺼에서 reconstruct를 하면 된다.
•
왜 중간 에 저장을 하지 않나요?
◦
빠른 스피드를 위해 complex revoery를 trade off하는게 일반적으로 더 좋다.
◦
빠르게 동작할 수록 failure 기회가 적어진다.
◦
중간 결과를 저장하는게 long period로 파일 storage를 관리해야한다,.