# Lean Startup 을 위한 docker 사용법

{% embed url="<https://paypal.me/shop2002>" %}
donation
{% endembed %}

{% hint style="info" %}
**2022년 NHN Cloud&#x20;**<mark style="color:red;">**무료**</mark>**&#x20;교육일정** : <https://doc.skill.or.kr/2022-NHN-Cloud-Education>
{% endhint %}

{% hint style="warning" %}
**2022년 NHN Cloud&#x20;**<mark style="color:red;">**행사/프로모션**</mark>**&#x20;정보 공유** : <https://doc.skill.or.kr/2022-NHN-Cloud-Event-Promotion>
{% endhint %}

## 1. Lean Startup 이란 무엇인가?           &#x20;

> 아이디어를 빠르게 최소요건제품(시제품)으로 제조한 뒤 시장의 반응을 통해 다음 제품 개선에 반영하는 전략이다.
>
> 이를 통해  짧은 시간 동안 제품을 만들고 성과를 측정해 다음 제품 개선에 반영하는 것을 반복해 성공 확률을 높이는 경영 방법론의 일종이다. 일본 도요타자동차의 린 제조(lean manufacturing) 방식을 본 뜬 것으로, 미국 실리콘밸리의 벤처기업가 에릭 리스(Eric Ries, 1979\~ )가 개발했다. 린스타트업은 「만들기 ─ 측정 ─ 학습」의 과정을 반복하면서 꾸준히 혁신해 나가는 것을 주요 내용으로 한다.
>
> **\[출처 : 네이버 지식백과]** [린스타트업](https://terms.naver.com/entry.naver?docId=1847238) (시사상식사전, pmg 지식엔진연구소)

![그림. 린스타트 순환구조 \[출처: 린 스타트업 p.71 (에릭 리스 지음 / 이창수, 송우일 옮김)\]    ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-Ma7m7VvSP2J73j4x9RU%2F-Ma7pU9EL-4ytsnGknwc%2Fimage.png?alt=media\&token=de23f243-3b04-4372-82fb-e3544d8399b2)

## 2. 소프트웨어 개발자는 왜 Docker 를 사용 하여야 하는가?    &#x20;

> 소프트웨어 개발자가 프로그램을 개발하려면 노트북 1대만 갖춰선 될 일이 아니다. 여러 명이 동시에 개발할 수 있는 환경도 필요하며, 수천명의 사용자를 상대로 내놓으려면 인프라 환경도 갖춰야 한다. 서버와 스토리지, 운영체제 등을 뒷단에서 갖추고 관리해야 하는 것이다. 이에 맞는 미들웨어와 런타임 환경을 제대로 구성하는 데 보통 수개월 이상 걸리곤 한다.
>
> Docker를 통 이용자는 몇 분에서 몇 시간 혹은 하루 정도의 시간으로 플랫폼을 손쉽게 구축할 수 있다.
>
> 즉, ***빠른 개발환경의 구축***&#xC744; 위해 Docker 를 사용 하여야 한다.
>
> **\[출처 : 네이버 지식백과]** [도커](https://terms.naver.com/entry.naver?docId=3578612) - 오픈소스 진영의 샛별 (용어로 보는 IT, 이지현)

## 3. 그럼 Docker 란 무엇인가?

> ***도커(Docker)***&#xB294; 리눅스의 응용 프로그램들을 소프트웨어 컨테이너 안에 배치시키는 일을 자동화하는 오픈 소스 프로젝트이다. 도커 컨테이너는 일종의 소프트웨어를 소프트웨어의 실행에 필요한 모든 것을 포함하는 완전한 파일 시스템 안에 감싸며 리눅스에서 운영 체제 수준 가상화의 추상화 및 자동화 계층을 추가적으로 제공한다. 도커는 cgroups와 커널 이름 공간과 같은 리눅스 커널, 또 aufs와 같은 유니언 가능 파일 시스템의 리소스 격리 기능을 사용하며, 이를 통해 독립적인 "컨테이너"가 하나의 리눅스 인스턴스 안에서 실행할 수 있게 함으로써 가상 머신을 시작하여 ***유지보수 해야 하는 부담을 없애준다.***

## 4. 가상화 vs 도커   &#x20;

> 리눅스 컨테이너 기술은 가상화와 비슷한 기술이다. 가상화 기술은 하이퍼바이저라는 기술이 반드시 있어야 한다. 하이퍼바이저는 하나의 컴퓨터에서 여러 개의 운영체제(OS)를 사용할 수 있게 도와주는 기술이다. 가상화 환경은 가장 밑단에 깔린 호스트 OS를 공유한다. 만약 게스트 OS가 네트워크를 많이 사용하는 애플리케이션을 돌리면 어떻게 될까. 한정된 호스트 OS 자원으로는 애플리케이션을 감당하기 어렵게 된다. 하이퍼바이저도 호스트 OS와 게스트 OS, 애플리케이션을 중재하는 과정에서 많은 작업을 처리하게 된다.
>
> 도커는 하이퍼바이저와 달리 게스트 OS를 두지 않고 호스트 OS 커널을 바로 사용한다. 하이퍼바이저 대신 도커 엔진이 올라가, 호스트 OS와 여러 애플리케이션을 연결해주는 역할을 한다. 따라서 도커를 사용하면 가상화보다는 내부에서 더 적은 일을 처리하고, 애플리케이션을 좀더 빠르고 효율적으로 실행시킬 수 있다. 현재 업계에선 가상화 기술과 도커가 서로 부족한 부분을 채우는 보완 기술로 발전할 것으로 보고 있다.
>
> **\[출처 : 네이버 지식백과]** [도커](https://terms.naver.com/entry.naver?docId=3578612) - 오픈소스 진영의 샛별 (용어로 보는 IT, 이지현)

![그림. 가상화 기술과 도커 기술 비교(출처 : 네이버지식백과)   ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-Ma7qevPBd28GJkBtP8p%2F-Ma7r-bu80eWRcwfQZZ-%2Fimage.png?alt=media\&token=5ae81299-6214-4ed8-97b2-9c547dff45f9)

## 5. Docker 를 사용하여 빠른 개발환경 구축 방법    &#x20;

### 5.1 TensorFlow 시스템 구축 (1분 완성)   &#x20;

#### Step 1. 사전 준비 단계    &#x20;

* 폴더 구조      &#x20;

| 메인 폴더      | 서브 폴더  | 파일                 | 설명                       |
| ---------- | ------ | ------------------ | ------------------------ |
| tensorflow |        |                    |                          |
|            | upload |                    | tensorflow 업로드 폴더 지정     |
|            | result |                    | tensorflow 저장 폴더 지정      |
|            | tmp    |                    | tensorflow 임시 저장 폴더      |
|            |        | docker-compose.yml | docker-compose.yml 설정 파일 |

{% file src="<https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-MYcWE7WbAKsONKowngx%2F-MYcWPo19KcO5WGBOOp2%2Ftensorflow.zip?alt=media&token=7ddb47c0-391d-4f49-b994-00c4cfe4f3e7>" %}

#### Step 2. Docker-compose.yml 설정        &#x20;

{% tabs %}
{% tab title="docker-compose.yml" %}
{% code title="docker-compose.yml" %}

```
version: '2' # 파일 규격 버전
services: # 이 항목 밑에 실행하려는 컨테이너 들을 정의 ( 컴포즈에서 컨테이너 : 서비스 )
 tensorflow-jupyter: # 서비스 명
  image: tensorflow/tensorflow:latest-jupyter # 사용할 이미지
  container_name: tensorflow-jupyter # 컨테이너 이름 설정
  volumes:
   - ./tensorflow/result:/tf/tensorflow-tutorials/result # result 폴더에 결과 저장
   - ./tensorflow/upload:/tf/tensorflow-tutorials/upload # upload 폴더
   - ./tensorflow/tmp:/tmp # 임시 파일
  restart: always 
  ports:
   - "8888:8888" # 접근 포트 설정 (컨테이너 외부:컨테이너 내부)
```

{% endcode %}

{% file src="<https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-MYcWE7WbAKsONKowngx%2F-MYcWK7hQsffhLZQx8zd%2Fdocker-compose.yml?alt=media&token=b53161f9-07dc-4d5b-9ba4-03be6f698dcf>" %}
{% endtab %}
{% endtabs %}

#### Step 3. Docker-compose 실행 및 중지/재시작      &#x20;

{% tabs %}
{% tab title="1. Docker-compose 실행" %}

```bash
cd ./docker-compose/
cd ./tensorflow/
docker ps 
docker-compose.exe up -d
docker ps
```

{% endtab %}

{% tab title="2. Docker-compose 중지" %}

```bash
cd ./docker-compose/
cd ./tensorflow/
docker ps
docker-compose.exe down
docker ps
```

{% endtab %}

{% tab title="3. Docker-compose 재시작" %}

```bash
cd ./docker-compose/
cd ./tensorflow/
docker ps
docker-compose.exe restart
docker ps
```

{% endtab %}
{% endtabs %}

#### Step 4. TensorFlow 접속 및 확인   &#x20;

{% tabs %}
{% tab title="1. TensorFlow 접속 token 확인" %}

```
docker logs -f tensorflow-jupyter # 실행 후 URL Log 확인    
```

![그림. tensorflow-jupyter Log 확인](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-MYcROg_pnaes6EwXYdP%2F-MYcSxuBFCIId_5kBqOj%2Fimage.png?alt=media\&token=eaadc765-f62b-440e-9e25-e41db2aee543)
{% endtab %}

{% tab title="2. TensorFlow 크롬 접속" %}

```
Docker 로그를 통해 token 을 이용하 크롬에 접속  
```

![그림. docker 로그를 통해 URL 접속 ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-MYcROg_pnaes6EwXYdP%2F-MYcTNHXfmnMfivxn6gX%2Fimage.png?alt=media\&token=5db17824-89d0-472e-84b6-c5462e6c96a2)
{% endtab %}

{% tab title="3. Jupyter 접속 화면" %}

```
크롬에 URL 을 정상적으로 입력 하면 아래와 같은 화면을 볼 수 있음 
```

![그림. 정상적으로 접속 된 화면](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-MYcROg_pnaes6EwXYdP%2F-MYcTpKfW5W53JaRHgxK%2Fimage.png?alt=media\&token=7c1901e4-39b7-47e7-b56a-86af1e951a84)
{% endtab %}
{% endtabs %}

#### Step 5. TensorFlow 실행 및 저장     &#x20;

{% tabs %}
{% tab title="1. Jupyter tutorial 리스트" %}

```
크롬 localhost:8888 접속 후 tensorflow-tutorials 폴더 확인
```

![그림. TensorFlow Tutorial 목록 확인   ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-MYnWUVOL06kB1B8jTmi%2F-MYnYJOn28yefWgheslt%2Fimage.png?alt=media\&token=544e7873-e9da-4489-bf82-68fae37b0176)
{% endtab %}

{% tab title="2. Jupyter tutorial 실행" %}

```
ipynb 파일 클릭 후 아래와 같이 확인
상단에 Run or restart 버튼을 클  
```

![그림. Jupyter 실행 및 중지/재시작](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-MYc_QmvbX8kwkI7avkM%2F-MYccDaxUrrfGn1dqxAO%2Fimage.png?alt=media\&token=5b25460d-decb-4eed-98eb-6ebbe4c3737d)

&#x20;
{% endtab %}

{% tab title="3. Jupyter tutorial 업로드" %}

```
Main 화면에서 Upload 버튼 클릭 후 파일 선택  
업로드 후에 2번과 같이 진행    
```

![그림. ipynb 파일 업로드](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-MYccRSEqyxIAvoLSAZo%2F-MYcczq6P-Xw_gi-2eeG%2Fimage.png?alt=media\&token=dc058d95-3b20-450f-a3bf-1b5f2a75b173)
{% endtab %}

{% tab title="4. Jupyter tutorial 결과 및 저장" %}

```
진행 결과 확인 
결과 확인(Running) 및 파일 저장(File > Save as)     
```

![그림. Running 탭에서 진행 결과 확인     ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-MYccRSEqyxIAvoLSAZo%2F-MYcda9qUqmKJSGT8yJW%2Fimage.png?alt=media\&token=4cbe3cc8-61f5-474b-a94a-98f7c68e6d42)

![그림. 결과 파일 저장(File -> Save as)     ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-MYccRSEqyxIAvoLSAZo%2F-MYceyGZASsVhxKkNq4b%2Fimage.png?alt=media\&token=92b4288b-adad-4565-b1a6-840eb8765163)

![그림. 저장 파일은 로컬시스템 및 가상화 시스템 경로 확인    ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-MYccRSEqyxIAvoLSAZo%2F-MYcfVgLaWBy-lPwY43k%2Fimage.png?alt=media\&token=15a15b82-18fe-47fb-a596-3c80074d4bf6)
{% endtab %}
{% endtabs %}

### 5.2 Hadoop 시스템 구축 (5분 완성)      &#x20;

#### Step 1. 사전 준비 단계    &#x20;

* 폴더 구조      &#x20;

| 메인 폴더  | 서 폴더 | 서 폴더          | 파일                 | 설명                       |
| ------ | ---- | ------------- | ------------------ | ------------------------ |
| hadoop |      |               |                    |                          |
|        | logs |               |                    | Hadoop 로그 파일 저장          |
|        | dfs  | name          |                    | NameNode 저장 위치           |
|        |      | data          |                    | DataNode 저장 위치           |
|        |      | namesecondary |                    | NameNodeSecondary 저장 위치  |
|        |      |               | docker-compose.yml | docker-compose.yml 설정 파일 |

{% file src="<https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-M_4PpfQ_uzrYhkRa3dx%2F-M_4SbDBK4kRJmGo9gI1%2Fhadoop.zip?alt=media&token=cbe275c3-9a23-4462-8ccf-8ba13828f936>" %}

#### Step 2. Docker-compose.yml 설정     &#x20;

{% tabs %}
{% tab title="docker-compose.yml" %}
{% code title="docker-compose.yml" %}

```
version: '2' # 파일 규격 버전
services: # 이 항목 밑에 실행하려는 컨테이너 들을 정의 ( 컴포즈에서 컨테이너 : 서비스 )
 hadoop-dev: # 서비스 명
  image: harisekhon/hadoop-dev # 사용할 이미지
  container_name: hadoop-dev # 컨테이너 이름 설정
  restart: always 
  volumes:
   #- ./hadoop/dfs/name:/tmp/hadoop-root/dfs/name
   #- ./hadoop/dfs/data:/tmp/hadoop-root/dfs/data
   #- ./hadoop/dfs/namesecondary:/tmp/hadoop-root/dfs/namesecondary
   - ./hadoop/logs:/hadoop/logs
  ports:
   - 8042:8042    # node
   - 8088:8088    # cluster
```

{% endcode %}

{% file src="<https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-M_4Aw7IiCgoSJWnH0fK%2F-M_4B5XR8o16zmQYG1HP%2Fdocker-compose.yml?alt=media&token=1bb296d7-49eb-4409-bd96-36b7a6c5f075>" %}
{% endtab %}
{% endtabs %}

#### Step 3. Docker-compose 실행 및 중지/재시작     &#x20;

{% tabs %}
{% tab title="1. Docker-compose 실행" %}

```bash
cd ./docker-compose
cd ./hadoop
docker ps
docker-compose up -d
docker ps
```

```bash
docker-compose up -d
Creating network "hadoop_default" with the default driver
Creating hadoop-dev ... done
docker ps
CONTAINER ID   IMAGE                   COMMAND                   CREATED         STATUS          PORTS                                                                                                                                                                                          NAMES
02b2458e15d7   harisekhon/hadoop-dev   "/bin/sh -c \"/entryp…"   8 seconds ago   Up 11 seconds   0.0.0.0:8042->8042/tcp, 8020/tcp, 9000/tcp, 10020/tcp, 19888/tcp, 50010/tcp, 0.0.0.0:8088->8088/tcp, 0.0.0.0:50070->50070/tcp, 0.0.0.0:50075->50075/tcp, 50020/tcp, 0.0.0.0:50090->50090/tcp   hadoop-dev
```

{% endtab %}

{% tab title="2. Docker-compose 중지" %}

```bash
cd ./docker-compose
cd ./hadoop
docker ps
docker-compose down
docker ps
```

```bash
docker-compose down
Stopping hadoop-dev ... done
Removing hadoop-dev ... done
Removing network hadoop_default
docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
```

{% endtab %}

{% tab title="3. Docker-compose 재시작" %}

```bash
cd ./docker-compose
cd ./hadoop
docker ps
docker-compose restart
docker ps
```

```bash
docker ps
CONTAINER ID   IMAGE                   COMMAND                   CREATED                  STATUS         PORTS                                                                                                                                                                                          NAMES
d33193820d6c   harisekhon/hadoop-dev   "/bin/sh -c \"/entryp…"   Less than a second ago   Up 3 seconds   0.0.0.0:8042->8042/tcp, 8020/tcp, 9000/tcp, 10020/tcp, 19888/tcp, 50010/tcp, 0.0.0.0:8088->8088/tcp, 0.0.0.0:50070->50070/tcp, 0.0.0.0:50075->50075/tcp, 50020/tcp, 0.0.0.0:50090->50090/tcp   hadoop-dev
docker-compose restart
Restarting hadoop-dev ... done
docker ps
CONTAINER ID   IMAGE                   COMMAND                   CREATED          STATUS         PORTS                                                                                                                                                                                          NAMES
d33193820d6c   harisekhon/hadoop-dev   "/bin/sh -c \"/entryp…"   25 seconds ago   Up 4 seconds   0.0.0.0:8042->8042/tcp, 8020/tcp, 9000/tcp, 10020/tcp, 19888/tcp, 50010/tcp, 0.0.0.0:8088->8088/tcp, 0.0.0.0:50070->50070/tcp, 0.0.0.0:50075->50075/tcp, 50020/tcp, 0.0.0.0:50090->50090/tcp   hadoop-dev
```

{% endtab %}
{% endtabs %}

#### Step 4. Hadoop 시스템 확인       &#x20;

{% tabs %}
{% tab title="1. Hadoop Node 확인  " %}

```
 크롬으로 localhost:8042 접속    
```

![그림. Hadoop node 페이지](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-MYljqM08Q1grUmrP1nZ%2F-MYllF9DSVqP6zGDCxUU%2Fimage.png?alt=media\&token=65dea3b1-ffdb-42f9-a8ce-872f8fb2660b)
{% endtab %}

{% tab title="2. Hadoop Cluster 확인 " %}

```
 크롬으로 localhost:8088 접속
```

![그림. Hadoop Cluster 페이지  ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-MYljqM08Q1grUmrP1nZ%2F-MYlmXPh7KgiqpcdISVT%2Fimage.png?alt=media\&token=a30f71a7-8ee0-4cb3-88cc-f7399a558762)
{% endtab %}

{% tab title="3. Hadoop Dfshealth 확인  " %}

```
 크롬으로 localhost:50070 접속
```

![그림. Hadoop dfshealth 페이지 ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-MYlmZQJCDi50-zGdlrn%2F-MYln3zvMpaqBm5dDrgH%2Fimage.png?alt=media\&token=60aa2bdb-e675-4905-b904-980e27364bd1)
{% endtab %}

{% tab title="4. Hadoop Datanode 확인 " %}

```
크롬으로 localhost:50075 접속 
```

![그림. Hadoop datanode 페이지 ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-MYlmZQJCDi50-zGdlrn%2F-MYlnRSZEaBCbha9hqq3%2Fimage.png?alt=media\&token=8dd63c84-374b-47aa-a6a4-397ca8866124)
{% endtab %}

{% tab title="5. Hadoop Status 확인" %}

```
크롬으로 localhost:50090 접속 
```

![그림. Hadoop status 페이지 ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-MYlmZQJCDi50-zGdlrn%2F-MYlnjhWw5yKRaGpjL5m%2Fimage.png?alt=media\&token=ddc3b8ec-ac45-4ab2-a621-dfd90fbe4a0d)
{% endtab %}
{% endtabs %}

#### Step 5. Hadoop 테스트 확인  &#x20;

{% tabs %}
{% tab title="1. Sample Test 이동/복사 " %}

```
Hadoop 경로 이동 및 파일 저장(NOTICE.txt)    
```

```bash
docker exec -it hadoop-dev /bin/bash
[root@4bb51d4c894c /]# cd $HADOOP_HOME
[root@4bb51d4c894c hadoop]# ls
bin  etc  include  lib  libexec  LICENSE.txt  logs  NOTICE.txt  README.txt  sbin  share
[root@4bb51d4c894c hadoop]# hadoop fs -mkdir -p /data
[root@4bb51d4c894c hadoop]# hadoop fs -put NOTICE.txt /data
[root@4bb51d4c894c hadoop]# hadoop fs -ls /data
Found 1 items
-rw-r--r--   1 root supergroup      15915 2021-04-21 00:26 /data/NOTICE.txt
```

{% endtab %}

{% tab title="2. Sample Test 실행    " %}

```
Hadoop Sample 테스트 실행  
hadoop-mapreduce-examples-2.9.0.jar 의 파라미터(wordmean) 이용하여 NOTICE.txt 파일의 단어와 글자수를 계산    
```

```bash
docker exec -it hadoop-dev /bin/bash
[root@4bb51d4c894c]# cd /hadoop/share/hadoop/mapreduce
[root@4bb51d4c894c mapreduce]# ls
hadoop-mapreduce-client-app-2.9.0.jar     hadoop-mapreduce-client-hs-plugins-2.9.0.jar       hadoop-mapreduce-examples-2.9.0.jar  sources
hadoop-mapreduce-client-common-2.9.0.jar  hadoop-mapreduce-client-jobclient-2.9.0.jar        jdiff
hadoop-mapreduce-client-core-2.9.0.jar    hadoop-mapreduce-client-jobclient-2.9.0-tests.jar  lib
hadoop-mapreduce-client-hs-2.9.0.jar      hadoop-mapreduce-client-shuffle-2.9.0.jar          lib-examples
[root@4bb51d4c894c mapreduce]# hadoop jar hadoop-mapreduce-examples-2.9.0.jar
Valid program names are:
  aggregatewordcount: An Aggregate based map/reduce program that counts the words in the input files.
  aggregatewordhist: An Aggregate based map/reduce program that computes the histogram of the words in the input files.
  bbp: A map/reduce program that uses Bailey-Borwein-Plouffe to compute exact digits of Pi.
  dbcount: An example job that count the pageview counts from a database.
  distbbp: A map/reduce program that uses a BBP-type formula to compute exact bits of Pi.
  grep: A map/reduce program that counts the matches of a regex in the input.
  join: A job that effects a join over sorted, equally partitioned datasets
  multifilewc: A job that counts words from several files.
  pentomino: A map/reduce tile laying program to find solutions to pentomino problems.
  pi: A map/reduce program that estimates Pi using a quasi-Monte Carlo method.
  randomtextwriter: A map/reduce program that writes 10GB of random textual data per node.
  randomwriter: A map/reduce program that writes 10GB of random data per node.
  secondarysort: An example defining a secondary sort to the reduce.
  sort: A map/reduce program that sorts the data written by the random writer.
  sudoku: A sudoku solver.
  teragen: Generate data for the terasort
  terasort: Run the terasort
  teravalidate: Checking results of terasort
  wordcount: A map/reduce program that counts the words in the input files.
  wordmean: A map/reduce program that counts the average length of the words in the input files.
  wordmedian: A map/reduce program that counts the median length of the words in the input files.
  wordstandarddeviation: A map/reduce program that counts the standard deviation of the length of the words in the input files.
[root@4bb51d4c894c mapreduce]# hadoop jar hadoop-mapreduce-examples-2.9.0.jar wordmean /data /data_out
21/04/21 00:52:37 INFO client.RMProxy: Connecting to ResourceManager at /0.0.0.0:8032
21/04/21 00:52:38 INFO input.FileInputFormat: Total input files to process : 1
21/04/21 00:52:38 INFO mapreduce.JobSubmitter: number of splits:1
21/04/21 00:52:38 INFO Configuration.deprecation: yarn.resourcemanager.system-metrics-publisher.enabled is deprecated. Instead, use yarn.system-metrics-publisher.enabled
21/04/21 00:52:38 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_1618964082934_0001
21/04/21 00:52:39 INFO impl.YarnClientImpl: Submitted application application_1618964082934_0001
21/04/21 00:52:39 INFO mapreduce.Job: The url to track the job: http://4bb51d4c894c:8088/proxy/application_1618964082934_0001/
21/04/21 00:52:39 INFO mapreduce.Job: Running job: job_1618964082934_0001
21/04/21 00:52:50 INFO mapreduce.Job: Job job_1618964082934_0001 running in uber mode : false
21/04/21 00:52:50 INFO mapreduce.Job:  map 0% reduce 0%
21/04/21 00:52:58 INFO mapreduce.Job:  map 100% reduce 0%
21/04/21 00:53:04 INFO mapreduce.Job:  map 100% reduce 100%
21/04/21 00:53:04 INFO mapreduce.Job: Job job_1618964082934_0001 completed successfully
21/04/21 00:53:04 INFO mapreduce.Job: Counters: 49
        File System Counters
                FILE: Number of bytes read=39
                FILE: Number of bytes written=403473
                FILE: Number of read operations=0
                FILE: Number of large read operations=0
                FILE: Number of write operations=0
                HDFS: Number of bytes read=16020
                HDFS: Number of bytes written=24
                HDFS: Number of read operations=6
                HDFS: Number of large read operations=0
                HDFS: Number of write operations=2
        Job Counters
                Launched map tasks=1
                Launched reduce tasks=1
                Data-local map tasks=1
                Total time spent by all maps in occupied slots (ms)=4347
                Total time spent by all reduces in occupied slots (ms)=3565
                Total time spent by all map tasks (ms)=4347
                Total time spent by all reduce tasks (ms)=3565
                Total vcore-milliseconds taken by all map tasks=4347
                Total vcore-milliseconds taken by all reduce tasks=3565
                Total megabyte-milliseconds taken by all map tasks=4451328
                Total megabyte-milliseconds taken by all reduce tasks=3650560
        Map-Reduce Framework
                Map input records=455
                Map output records=3624
                Map output bytes=52548
                Map output materialized bytes=39
                Input split bytes=105
                Combine input records=3624
                Combine output records=2
                Reduce input groups=2
                Reduce shuffle bytes=39
                Reduce input records=2
                Reduce output records=2
                Spilled Records=4
                Shuffled Maps =1
                Failed Shuffles=0
                Merged Map outputs=1
                GC time elapsed (ms)=205
                CPU time spent (ms)=1500
                Physical memory (bytes) snapshot=504504320
                Virtual memory (bytes) snapshot=4011933696
                Total committed heap usage (bytes)=347602944
        Shuffle Errors
                BAD_ID=0
                CONNECTION=0
                IO_ERROR=0
                WRONG_LENGTH=0
                WRONG_MAP=0
                WRONG_REDUCE=0
        File Input Format Counters
                Bytes Read=15915
        File Output Format Counters
                Bytes Written=24
The mean is: 7.2759381898454745
[root@4bb51d4c894c mapreduce]#
```

{% endtab %}

{% tab title="3. Sample Test 결과 확인  " %}

```
# Sample Test 결과 확인   
hadoop fs -cat /data_out/*     
```

```bash
docker exec -it hadoop-dev /bin/bash
[root@4bb51d4c894c]# hadoop fs -ls  /data_out
Found 2 items
-rw-r--r--   1 root supergroup          0 2021-04-21 00:53 /data_out/_SUCCESS
-rw-r--r--   1 root supergroup         24 2021-04-21 00:53 /data_out/part-r-00000
[root@4bb51d4c894c]# hadoop fs -cat /data_out/*
count   1812
length  13184
[root@4bb51d4c894c]#
```

{% endtab %}

{% tab title="4. Hadoop node 확인    " %}

```
크롬에서 localhost:8088 로 접속 하여 FINISHED Applications 을 확인    
```

![그림. Hadoop Cluster 에서 FINISHED Applications 페이지](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-MYm-KmOSDjT6KiAiO2t%2F-MYm0GV8FcHY4ydUCIzk%2Fimage.png?alt=media\&token=b1a7fe6d-389a-4479-8aaf-d5db638523cb)
{% endtab %}

{% tab title="5. Hadoop HDFS Browse Directory 확인 " %}

```
크롬에서 localhost:50070 으로 접속하여 Utilities > Browse Directory 로 이동      
해당 폴더 에 들어가서 파일을 클릭 하면 상세 정보 및 파일 다운로드가 가능    
```

![그림. Hadoop HDFS Browse Directory 페이지](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-MYm-KmOSDjT6KiAiO2t%2F-MYm0p60wybKbsBCIucL%2Fimage.png?alt=media\&token=70a5bba4-d3c7-450c-a0eb-52123e24effc)

![그림. Hadoop HDFS 에 파일 다운로드 및 상세 보기  ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-MYm1C5jloPP6saVhu4A%2F-MYm1Yv83vtpCbXqJS-6%2Fimage.png?alt=media\&token=bd79d41d-f125-4c81-9e27-77af158374b0)
{% endtab %}
{% endtabs %}

#### Step 6. Hadoop 결과 데이터 동기화   &#x20;

{% tabs %}
{% tab title="1. Hadoop 시스템 접속 후 데이터 확인 및 압축" %}

```
hadoop 시스템을 재시작 하면 결과 값이 초기화 됨
/tmp/hadoop-root/dfs 의 하위 디렉토리를 압축 하여 관리 pc 에 dfs.tar 파일을 이동 
```

```bash
docker exec -it hadoop-dev /bin/bash
[root@6debfd1fd33d]# cd /tmp/hadoop-root/dfs
[root@6debfd1fd33d dfs]# ls
data  name  namesecondary
[root@6debfd1fd33d dfs]# tar -zcvf dfs.tar ./data ./name ./namesecondary
[root@6debfd1fd33d dfs]# ls dfs.tar
dfs.tar
[root@6debfd1fd33d dfs]# exit

PS C:\Users\user1\docker-compose\hadoop\hadoop\dfs>cd ./hadoop/hadoop/dfs
PS C:\Users\user1\docker-compose\hadoop\hadoop\dfs>docker cp hadoop:/tmp/hadoop-root/dfs/dfs.tar .
PS C:\Users\user1\docker-compose\hadoop\hadoop\dfs>tar -zxvf dfs.tar
PS C:\Users\user1\docker-compose\hadoop\hadoop\dfs>ls


    디렉터리: C:\Users\user1\docker-compose\hadoop\hadoop\dfs


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
da----      2021-04-21  오전 11:04                data
d-----      2021-04-21  오전 10:12                name
d-----      2021-04-21  오전 10:13                namesecondary
```

{% endtab %}

{% tab title="2. docker-compose.yml" %}

```
docker-compose.yml 파일 수정 
```

{% code title="docker-compose.yml volumes 의 주석 제거" %}

```
  volumes:
   - ./hadoop/dfs/name:/tmp/hadoop-root/dfs/name
   - ./hadoop/dfs/data:/tmp/hadoop-root/dfs/data
   - ./hadoop/dfs/namesecondary:/tmp/hadoop-root/dfs/namesecondary
```

{% endcode %}

{% file src="<https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-MYmem42wS2w-NO5o9uV%2F-MYmfDb3lwVPBag5hLk4%2Fdocker-compose.yml?alt=media&token=00173a97-36fb-471b-9741-34cca1f1b92b>" %}
{% endtab %}

{% tab title="3. docker-compose 실행" %}

```
수정된 docker-compose.yml 파일로 컨테이너 시작    
hadoop-dev 에 접속 후 데이터 확인 
```

```bash
PS C:\Users\user1> cd ./docker-compose/hadoop
PS C:\Users\user1\docker-compose\hadoop> docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
PS C:\Users\user1\docker-compose\hadoop> docker-compose up -d
Creating network "hadoop_default" with the default driver
Creating hadoop-dev ... done
PS C:\Users\user1\docker-compose\hadoop> docker ps
CONTAINER ID   IMAGE                   COMMAND                   CREATED         STATUS         PORTS                                                                                                                                                                                          NAMES
2d5becf8894f   harisekhon/hadoop-dev   "/bin/sh -c \"/entryp…"   4 seconds ago   Up 8 seconds   0.0.0.0:8042->8042/tcp, 8020/tcp, 9000/tcp, 10020/tcp, 19888/tcp, 50010/tcp, 0.0.0.0:8088->8088/tcp, 0.0.0.0:50070->50070/tcp, 0.0.0.0:50075->50075/tcp, 50020/tcp, 0.0.0.0:50090->50090/tcp   hadoop-dev
PS C:\Users\user1\docker-compose\hadoop> docker exec -it hadoop-dev /bin/bash
[root@2d5becf8894f /]# hadoop fs -ls /
Found 5 items
drwxr-xr-x   - root supergroup          0 2021-04-21 01:45 /data
drwxr-xr-x   - root supergroup          0 2021-04-21 01:48 /data_in_out
drwxr-xr-x   - root supergroup          0 2021-04-21 01:48 /data_in_out_wordcount
drwxr-xr-x   - root supergroup          0 2021-04-21 01:15 /data_out
drwx------   - root supergroup          0 2021-04-21 01:15 /tmp
```

{% endtab %}
{% endtabs %}

#### ETC. Error/Worning 해결 방안&#x20;

* 데이터가 사라져요!!!

{% tabs %}
{% tab title="1. 데이터 확인" %}

```
컨테이너 재시작 또는 중지 후 시작 했을 때 데이터가 사라짐    
```

```bash
docker exec -it hadoop-dev /bin/bash
[root@4bb51d4c894c]# hadoop fs -ls  /data_out
Found 2 items
-rw-r--r--   1 root supergroup          0 2021-04-21 00:53 /data_out/_SUCCESS
-rw-r--r--   1 root supergroup         24 2021-04-21 00:53 /data_out/part-r-00000
[root@4bb51d4c894c]# hadoop fs -cat /data_out/*
count   1812
length  13184
[root@4bb51d4c894c]#
## ---> 컨테이너 재시작 또는 중지 후 시작           
```

{% endtab %}

{% tab title="2. 확인 방법" %}

```
docker logs -f hadoop-dev (hadoop-dev log 확인)    
docker-compose.yml 의 volumes 파라미터 경로 확인 
```

{% code title="hadoop-dev log 확인     " %}

```bash
PS C:\Users\user1\docker-compose\hadoop>docker logs -f hadoop-dev
Generating public/private rsa key pair.
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:L9lYtwzxrlF6HqevI8yaUlXhuoihLxHNrwIMXjv1Yow root@2d5becf8894f
The key's randomart image is:
+---[RSA 1024]----+
|            ..   |
|           ..    |
|     o    ...    |
|.  ...o   .+     |
|.o. =.o.S.+ +    |
| .oE.= +oB O .   |
|   .+.oo=o* * .  |
|    o.o  o+=.+   |
|     o..o...++.  |
+----[SHA256]-----+
'/root/.ssh/id_rsa.pub' -> '/root/.ssh/authorized_keys'
mode of '/root/.ssh/authorized_keys' changed from 0644 (rw-r--r--) to 0400 (r--------)
Generating SSH2 RSA host key: [  OK  ]
Generating SSH2 ECDSA host key: [  OK  ]
Generating SSH2 ED25519 host key: [  OK  ]
```

{% endcode %}

{% code title="docker-compose.yml 의 volumes 경로 확인     " %}

```
version: '2' # 파일 규격 버전
services: # 이 항목 밑에 실행하려는 컨테이너 들을 정의 ( 컴포즈에서 컨테이너 : 서비스 )
 hadoop-dev: # 서비스 명
  image: harisekhon/hadoop-dev # 사용할 이미지
  container_name: hadoop-dev # 컨테이너 이름 설정
  restart: always 
  volumes:
   - ./hadoop/dfs/name:/tmp/hadoop-root/dfs/name
   - ./hadoop/dfs/data:/tmp/hadoop-root/dfs/data
   - ./hadoop/dfs/namesecondary:/tmp/hadoop-root/dfs/namesecondary
   - ./hadoop/logs:/hadoop/logs
  ports:
   - 8042:8042    # node
   - 8088:8088    # cluster
   - 50070:50070 # dfshealth
   - 50075:50075 # datanode
   - 50090:50090 # status
```

{% endcode %}

&#x20;
{% endtab %}

{% tab title="3. 처리 방법  " %}

```
docker-compose.yml 파일을 다운로드 받아서 시작      
Step 6 를 다시 한번 해 본다  
```

{% endtab %}
{% endtabs %}

{% hint style="info" %}
**2022년 NHN Cloud&#x20;**<mark style="color:red;">**무료**</mark>**&#x20;교육일정** : <https://doc.skill.or.kr/2022-NHN-Cloud-Education>
{% endhint %}

{% hint style="warning" %}
**2022년 NHN Cloud&#x20;**<mark style="color:red;">**행사/프로모션**</mark>**&#x20;정보 공유** : <https://doc.skill.or.kr/2022-NHN-Cloud-Event-Promotion>
{% endhint %}

{% embed url="<https://paypal.me/shop2002>" %}
donation
{% endembed %}

## 작성중인 문서.....
