# 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 * 자산 소유기간 동안의 운영 비용