아이디어를 빠르게 최소요건제품(시제품)으로 제조한 뒤 시장의 반응을 통해 다음 제품 개선에 반영하는 전략이다.
이를 통해 짧은 시간 동안 제품을 만들고 성과를 측정해 다음 제품 개선에 반영하는 것을 반복해 성공 확률을 높이는 경영 방법론의 일종이다. 일본 도요타자동차의 린 제조(lean manufacturing) 방식을 본 뜬 것으로, 미국 실리콘밸리의 벤처기업가 에릭 리스(Eric Ries, 1979~ )가 개발했다. 린스타트업은 「만들기 ─ 측정 ─ 학습」의 과정을 반복하면서 꾸준히 혁신해 나가는 것을 주요 내용으로 한다.
소프트웨어 개발자가 프로그램을 개발하려면 노트북 1대만 갖춰선 될 일이 아니다. 여러 명이 동시에 개발할 수 있는 환경도 필요하며, 수천명의 사용자를 상대로 내놓으려면 인프라 환경도 갖춰야 한다. 서버와 스토리지, 운영체제 등을 뒷단에서 갖추고 관리해야 하는 것이다. 이에 맞는 미들웨어와 런타임 환경을 제대로 구성하는 데 보통 수개월 이상 걸리곤 한다.
Docker를 통 이용자는 몇 분에서 몇 시간 혹은 하루 정도의 시간으로 플랫폼을 손쉽게 구축할 수 있다.
도커(Docker)는 리눅스의 응용 프로그램들을 소프트웨어 컨테이너 안에 배치시키는 일을 자동화하는 오픈 소스 프로젝트이다. 도커 컨테이너는 일종의 소프트웨어를 소프트웨어의 실행에 필요한 모든 것을 포함하는 완전한 파일 시스템 안에 감싸며 리눅스에서 운영 체제 수준 가상화의 추상화 및 자동화 계층을 추가적으로 제공한다. 도커는 cgroups와 커널 이름 공간과 같은 리눅스 커널, 또 aufs와 같은 유니언 가능 파일 시스템의 리소스 격리 기능을 사용하며, 이를 통해 독립적인 "컨테이너"가 하나의 리눅스 인스턴스 안에서 실행할 수 있게 함으로써 가상 머신을 시작하여 유지보수 해야 하는 부담을 없애준다.
4. 가상화 vs 도커
리눅스 컨테이너 기술은 가상화와 비슷한 기술이다. 가상화 기술은 하이퍼바이저라는 기술이 반드시 있어야 한다. 하이퍼바이저는 하나의 컴퓨터에서 여러 개의 운영체제(OS)를 사용할 수 있게 도와주는 기술이다. 가상화 환경은 가장 밑단에 깔린 호스트 OS를 공유한다. 만약 게스트 OS가 네트워크를 많이 사용하는 애플리케이션을 돌리면 어떻게 될까. 한정된 호스트 OS 자원으로는 애플리케이션을 감당하기 어렵게 된다. 하이퍼바이저도 호스트 OS와 게스트 OS, 애플리케이션을 중재하는 과정에서 많은 작업을 처리하게 된다.
도커는 하이퍼바이저와 달리 게스트 OS를 두지 않고 호스트 OS 커널을 바로 사용한다. 하이퍼바이저 대신 도커 엔진이 올라가, 호스트 OS와 여러 애플리케이션을 연결해주는 역할을 한다. 따라서 도커를 사용하면 가상화보다는 내부에서 더 적은 일을 처리하고, 애플리케이션을 좀더 빠르고 효율적으로 실행시킬 수 있다. 현재 업계에선 가상화 기술과 도커가 서로 부족한 부분을 채우는 보완 기술로 발전할 것으로 보고 있다.
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" # 접근 포트 설정 (컨테이너 외부:컨테이너 내부)
docker logs -f tensorflow-jupyter # 실행 후 URL Log 확인
Docker 로그를 통해 token 을 이용하 크롬에 접속
크롬에 URL 을 정상적으로 입력 하면 아래와 같은 화면을 볼 수 있음
Step 5. TensorFlow 실행 및 저장
크롬 localhost:8888 접속 후 tensorflow-tutorials 폴더 확인
ipynb 파일 클릭 후 아래와 같이 확인
상단에 Run or restart 버튼을 클
Main 화면에서 Upload 버튼 클릭 후 파일 선택
업로드 후에 2번과 같이 진행
진행 결과 확인
결과 확인(Running) 및 파일 저장(File > Save as)
5.2 Hadoop 시스템 구축 (5분 완성)
Step 1. 사전 준비 단계
폴더 구조
메인 폴더
서 폴더
서 폴더
파일
설명
hadoop
logs
Hadoop 로그 파일 저장
dfs
name
NameNode 저장 위치
data
DataNode 저장 위치
namesecondary
NameNodeSecondary 저장 위치
docker-compose.yml
docker-compose.yml 설정 파일
Step 2. Docker-compose.yml 설정
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
dockerpsCONTAINER 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-composerestartRestartinghadoop-dev...donedockerpsCONTAINER 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
Hadoop Sample 테스트 실행
hadoop-mapreduce-examples-2.9.0.jar 의 파라미터(wordmean) 이용하여 NOTICE.txt 파일의 단어와 글자수를 계산
dockerexec-ithadoop-dev/bin/bash[root@4bb51d4c894c]# cd /hadoop/share/hadoop/mapreduce[root@4bb51d4c894c mapreduce]# lshadoop-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.jarhadoop-mapreduce-client-jobclient-2.9.0.jarjdiffhadoop-mapreduce-client-core-2.9.0.jarhadoop-mapreduce-client-jobclient-2.9.0-tests.jarlibhadoop-mapreduce-client-hs-2.9.0.jarhadoop-mapreduce-client-shuffle-2.9.0.jarlib-examples[root@4bb51d4c894c mapreduce]# hadoop jar hadoop-mapreduce-examples-2.9.0.jarValidprogramnamesare:aggregatewordcount:AnAggregatebasedmap/reduceprogramthatcountsthewordsintheinputfiles.aggregatewordhist:AnAggregatebasedmap/reduceprogramthatcomputesthehistogramofthewordsintheinputfiles.bbp:Amap/reduceprogramthatusesBailey-Borwein-PlouffetocomputeexactdigitsofPi.dbcount:Anexamplejobthatcountthepageviewcountsfromadatabase.distbbp:Amap/reduceprogramthatusesaBBP-typeformulatocomputeexactbitsofPi.grep:Amap/reduceprogramthatcountsthematchesofaregexintheinput.join:Ajobthateffectsajoinoversorted,equallypartitioneddatasetsmultifilewc:Ajobthatcountswordsfromseveralfiles.pentomino:Amap/reducetilelayingprogramtofindsolutionstopentominoproblems.pi:Amap/reduceprogramthatestimatesPiusingaquasi-MonteCarlomethod.randomtextwriter:Amap/reduceprogramthatwrites10GBofrandomtextualdatapernode.randomwriter:Amap/reduceprogramthatwrites10GBofrandomdatapernode.secondarysort:Anexampledefiningasecondarysorttothereduce.sort:Amap/reduceprogramthatsortsthedatawrittenbytherandomwriter.sudoku:Asudokusolver.teragen:Generatedatafortheterasortterasort:Runtheterasortteravalidate:Checkingresultsofterasortwordcount:Amap/reduceprogramthatcountsthewordsintheinputfiles.wordmean:Amap/reduceprogramthatcountstheaveragelengthofthewordsintheinputfiles.wordmedian:Amap/reduceprogramthatcountsthemedianlengthofthewordsintheinputfiles. 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_out21/04/2100:52:37INFOclient.RMProxy:ConnectingtoResourceManagerat/0.0.0.0:803221/04/2100:52:38INFOinput.FileInputFormat:Totalinputfilestoprocess:121/04/2100:52:38INFOmapreduce.JobSubmitter:numberofsplits:121/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/2100:52:38INFOmapreduce.JobSubmitter:Submittingtokensforjob:job_1618964082934_000121/04/2100:52:39INFOimpl.YarnClientImpl:Submittedapplicationapplication_1618964082934_000121/04/21 00:52:39 INFO mapreduce.Job: The url to track the job: http://4bb51d4c894c:8088/proxy/application_1618964082934_0001/
21/04/2100:52:39INFOmapreduce.Job:Runningjob:job_1618964082934_000121/04/2100:52:50INFOmapreduce.Job:Jobjob_1618964082934_0001runninginubermode:false21/04/2100:52:50INFOmapreduce.Job:map0%reduce0%21/04/2100:52:58INFOmapreduce.Job:map100%reduce0%21/04/2100:53:04INFOmapreduce.Job:map100%reduce100%21/04/2100:53:04INFOmapreduce.Job:Jobjob_1618964082934_0001completedsuccessfully21/04/2100:53:04INFOmapreduce.Job:Counters:49FileSystemCountersFILE:Numberofbytesread=39FILE:Numberofbyteswritten=403473FILE:Numberofreadoperations=0FILE:Numberoflargereadoperations=0FILE:Numberofwriteoperations=0HDFS:Numberofbytesread=16020HDFS:Numberofbyteswritten=24HDFS:Numberofreadoperations=6HDFS:Numberoflargereadoperations=0HDFS:Numberofwriteoperations=2JobCountersLaunchedmaptasks=1Launchedreducetasks=1Data-localmaptasks=1Totaltimespentbyallmapsinoccupiedslots (ms)=4347Totaltimespentbyallreducesinoccupiedslots (ms)=3565Totaltimespentbyallmaptasks (ms)=4347Totaltimespentbyallreducetasks (ms)=3565Totalvcore-millisecondstakenbyallmaptasks=4347Totalvcore-millisecondstakenbyallreducetasks=3565Totalmegabyte-millisecondstakenbyallmaptasks=4451328Totalmegabyte-millisecondstakenbyallreducetasks=3650560Map-ReduceFrameworkMapinputrecords=455Mapoutputrecords=3624Mapoutputbytes=52548Mapoutputmaterializedbytes=39Inputsplitbytes=105Combineinputrecords=3624Combineoutputrecords=2Reduceinputgroups=2Reduceshufflebytes=39Reduceinputrecords=2Reduceoutputrecords=2SpilledRecords=4ShuffledMaps=1FailedShuffles=0MergedMapoutputs=1GCtimeelapsed (ms)=205CPUtimespent (ms)=1500Physicalmemory (bytes) snapshot=504504320Virtualmemory (bytes) snapshot=4011933696Totalcommittedheapusage (bytes)=347602944ShuffleErrors BAD_ID=0 CONNECTION=0 IO_ERROR=0 WRONG_LENGTH=0 WRONG_MAP=0 WRONG_REDUCE=0FileInputFormatCountersBytesRead=15915FileOutputFormatCountersBytesWritten=24Themeanis:7.2759381898454745[root@4bb51d4c894c mapreduce]#
수정된 docker-compose.yml 파일로 컨테이너 시작
hadoop-dev 에 접속 후 데이터 확인
PSC:\Users\user1>cd./docker-compose/hadoopPSC:\Users\user1\docker-compose\hadoop>dockerpsCONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMESPSC:\Users\user1\docker-compose\hadoop>docker-composeup-dCreatingnetwork"hadoop_default"withthedefaultdriverCreatinghadoop-dev...donePSC:\Users\user1\docker-compose\hadoop>dockerpsCONTAINER 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
PSC:\Users\user1\docker-compose\hadoop>dockerexec-ithadoop-dev/bin/bash[root@2d5becf8894f /]# hadoop fs -ls /Found5itemsdrwxr-xr-x-rootsupergroup02021-04-2101:45/datadrwxr-xr-x-rootsupergroup02021-04-2101:48/data_in_outdrwxr-xr-x-rootsupergroup02021-04-2101:48/data_in_out_wordcountdrwxr-xr-x-rootsupergroup02021-04-2101:15/data_outdrwx-------rootsupergroup02021-04-2101:15/tmp
ETC. Error/Worning 해결 방안
데이터가 사라져요!!!
컨테이너 재시작 또는 중지 후 시작 했을 때 데이터가 사라짐
dockerexec-ithadoop-dev/bin/bash[root@4bb51d4c894c]# hadoop fs -ls /data_outFound2items-rw-r--r--1rootsupergroup02021-04-2100:53/data_out/_SUCCESS-rw-r--r--1rootsupergroup242021-04-2100:53/data_out/part-r-00000[root@4bb51d4c894c]# hadoop fs -cat /data_out/*count1812length13184[root@4bb51d4c894c]### ---> 컨테이너 재시작 또는 중지 후 시작
docker logs -f hadoop-dev (hadoop-dev log 확인)
docker-compose.yml 의 volumes 파라미터 경로 확인
hadoop-dev log 확인
PSC:\Users\user1\docker-compose\hadoop>dockerlogs-fhadoop-devGeneratingpublic/privatersakeypair.Youridentificationhasbeensavedin/root/.ssh/id_rsa.Yourpublickeyhasbeensavedin/root/.ssh/id_rsa.pub.Thekeyfingerprintis:SHA256:L9lYtwzxrlF6HqevI8yaUlXhuoihLxHNrwIMXjv1Yowroot@2d5becf8894fThekey'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 ]
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
docker-compose.yml 파일을 다운로드 받아서 시작
Step 6 를 다시 한번 해 본다