============= 2 주차 ======================
복습
빅데이터 (사람에 의해서 생긴 데이터들) -> 나중엔 센서에 의해서도 데이터가 생성됨 3V, 빅데이터 분석 과정
빅데이터 처리
- 결함 허용 시스템 (Fault Tolerance)
- 저 비용 시스템(Cost Effective System)
- 수직 확장(Scale Up)
- 수평 확장(Scale out))
-
기존 시스템과 연계성
2주치 시작 책 : Haddop The Definitive Guide 책 23P ~
많은데이터 > 좋은 알고리즘
빅데이터 처리 시스템 원조 : 하둡 (Hadoop) -> 역사
2003 : 구글 파일 시스템 (GFS) <- HDFS가 이걸보고 만듦
2004 : 구글 맵리듀스 (MapReduce)
2004 : 아파치 넛지 (Nutch) 프로젝트
2006 : 야후 하둡 프로젝트 탄생 (더그 커팅)
2008 : 클라우데라(Cloudera) 창립
2011 : 호튼웍스 (Hotonworks) 창립
- 하둡(Hadoop)
대용량의 데이터를 분산 병렬 처리 방식으로 여러 개의 작업 노드에 작업을 분산하여 병렬 수행할 수 있는 프레임워크를 제공 Master - Slave(Woker) 구조로 데이터를 분산 처리
한대가 장애가 나더라도 작업을 분산처리 하기 때문에 결함 허용 시스템이 적용되어 있음
하둡1.0
</img>
Processing Layer(MapReduce layer)과 Storage Layer(HDFS layer)를 나눠서 처리하도록 설계
mater : jab tracker 와 name node가 main 업무
slave : 데이터 처리하도록
Name node : Name Space를 관리하는 노드
AWS 사용하기
학생 계정 AWS</img>
AWS student 계정으로 계정 생성하면 100$ 무료 사용 가능
3주차
MapReduce
대용량을 저장하기 위한 시스템
괜찮은 시간안에 모든 데이터를 보고 분석할 수 있음.
실시간 (대화형)분석에는 적합하지 않음
한번 쓰고 여러번 읽어들이는 구조에 특화되어 있음
데이터를 처리하는 프로그래밍 모델
- 데이터 처리 방식
- word count 같은 집계하는 작업에 강함
</img>
```- 맵(Map) 단계 분산된 데이터를 키(key)와 값(value)의 리스트로 만드는 단계 map()는 데이터를 읽어들여 키 값 쌍으로 출력
- 셔플과 정렬(Shuffle and Sort) 단계 맵 단계에서 나온 중간 결과를 해당 리듀스 함수에 전달하는 단계 하둡이 수행 위 작업 후 리듀스로 전달
- 리듀스(Reduce) 단계 전달받은 리스트에서 원하는 데이터를 찾아서 집계하는 단계
개발자가 직접 정의
- 맵(Map) 함수
- 리듀스(Reduce) 함수 -> 분산처리는 하둡을 통해 자동으로
위 3단계중 부분적으로 사용도 가능
## hadoop
RDMS아 Hadoop시스템의 경계가 모호함.
Computing 변형 과정
1. Grid Computing
2. Clustering Computing
3. Cloud Computing
- split 단위는 블럭단위
- 기본 블럭사이즈는 128MB
- 작은 여러개의 파일을 읽는경우 오히려 더느릴 수 있음
<br>
Lucene 개발자가 개발을 시작 원래 Apache Nutch에서 시작
(Web Search를 위해서)
<br>
hadoop : 약어가 아니라 직접 만든것 ->
아이가 노란 코끼리인형 이름을 hadoop이라고 불러서 그걸 그대로 적용 <br>
- Nutch 프로젝트 진행시 문제점 -> 웹 페이지를 크롤링하고 유지하는데 너무 많은 비용이 듦
## 4주차 하둡
Yarm 이 데이터를 어떻게 job이 수행될지를 정해줌
map을 분산하여 나눠준 후 모든 노드가 처리를 다 끝낸 경우 리듀스에게(정렬된 파일을) 전달
블럭사이즈와 데이터 사이즈가 같으면 가장 최적
<img src="./img/skku_bigdata/hadoop01.PNG" width="350px" height="300px"></img> <br>
map의 결과는 중복저장을 하지 않기 위해 로컬에 저장하고 reduce의 결과물은 중요하기 때문에 HDFS replication으로 전달 b. node가 죽은경우 다른 node로 이동 c. rack이 죽은경우 job을 다른 node로 이동
<img src="./img/skku_bigdata/hadoop02.PNG" width="350px" height="300px"></img> <br>
- 하나의 리듀스가 있는경우
큰 데이터 하나를 3개로 스플릿 (YARN이 스플릿 및 job할당을 관리)
-> 3개의 map이 생김
-> 정렬 후 로컬에 데이터 전달 후에 리듀스로 전송
-> 리듀스에서는 받은 데이터를 merge한 후 reduce 함수가 처리를한 결과를 part0로 전달
-> part0의 결과를 HDFS로 file write
결과물은 중요하기때문에 신뢰성을 가지기 위해서
<img src="./img/skku_bigdata/hadoop03.PNG" width="400px" height="400px"></img> <br>
- 멀티플 리듀스 테스크의 경우 리듀스의 개수만큼 파티션이 생김
각각의 맵이 리듀스 개수만큼 나눠서 작업한 후 각각의 리듀스로 전달 yarn -> 각 프로세스로 모든 노드에 저장되있어서 각 싱크가 자동으로 됨
<img src="./img/skku_bigdata/hadoop04.PNG" width="450px" height="400px"></img> <br>
- 리듀스 테스크가 없는경우
HDFS에게 write를 함 (리듀서가 없어서 최종 결과물이기 때문에 )
> Combiner Function
Map 하고 Reduce task 사이의 데이터 전송을 최소화 할 필요가 있음 (네트워크 속도 업 or Map의 사이즈를 감소) ex)
- 기존 방식 map1 (1950, 0) (1950, 20) (1950, 10) map2 (1950, 25) (1950, 15) -> reduce로 전송 (1950, [0, 20, 10, 25, 15]) -> (output) (1950, 25)
-
Combiner Function 각 맵에서 최대값을 구해서 전달 reduce는 (1950, [20, 25])를 전달받아 MAX를 구함
-
모든 경우에는 다 적용할 수 없음 ex) 평균을 구하는 경우 적용 불가 -> 프로그램 구조를 바꾸면 적용은 가능 ex) 평균시에는 각 맵에서 평균, 개수 를보내면 평균을 구할 수 있음 (단, 새로운 프로그래밍을 필요로 함)
- Combiner Function 적용 방법
job.setCombinerClass(MaxTemperatureReducer.class);
위 라인 한줄만 추가하면 됨 (Combiner Function 사용함을 알리는 역할)
> Hadoop Streaming
Hadoop Streaming : java, ruby, python을 지원하는 api 파일 형식의 input, output이 아닌 Standard IO방식 -> command line에서 데이터 입력
> HDFS
HDFS : The Hadoop Distributed Filesystem (하둡 분산파일 시스템)
- 파일의 접근 제어
- 파일의 CRUD
- 파일을 디스크의 어디에 저장할지
- 디렉토리의 구조를 제공하고 관리
파일을 저장해야하는데 DISK의 크기보다 저장해야할 파일의 크기가 큰경우의 문제를 해결하기 위해 개발을 시작 -> 네트워크로 연결된 여러 머신의 스토리지를 관리하는 파일 시스템
- HDFS 설계원칙
- Very Large File
- Write Once, Read Many Times Pattern
- Fault-Tolerance -> 당연히 위 설계원칙으로 인하여 약점이 생김
- Low-latency Data Acess
빠른 접근이 필요한 경우 - Lots of Small Files 작은 파일 사이즈의 파일들이 많은 경우 (작은 => 블록사이즈보다 작은 파일)
- Multiple Writers, Arbitrary File Modifications
여러개의 파일을 쓰거나 임의의 위치에서 데이터 수정이 어려움
> Block
Block : 한번에 읽고 쓸 수 있는 데이터의 최대량
- 기본적으로 128M
HDFS Block을 Chuck라 하고 각 Chuck는 독립적으로 저장함
> Name Node
Master node에서 파일시스템의 namespace를 관리함 image와 edit log라는 두 종류의 파일로 로컬 디스크에 영속적으로 저장
block의 위치정보는 시스템이 시작할 때 모든 Data node로부터 받아서 재구성하기 때문에 디스크에 역속적으로 저장하지는 않음
> Data Node
Worker node에서 HDFS 클라이언트나 Name node의 요청이 있을 때 block을 저장하고 탐색 Block의 목록을 주기적으로 Name Node에 보고
# 4주차 하둡
> Block
한번에 읽고 쓸 수 있는 데이터의 최대량 HDFS Block의 크기 ✓기본적으로 128MB ▪ Block이 큰 이유는 seek 비용을 최소화히기 위함 ✓ HDFS Block을 Chuck라 하고 각 Chuck는 독립적으로 저장됨
> Name Node
Master node에서 파일시스템의 namespace를 관리함
➢ block의 위치정보는 시스템이 시작할 때 모든 Data node로부터 받아서 재구성하기 때문에 디스크에 영속적으로 저장하지는 않음
> Data Node
➢ Worker node에서 HDFS 클라이언트나 Name node의 요청이 있을 때 block을 저장하고 탐색함 ➢ 저장하고 있는 Block의 목록을 주기적으로 Name node에 보고함
> HDFS에 디렉토리 생성
- Local 파일시스템에서 HDFS로 복사 % hadoop fs -copyFromLocal input/docs/quangle.txt hdfs://ocalhost/usr/tom/quangle.txt
- HDFS에 디렉토리 생성
%hadoop fs -mkdir books
%hadoop fs -ls
```
HDFS의 Interfaces
</img>
ZooKeeper
HDFS의 HA를 하기위해 사용
YARN
빅데이터 스케줄링 및 시스템 구성을 도와주는 역할
HADOOP 설치
jdk 설치
sudo apt-get update sudo apt-get install openjdk-8-jdk
hadoop 설치
wget http://apache.mirror.cdnetworks.com/hadoop/common/hadoop-3.2.1/hadoop-3.2.1.tar.gz tar -xzvf hadoop-3.2.1.tar.gz sudo mv hadoop-3.2.1 /usr/local/hadoop
hadoop 환경 설정
vim /etc/environment (편집)
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/local/hadoop/bin:/usr/local/hadoop/sbin"
JAVA_HOME="/usr/lib/jvm/java-8-openjdk-amd64/jre/"
./bashrc (가장 하단에 추가)
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/jre
export HADOOP_HOME=/usr/local/hadoop
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
Spark 설치
wget http://apache.mirror.cdnetworks.com/spark/spark-3.0.0-preview2/spark-3.0.0-preview2-bin-hadoop3.2.tgz
tar -xvzf spark-3.0.0-preview2-bin-hadoop3.2.tgz
cd spark-3.0.0-preview2-bin-hadoop3.2/bin/
- spark 실행
./spark-shell
PySpark 설치하기
- python3 우선 설치
$ sudo apt-get install python3
$ sudo apt-get install python3-pip
$ sudo pip3 install --upgrade pip
- pyspark 설치
$ pip3 install pyspark --user
$ sudo apt-get -y install ipython3
- ipython 실행 후 pyspark 실행해 보기
$ ipython3
In [1]: import pyspark
In [2]: pyspark.__version__
Out[2]: '2.4.4'