Distributed Computing for Big Data

Starting Hadoop with virtual box

esfolio 2019. 9. 12. 15:24

 

숭실대학교 컴퓨터학부 박영택 교수님의 <빅데이터 분산 컴퓨팅> 강의를 듣고 정리했다.

1. Installing, preparing

 

 

 

oracle - virtual box  (https://www.virtualbox.org/wiki/Downloads)

cloudera - CDH  (https://www.cloudera.com/)

 

링크로 들어가서 사양에 맞는 virtual box와 CDH를 설치한다.

 

virtual box를 실행한 후, 파일-> 가상 시스템 가져오기 -> cloudera-quickstart-vm- .....ovf

 

가상 시스템 설정에서 RAM을 최대한으로 잡는다. (최소 4096MB , 그렇지 않으면 제대로 돌아가지 않을 가능성이 있다.)

 

 

그런 다음 왼쪽에 뜨는 cloudera-quickstart 를 클릭하여 시작한다.

 

 

 

시작하면 이런 창이 뜨는데 위에 표시한 아이콘을 눌러서 터미널을 키고 리눅스 커맨드를 사용하면 된다. 

 

local이 아닌 HDFS을 사용하려면 커맨드 앞에 hadoop fs - 라고 써줘야 한다.

 

 

가장 바깥 박스인 파란색은 우리가 사용하고 있는 컴퓨터 환경이라고 보면 된다.

지금까지 한 것은 그 컴퓨터 환경 안에 virtual machine 을 설치하여 가상환경을 구축한 것이다.

가상환경은 local과 HDFS(Hadoop File System) 으로 나눌 수 있다.

 

우리가 앞으로 하는 것은 가장 바깥 박스에서 가상 환경으로 접근하여 안에 있는 파일을 다루는 것이다.

 

 

 

 

첫 번째 명령어인 hadoop fs -ls는 hadoop에 어떤 파일이 있는지 list를 보는 명령어이다.

지금 hadoop 에 아무런 파일이 없으므로 아무것도 출력되지 않는다.

 

두 번째 명령어인 ls는 local에 있는 file list를 볼 수 있다. 밑에 출력되는 목록들은 local에 있는 file들이다.

 

다음은 내 컴퓨터 안에 있는 폴더를 virtual machine과 공유할 수 있도록 하는 작업이다.

 

 

출처: http://ailab.ssu.ac.kr/rb/?c=8/29&cat=2019_2_%EB%B9%85%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B6%84%EC%82%B0%EC%BB%B4%ED%93%A8%ED%8C%85&uid=1239

 

 

출처: http://ailab.ssu.ac.kr/rb/?c=8/29&cat=2019_2_%EB%B9%85%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B6%84%EC%82%B0%EC%BB%B4%ED%93%A8%ED%8C%85&uid=1239

출처에서 training_materials.zip 파일도 받아둬야 3번 스텝 진행이 가능하다.

 


 

2. Uploading Files

 

 

위 과정이 마무리 되면 터미널을 킨다.

 

cd ~/training_materials/developer/data

 

위 커맨드를 이용하여 data 디렉토리로 이동한다.

 

tar zxvf shakespeare.tar.gz

 

shakespeare.tar.gz 의 압축을 해제한다

 

압축을 해제하면 shakespeare/ 디렉토리가 로컬 파일 시스템에 생성되고,

그 디렉토리로 이동한 상태가 된다.

 

 

cd ~/training_materials/developer/data

한 단계 나와서 다시 data 파일로 간다 (data 디렉토리 안에 있는 shakespeare 디렉토리를 써야 하기 때문에 shakespeare 디렉토리 안에 있으면 안됨.)

 

hadoop fs -put shakespeare /user/cloudera/shakespeare

로컬 파일 시스템에 있는 shakespeare 디렉토리를 HDFS 상의 /user/cloudera/shakespeare 디렉토리에 복사한다.

 

 

그런데 이 때 간혹 아래처럼 곤란한 상황이 생긴다.

 

 

 put: Cannot create directory /user/cloudera/shakespeare. Name node is in safe mode.

라는 메시지가 뜬다.

 

이것은 현재 HDFS를 관리하는 Name node 가 안전모드 상태이기 때문에 HDFS 상의 어떠한 변경도 불가한 것이다. 즉 지금 하려는 디렉토리 생성을 할 수 없는 상태이다.

 

 

 

sudo -u hdfs hdfs dfsadmin -safemode leave

 

그렇다면 안전모드에서 탈출하는 코드를 작성해준다.

 

 

 

이후

hadoop fs -put shakespeare /user/cloudera/shakespeare

를 터미널에서 입력한다.

 

hadoop fs -ls /user/cloudera

HDFS의 cloudera 파일 안에 어떤 것들이 있는지 list를 확인한다. (shakespeare 파일이 잘 put 되었는지 확인)

 

 

 

추후 진행할 Exercise에서 사용할 웹 서버 로그 파일을 미리 업로드 할 것이다.

이 파일은 Gzip을 통해 압축이 되어 있다. 이러한 파일은 압축해제 후 업로드 하는 것 보다,

압축해제와 업로드를 동시에 진행하는 것이 좋다. 

 

업로드 하기 전에

hadoop fs -mkdir weblog

를 이용해서 HDFS에 이 웹 서버 로그 파일을 업로드 할 weblog 디렉토리를 생성한다.

 

그 다음에 

cd ~/training_materials/developer/data

를 이용해서 data 디렉토리로 간다.

 

gunzip -c access_log.gz|hadoop fs -put - weblog/access_log

 

를 이용해서 data 디렉토리 안에 있는 access_log.gz파일을 gunzip의 -c 옵션을 통해 표준 출력으로 압축 해제하고,

hadoop fs -put 명령어로 HDFS상의 데이터를 올린다. (-put 뒤의 - 는 rename 옵션이다.)

 

hadoop fs -ls

weblog디렉토리가 잘 생성됐는지 확인한다.

 

 

엑세스 로그 파일은 전체 500MB로 큰 파일이다. 이 파일을 5,000줄만 포함된 작은 파일로 만들고, HDFS 에 저장한다.

 

hadoop fs -mkdir testlog

gunzip -c access_log.gz|head -n 5000|hadoop fs -put -testlog/test_access_log

 

testlog라는 이름의 디렉토리를 HDFS에 만든다. 이후 gunzip의 -c 옵션을 통해 access_log.gz의 압축을 풀면서 앞의 5000줄만 추출하여 hadoop 의 testlog 디렉토리에 test_access_log라는 이름으로 업로드 한다.

 

HDFS 상의 디렉토리들을 hadoop fs -ls 로만 확인할 수 있는 것은 아니다.

web 상에서 시각적으로 확인할 수 있는 방법이 있다.

 

빨간색으로 표시한 것을 클릭해서 브라우저를 연다. 

 

이런 창이 뜨면, Hue를 클릭한다. 

 

 

메뉴를 클릭한다.

 

Files를 클릭한다.

 

 

Files 를 클릭하면 오른쪽에 지금까지 HDFS 상에 복사한 파일들을 확인할 수 있다.

 

 

 

 


3. Viewing and Manipulating Files

 

 

hadoop fs -ls shakespeare

로 이전에 업로드한 shkespeare 디렉토리 안에 어떤 것들이 있는지 본다.

-> /user/cloudera/shakespeare 디렉토리 안에 comedies, glossary, histories, poems, tragedies 가 있는 것을 확인할 수 있다.

 

hadoop fs -rm shakespeare/glossary

여기서 glossary 파일은 엄격하게 보면 셰익스피어의 작품이 아니므로 삭제한다.

 

 

 

hadoop fs -cat shakespeare/histories|tail -n 50

터미널에 헨리IV, 제 1의 마지막 50줄을 출력한다. fs -cat 명령어에 head, tail, more나 less의 명령어를 추가해서 간략하게 본다. (터미널에서 파일의 전체 내용을 볼 때 불편하기 때문에) cat 은 file의 내용을 그대로 가져와서 display 하는 명령어

 

hadoop fs -get shakespeare/poems ~/shakepoems.txt

less ~/shakepoems.txt

 

파일을 다운로드하고 로컬 파일 시스템에서 조작하고 싶다면, fs -get 명령어를 사용할 수 있다. 이 명령어는 두 개의 인자를 가진다. (HDFS 경로 및 로컬 경로)

shakespeare/poems 에서 파일을 다운 받아 ~/  의 위치에 shakepoems.txt 라고 저장한다