Starting Hadoop with virtual box
숭실대학교 컴퓨터학부 박영택 교수님의 <빅데이터 분산 컴퓨팅> 강의를 듣고 정리했다.
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과 공유할 수 있도록 하는 작업이다.
출처에서 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 라고 저장한다