# 2주차
## 시작하기 전
* 요즘은 GPU의 시대
* GPU는 단순한 일을 많은 프로세서가 병렬적으로 처리.
* CPU는 복잡한 일을 좋은 성능의 프로세서가 처리.
* 기술의 역사와 트렌드를 알아야 한다.
* 금융권은 직접 개발하지 않기 때문에 어떤 기술이 왜 쓰이는 지 알아야 함.
* Kubernetes&Docker는 공짜. 그 역할이 기존의 WAS(Oracle의 Weblogic, Tmax의 JEUS 등)와 겹침.
* MSA(Micro Service Architecture)를 어떻게 구축할까?
* 전자정부Framework(Spring 4.x -> 5.x(Spring Cloud, MSA구조))
* <https://www.google.com/search?q=%EA%B8%88%EC%9C%B5%EA%B6%8CMSA&oq=%EA%B8%88%EC%9C%B5%EA%B6%8CMSA&aqs=chrome..69i57.2084j0j7&sourceid=chrome&ie=UTF-8>
* Cloud (As-Is: vSphere)
* 요금은 비싸지만, 관리&운영자가 줄어 노동임금이 줆. 결과적으로 TCO(총소유비용) 감소
* VMWare vSphere -> docker + Kubernetes
* docker 사용해 실습
* Utilzation Factor를 70~80% 올려야 함
* 비싼 돈 주고 장비 사고 놀게 하면 돈 낭비
* 그러기 위해선 VMWare(혹은 Docker)가 필요
* Docker가 overhead가 더 작음.
* docker(컨테이너)를 factor에 맞추어 띄운다(?)
## Spark
* 인메모리 기반의 대용량 데이터 고속 처리 엔진으로 범용 분산 클러스터 컴퓨팅 프레임워크
* MapReduce를 Java로 개발하다가 Spark(RDD)를 Scala로 개발하니 속도가 2~3배 빨라졌음
* MapReduce는 iteration할 때마다 filesystem에 써야함(디스크는 속도가 느림)
* 그 후에, Spark DataFrame이 나옴. Spark DF에선 Python과 Scala의 속도 차이가 거의 없음.
* Apache Spark: Apache에서 opensource 인큐베이팅.
* UC 버클리의 AMPlab에서 만든 경량 opensource 분산처리 프레임워크
* memory를 최대로 활용해 반복 작업에 높은 효율
* hadoop은 disk 기반, spark는 메모리 기반이라 ram 용량에 영향 받음
* 메모리로부터 map/reduce할 데이터를 불러오고, 처리 결과를 메모리로 씁니다.
* 메모리 용량 이내의 데이터를 처리할 때는 hadoop보다 빠름
* Scala 기반 (JVM 위에서 동작)
## RDD (함수)
* Resilient Distributed Dataset
* Read Only
* 데이터를 수정가능하면 유실 시 복구가 어려움
* Fault Tolerant
* 데이터 유실 시 복구 가능 (이중화가 아님)
* Mapped RDD 중 일부 데이터가 손실 되면 데이터 도출 경로(Lineage)를 통해 재계산해서 복구
* Lazy Loading
* 실제 사용하기 직전에 로딩 (최적화 기법, Spring에서도 사용)
* 예를 들어, 사용자가 접속해도 DB connection을 맺어주지 않음. 실제 query 요청이 있을 때 connection 할당.
* 예를 들어, 호텔에서 예약한 대로 오면 좋지만 예약 취소율을 감안해서 overbooking.
* a -> f() -> b -> g() -> c -> h() -> d
* b,c를 수정할 수 없음 (read only)
* c가 유실되면 a 혹은 b로부터 재계산해서 복구 (fault tolerant)
### 변환함수 / 액션함수
* 변환함수: queueing / 대부분에 해당
* 어떤 액션함수 실행 전에 queueing된 변환함수들이 실행됨
* 액션함수: 바로 실행됨
* 최소 1개는 있어야 함
### Read Only
* Spark RDD = Scala의 val (immutable)
* 즉, 함수의 입력과 출력 사이의 중간에 생기는 임시 변수들은 변경할 수 없음
## Scala
* 다중 패러다임 언어
* 함수형 / 객체지향
* 람다 함수
* 간단함 / 정의코드를 절약
* 함수형 언어
* 함수의 인자/리턴값으로 코드를 넘김.
* 변수와 함수의 구분을 없앰
* 코드 절약
* 입력 => 출력
## docker 설치
docker desktop 설치
(powershell/관리자권한)
wsl --install (Windows Subsystem for Linux)
wsl --update
* docker run
docker run -it -p 8888:8888 jupyter/all-spark-notebook
(다운로드 후에 콘솔에 찍힌 URL로 Jupyter 접속)
(웹 브라우저)
혹은 docker ps -a
docker start CONTAINER ID
docker logs CONTAINER ID
(URL 확인 후 접속)
우측 new > spylon-kernel
## ?
* (현재 회사에서) Hadoop platform에 가상화를 쓰는지?
: 사용하지 않음. Kubernetes&docker도 사용하지 않음.
* 왜 docker를 사용함?
: 환경을 동일하게 구성하여 개발/운영을 편하게 함.
A서버는 되는데 B서버는 안되는 상황 (Snowflake Server) 을 안생기게 함.
> 도커 파일 == 서버 운영 기록
도커 이미지 == 도커 파일 + 실행 시점
도커 컨테이너 == 도커 이미지 + 환경 변수
장점: 견고하고 유연성. 다른 이가 만든 서버를 SW처럼 사용. 여러 대에 배포 가능한 확장성
<https://www.44bits.io/ko/post/why-should-i-use-docker-container>
* Kubernetes 기능과 장점
* Docker: 컨테이너 기반의 opensource 가상화 플랫폼
* docker는 host에 배포. socket 파일. 포트로 오픈. 2~3대 라면 괜찮지만 서버가 많아지면 관리가 어려움.
* 컨테이너 관리도구 중 하나인 Kubernetes가 평정
<https://zzsza.github.io/development/2018/04/17/docker-kubernetes>
* 로컬 변수 / 전역 변수
* 로컬 변수: 함수 안에서 정의 (stack에 저장)
* 전역 변수: 함수 밖에서 (heap에 저장)
* 클로져: 함수의 인자로 코드를 리턴
* 코드 안에 로컬 변수
* 전역 변수가 필요한 상황일 때 사용
* VMWare S/W는 무얼 쓰는지?
: citrix virtual desktops
* TDD: Test Driven Development
* 테스트 코드 먼저 짜고, 로직 구현을 하는 것. Agile에서 사용
* 한국에선 Top-Down 방식이면서 TDD를 하라고 함
* SLA: Service Level Agreement (서비스 수준 협약서)
* TCO: Total Cost of Ownership
* 자산 소유기간 동안의 운영 비용