본문 바로가기

데이터베이스(DA, AA, TA)/데이터처리

[하둡] 하둡의 HDFS 사용법

하둡 HDFS 기본 사용법


시스템과의 상호작용은 hadoop 이라는 명령어를 통해서 합니다. 만약 터미널을 열고, 인자 없이 명령어를 실행하면 도움말이 나옵니다. 이와 같이 실행하기 위해서, 아래 명령어를 실행합니다.


$hadoop


hadoop 명령어는 여러개의 서브 시스템으로 세분화 되어있습니다. 예를 들어, HDFS의 파일을 처리하기 위한 서브 시스템과 MapReduce Processing Job을 관리하고 실행하기 위한 서브 시스템이 있습니다.


Step 1. Exploring HDFS


하둡 프로그램에서 HDFS와 관련된 서브 시스템은 FsShell 이라고 합니다. 이 서브 시스템은 hadoop fs 명령어로 실행할 수 있습니다.


1. 데스크탑의 Terminal 아이콘을 더블클릭하여 Terminal을 실행


2. 터미널 아래 내용을 입력하여 서브 시스템의 모든 명령어에 대한 설명을 볼수 있다.


$ hadoop fs



3. HDFS안에 root 디렉토리의 내용을 볼 수 있다. 이 디렉토리에는 여러 항목이 있는데, 그 중 하나가 /user 이다. 개별 사용자는 "home" 디렉토리 아래 사용자 이름으로 된 디렉토리를 가지고 있다. 사용자의 홈 디렉토리는 /usr/training 이다.


$ hadoop fs -ls /


4. /user 디렉터리의 내용을 보려면 아래와 같은 명령어를 실행하여 디렉터리 리스트 안에 home(ex : /user/training) 디렉터리를 확인할 수 있다.


$ hadoop fs -ls /user


5. 아래와 같이 입력 후 실행


$ hadoop fs -ls /user/training


경로 상의 아무런 파일이 없기 때문에 명령이 자동으로 종료된다. 만약 hadoop fs -ls /foo 을 실행하면 이전에 명령어를 실행했을 때와는 다르게 존재하지 않는 디렉터리이기 때문에 에러메시지를 보여줍니다. HDFS의 디렉토리 구조와 로컬 파일 시스템의 디렉토리 구조와는 아무 연관성이 없다. 완전히 분리된 네임스페이스라고 봐야 한다.



Step 2. Uploading Files


기존의 파일 시스템을 탐색하는 것 외에 FsShell로 할 수 있는 또 다른 중요한 점은 HDFS에 새로운 데이터를 업로드 하는 것입니다.


1. 다음 Excercise에서 사용할 샘플 데이터를 포함한 디렉터리 경로를 변경.


$ cd ~/training_materials/developer/data


위와 같은 위치에서 ls 명령어를 실행하면 shakespeare.tar.gz와 shakespeare-stream.tar.gz, 2개의 파일과 함께 다른 몇 개의 파일을 볼 수 있다. 이 2개의 파일에는 텍스트 형식으로 셰익스피어의 전집이 포함되어 있다. 지금은 shakespreare.tar.gz 파일을 사용한다.


2. 아래의 명령어를 실행하여 shakespeare.tar.gz를 압축 해제


$ tar zxvf shakespeare.tar.gz


압축을 해제하면 여러개의 파일을 포함하고 있는 shakespeare/ 디렉토리가 로컬 파일 시스템에 생성된다.


3. HDFS에 디렉토리를 삽입


$ hadoop fs -put shakespeare /user/training/shkespeare


로컬 파일 시스템에 shakespeare 디렉토리를 HDFS상의 /user/training/shakespeare 디렉토리에 put 명령어를 입력하여 업로드 한다. 만약 HDFS에 있는 파일을 로컬로 가져오고 싶을때는 get 명령어를 쓰면 된다.


4. HDFS상의 home 디렉터리의 컨텐츠 리스트를 보여준다.


$ hadoop fs -ls /user/training


5. 이제 경로를 입력하지 않고 동일한 fs -ls 명령을 실행.


$ hadoop fs -ls


같은 결과가 나오는 것을 확인할 수 있다. -ls 명령어의 디렉토리 명을 입력하지 않은 경우 home 디렉터리, 즉 /user/training 을 의미한다고 가정하고 실행된다.


6. 추후 진행할 Exercise에서 사용할 웹서버 로그 파일도 있다. 이 파일은 Gzip을 통해서 압축되어 있다. 이 파일을 로컬 파일 시스템에 압축 해제 후 업로드를 하는 것보다, 압축해제와 업로드를 한번에 진행하는 것이 좋다. 그러기 위해서 첫번째, HDFS 상의 이파일을 저장할 폴더를 하나 생성.


$ hadoop fs -mkdir weblog


7. 그리고 압축해제와 업로드를 한번에 진행합니다. Gunzip에 -c 옵션을 통해 표준 출력으로 압축 해제하고, hadoop fs -put 명령어로 HDFS상의 데이터를 올리면 된다.


명령어 A | 명령어 B : 명령어 A를 실행한 뒤 명령어 B를 실행한다. 


$ gunzip -c access_log.gz \

| hadoop fs -put - weblog/access_log


8. hadoop fs -ls 명령어로 아파치 로그 파일이 HDFS상의 home 디렉토리 안에 있는 것을 확인할 수 있다.


9. 엑세스 로그 파일은 큰 파일이다. - 전체 500MB, 이 파일을 5000줄만 포함된 작은 파일로 만들고, HDFS상의 저장한다. 다음 Exercise에서 시험하기 위한 작은 버전을 사용할 수 있다.


$ hadoop fs -mkdir testlog

$ gunzip -c access_log.gz | head -n 5000 \

| hadoop fs -put -testlog/test_access_log



Step 3: Viewing and Manipulating Files


이제 HDFS에 복사된 몇가지의 데이터 일부를 살펴보자.


1. 아래와 같이 입력

$ hadoop fs -ls shakespeare


/user/training/shakespeare 디렉토리 안에 코미디, 용어, 역사, 시 그리고 희극으로 구성된 파일을 확인할 수 있다.


2. glossary 파일은 엄격하게 보면 셰익스피어의 작품이 아니다. 그러므로 파일을 삭제:

$ hadoop fs -rm shakespeare/glossary


원한다면 이 파일을 남길 수 있다는 것을 알아 두자. 남길 경우, 연산 이후 셰익스피어 파일에 포함될 것이며, 그리고 결과가 약간 불완전 할 것이다.


3. 입력:

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


이 터미널에 헨리 IV, 제 1의 마지막 50줄을 print한다. 이 명령어는 맵리듀스 프로그램의 출력을 보기 편리하게 한다. 대개, 맵리듀스 프로그램의 각각 출력 파일은 터미널의 전체 파일을 볼 때 매우 불편합니다. 이러한 이유로, fs -cat 명령어의 출력에 head, tail, more나 less 명령어를 추가하는 것을 권장한다.


로컬 유닉스 명령에 fs -cat 명령어를 출력할 때, 파일의 전체 내용은 여전히 HDFS에서 추출하여 로컬 컴퓨터로 전송된다는 것을 숙지하자. 일단 로컬 컴퓨터에선, 파일의 내용은 표시되기 전에 수정이 됩니다.


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


HDFS 내용을 로컬 파일시스템에 복사 :

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

$ less ~/shakepoems.txt




일반적인 파일시스템 조작을 수행하기 위해, FsShell 서브 시스템과 관련된 여러가지 명령어가 존재합니다.

예) mv, cp, mkdir, etc.