데이터실무
DA, SQL, DB보안 등 실무자를 위한 위한 DB기술 바이블!
하둡의 맵리듀스는 일반적으로 자바로 개발한다. 다른 언어로 개발해 하둡의 스트리밍 기능으로 운용할 수 있지만, 여기에서는 순수 자바로만 작성한다. 선호하는 자바 IDE를 사용하면 되는데, 여기서는 IDE로 이클립스를, 빌드 도구로는 메이븐(Maven)을 선택했다. 하둡 클러스터 환경에서 하둡 예제 가운데 하나인 WordCount로 맵리듀스를 실행해보자. 실행 절차는 다음과 같다. ssh로 접근하게 된다. 시스템마다 포트 번호가 다를 수 있으니 확인 후 접속한다. 다음은 ryan이라는 아이디로 hdp.pvm.centos라는 호스트의 하둡 시스템에 접근하는 예다. 다음은 HDFS에서 사용자 계정에 data라는 디렉터리를 만드는 과정이다. ryan이라는 계정은 필자가 ryan:hdfs 소유권으로 직접 만든 디렉터리이자 사용자다. 임의의 데이터를 HDFS의 /user/{id}/data 디렉터리에 업로드한다. 어떤 데이터를 업로드하든 신경 쓸 필요는 없다. 테스트이므로 편의상 텍스트 위주의 데이터를 업로드하자. put이나 copyFromLocal 명령으로 다음과 같이 수행하면 된다. 하둡을 설치할 때 자동으로 설치된 예제 프로그램을 실행해 보자. 예제 프로그램은 하둡을 어떻게 설치했느냐에 따라 다르지만, 기본으로 설치했을 때에는 /usr/lib/hadoop-mapreduce에 있다. 다음과 같이 실행하면 샘플 예제 프로그램을 살펴볼 수 있다. 여기서 아래 부분에 있는 WordCount라는 프로그램으로 ‘초간단 테스트’를 해보자. 이제 데이터도 HDFS에서 업로드했으니 WordCount를 실행한다. 위와 같이 실행하면 사용법이 나온다.?은 데이터 경로를,?은 wordcount가 실행결과를 출력할 경로를 의미한다. 여기서는 /user/{id}/data를 만들어 그 안에 데이터를 업로드 했으므로 다음과 같이 실행하고 로그를 살펴보자. 어떤 Exception과 에러가 없다면 성공적으로 끝난 것이다. 중간 부분의 “Job job_1409582940230_0005 completed successfully”라는 메시지에서 job_1409582940230_0005는 Job ID다. 하둡에서는 모든 맵리듀스의 실행 단위를 Job이라고 부르며, 실행할 때마다 Job ID가 생성된다. WordCount라는 맵리듀스를 실행해 보았다. 뒤에서 설명하겠지만, 텍스트 데이터를 읽어 단어를 세는 프로그램임을 금방 알 수 있다. 결과를 확인해 보자. 다음은 part-r-00000 파일의 실행 결과다. 결과가 정상적으로 나왔음을 알 수 있다. 참고로 필자가 올린 데이터는 인터넷에서 구한「해리포터」1권의 내용이다. 이제부터 이클립스로 맵리듀스 개발환경을 구현해 보자. 하둡 개발을 위한 표준 환경은 없지만, 앞서 소개했던 이클립스와 메이븐을 많이 이용한다. 먼저 이클립스를 실행한다. 아마도 실행하면 [그림 Ⅲ-1-2] 이클립스 자바 퍼스펙티브 초기화면과 비슷한 화면이 출력될 것이다. 필자는 이클립스 LUNA를 설치했다. [File > New > Other]의 Wizards: 텍스트 박스에 Maven이라고 입력해 Maven Project를 선택한다. 이어서 [그림 Ⅲ-1-3]처럼 Group Id와 Artifact Id 모두 WordCount로 하고, 패키지 이름은 kr.or.kodb로 지정하면, 메이븐 프로젝트 Template이 만들어진다. [그림 Ⅲ-1-2] 이클립스 자바 퍼스펙티브 초기화면 [그림 Ⅲ-1-3] 메이븐 프로젝트 생성 초기화면 프로젝트에 있는 pom.xml 파일을 다음과 같이 수정한다. 이제 앞서 실행했던 샘플 예제 WordCount 파일을 열어서 복사한다. 소스코드 전문은 다음과 같다. 프로젝트 이름의 오른쪽을 클릭해 [Run As > Run Configurations …]을 선택한다. 왼쪽의 Java Application을 클릭해 실행 프로그램을 생성한다. 이름을 WordCount라고 입력하는데 이 예에서는 WordCount(2)로 했다. 이어서 오른쪽 두 번째의 Arguments 탭을 클릭해 Program arguments 항목에서 데이터 입력 및 출력 경로를 입력한다. 필자는 입력 경로로 /Users/Ryan/Workspace/Java/WordCount/data를, 출력 경로로 /Users/Ryan/Workspace/Java/WordCount/output이라 입력했다. (프로젝트 내부에 해당 경로를 [그림 Ⅲ-1-5]와 같이 만들었다.) [그림 Ⅲ-1-4] 워드카운트 실행(커맨드라인 파라미터 추가) [그림 Ⅲ-1-5] 워드카운트 애플리케이션 실행 이클립스는 큰 문제 없이 실행될 것이다. 결과 또한 앞서 하둡 시스템에서 실행했던 것과 비슷할 것이다. 출력 결과는 다음 그림의 output 디렉터리에서 확인할 수 있다. [그림 Ⅲ-1-6] 워드카운트 맵리듀스 결과 화면 이제 메이븐 빌드를 실행해 보자. 메이븐은 해당 pom.xml 파일이 있는 곳에서 실행해도 되고, 이클립스에서 실행해도 된다. 여기서는 이클립스에서 실행한다. 우선 프로젝트 이름에서 마우스 오른쪽 버튼을 클릭해 [Run As > Maven install]을 선택하면 [그림 Ⅲ-1-7]처럼 실행된다. 그리고 이클립스 Package Explorer에서 ‘프로젝트 새로 고침’을 선택하면 target 디렉터리 안에 WordCount-0.0.1-SNAPSHOT.jar 파일이 생성된 것을 확인할 수 있다. 이 파일을 하둡 시스템에 배포한다. (하둡 시스템에 자동으로 설치된 예제와 같은 기능을 한다.) [그림 Ⅲ-1-7] 메이븐 빌드 하둡 클러스터로 메이븐을 빌드한 jar 파일을 배포한다. 하둡 클러스터에서 배포한 파일을 다음과 같이 실행해 본다. 이 섹션에서는 예제 프로그램을 하둡 클러스터에서 실행해 보는 것으로 맵리듀스 실행방법을 알아보았다. 또한 이클립스를 이용해 맵리듀스 개발환경을 구축하고 메이븐을 통해 빌드했다.맵리듀스 개발환경의 이해
맵리듀스 맛보기
하둡 클러스터에 로그인
HDFS에서 자신의 계정에 데이터 디렉터리 생성
HDFS 명령어로 데이터 업로드
맵리듀스 예제 실행
워드카운트 맵리듀스 예제 실행
결과 확인
개발환경 구축
이클립스 메이븐 프로젝트 생성
Mapper/Reducer 클래스 생성
자바 애플리케이션 실행
맵리듀스 애플리케이션 실행
빌드
[Note]
빌드 배포시스템을 통해서 jar 파일을 개발 클러스터에 자동으로 배포하는 것이 좋다. 매번 수동으로 scp나 FTP 프로그램을 실행해 배포하는 것은 매우 귀찮은 일이다. 메이븐에 내장된 ant scp 플러그인을 이용하는 것도 좋다. 하지만 이것은 빌드 과정에서 배포이므로 Jenkins 같은 CI 툴을 이용하는 것을 추천한다.
배포와 실행