하둡 Hadoop 에서 분산 컴퓨팅을 위한 MapReducer 임의 컴파일 및 실행하기 - 분산 처리 - Whitmem
하둡 Hadoop 에서 분산 컴퓨팅을 위한 MapReducer 임의 컴파일 및 실행하기 - 분산 처리
빅데이터 프로그래밍
2025-06-27 23:55 게시 e6d3fe0158c14ab0140f

0
0
11
이 페이지는 외부 공간에 무단 복제할 수 없으며 오직 있는 그대로 게시되며 부정확한 내용을 포함할 수 있습니다. 법률이 허용하는 한 가이드 라인에 맞춰 게시 내용을 인용하거나 출처로 표기할 수 있습니다.
This page is not to be distributed to external services; it is provided as is and may contain inaccuracies.
이전 게시글에서는 기본적인 하둡 세팅을 진행하였다. 이제 하둡에서 대량의 파일을 넣고 이를 한 번에 통계를 낼 수 있는 MapReducer 을 자바 프로그램으로 간단하게 컴파일해서 그 컴파일 본을 분산 컴퓨터 환경에서 실행해보기로 한다.
우선 기본적으로 HDFS 내에 files 라는 디렉터리를 만들고 대량 파일을 추가하였다.
이 파일은 기본적으로 CHAT GPT 에 부탁하여 랜덤 파일을 대량 생성하였다 ㅋㅋ... 중복되는 단어가 있는 여러 줄의 파일이다. 여기서는 하둡 공식 사이트의 튜토리얼에 있는 기본 소스 코드인 대량 파일을 읽어들여 단어 개수를 카운팅할 것이다.
프로젝트 세팅
이제 본격적으로 Java 프로그램을 컴파일해야 하는데, 라이브러리를 임포트해야 하고 작업해야 할 것이 많다. 코드는 우선 하둡 공식 사이트에서 제공하는 튜토리얼 코드를 사용할 것이다.
Hadoop MapReduce Tutorial
위 링크를 참고해보면 소스코드가 하나 있는데, 기본 메인 진입점, 그리고 IntSumReducerTokenizerMapper 클래스로 나누어져있는 것을 확인할 수 있다. 맵을 수행하는 처리자, 그리고 맵 결과를 바탕으로 리듀서를 수행하는 처리자, 마지막으로 이 클래스 정보를 넘기는 Main 진입점이 존재한다.
먼저 자바 프로젝트를 생성해야하는데, 이 자바 프로젝트는 단독으로 생성하는 것이 아니라 하둡 라이브러리를 가져와서 그 위에서 API를 호출해야한다. jar을 요즘 수동으로 임포트하는 경우는 매우 드물다. 과거 게임 플러그인을 개발할 때 까지만 하더라도 maven 이나 gradle 보다 jar 을 임포트하는 방법이 유행이었고 그렇게 개발을 해왔는데 13년 사이에 많은 것들이 바뀌었다. maven, gradle와 같은 관리 툴을 사용해서 외부 라이브러리를 통합 관리하는 것이 편리하다.
하지만 필자는 Eclipse 소프트웨어를 애용하나 어떠한 이유로 gradle 프로젝트가 생성되지 않는다. 따라서 여기서는 IntelliJ 소프트웨어를 사용해서 개발을 진행하기로 한다.
먼저 Java 프로젝틀르 생성할 때 Gradle 빌드 시스템으로 선택하고, Gradle DSL 은 코틀린으로 지정한다. JDK는 자바 버전 아무거나 하면되는데, 주의할 점은 하둡 시스템을 세팅할 때 서버의 자바 버전 보다는 낮아야 한다. 즉 하둡 시스템에 해당 개발한 자바 프로그램을 분산 실행할 것이기 때문에 자바 버전이 매우 높으면 API 등 다른 부분이 존재해서 실행할 수 없다.
필자는 서버에 11버전을 설치했기 때문에 11 버전으로 지정하고 프로젝트를 생성하였다.
프로젝트를 생성하면 build.gradle.kts라는 설정 파일이 보이는데, 이 파일 안에서 하둡 라이브러리를 선언해줘야 한다. 기본적으로 Maven 레포지토리를 사용하는데, 검색 경로는 아래와 같다.
implementation("org.apache.hadoop:hadoop-common:3.1.2") implementation("org.apache.hadoop:hadoop-mapreduce-client-core:3.1.2")
이는 Maven 서비스에 기본적으로 해당 오픈소스 라이브러리들이 게시되어 있는 것으로 이 코드를 작성하면 다운로드 받아 컴파일 및 런타임시 참조할 수 있도록 해준다.
의존성 정보이기 때문에 의존성 구역에다가 추가해주면 된다.
레포지토리 목록은 mavenCentral() 이 등록되어 있어야 한다.
그리고 필자의 경우 자바 버전 오류가 발생해서 이 build.gradle.kts 에서 다시 자바 버전을 지정하였다. 서버는 OpenJDK 11 버전을 사용하는데 이 프로젝트에서 JDK 11을 지정하여도 시스템의 21로 강제 빌드 되는 문제가 있어, java 블럭에 languageVersion 섹션을 추가하여 자바 버전을 11로 명시한다.
즉 필자는 위와 같이 세팅이 완료되었다.
이제 옆의 gradle 버튼인 귀여운 코끼리 모양을 눌러 Gradle 창을 열고, 새로고침한다. 필요한 라이브러리 및 필수 구성 요소가 자동으로 내려받아지고 프로젝트에 등록된다.
그리고 프로젝트의 Main 에 아까 하둡 공식 사이트에 존재하는 튜토리얼 코드를 모두 복사 붙여넣기 해서 채운다. 클래스 명이 기본 WordCount로 되어있는데 필자는 Main으로 고쳤다.
Main 클래스로 이름을 바꾸면 밑의 Main 진입점에서도 오류가 발생하는데 Jar 시작 클래스 지점이 사라졌다는 오류이다. Main.class 로 바꿔주면 된다. 아무튼 이렇게 오류가 모두 사라지면 이제 Build 를 진행해준다.
개발 도구에서 햄버거 모양을 누르고 Build 탭 -> Build Project 를 눌러 프로젝트를 빌드한다.
빌드가 완료되면, 이제 해당 프로젝트가 존재하는 디렉터리로 들어가면 build 라는 디렉터리가 생긴 것을 볼 수 있다.
이 build 디렉터리 내의 classes 에 빌드가 완료된 것인데ㅡ,
하둡에 MapReducer Job 을 넘겨주려면 JAR 파일로 넘겨줘야 한다. 따라서 JAR 로 압축을 해야하는데, (정확히는 압축이라기 보다는 생성이라는 의미로 봐야한다.) 이는 gradlew jar 명령을 통해 JAR 파일로 합칠 수 있다.
프로젝트의 디렉터리를 보면 gradlew 파일 또는 gradlew.bat 파일이 존재하는 것을 볼 수 있다. gradlew 파일은 리눅스용, gradlew.bat 파일은 윈도우 배치 파일용인데, 필자는 윈도우에서 개발을 하고 있기 때문에 gradlew.bat 파일을 실행하면서 jar 라는 명령어를 같이 넘기면 된다.
필자는 해당 명령을 실행하기 위해 별도 명령 프롬프트 또는 파월 셀 창을 열었다. 필요에 따라 다른 외부 명령 도구 또는 IDE 도구 안에 존재하는 터미널을 사용해도 무방하다.
먼저 명령 프롬프트를 열고 프로젝트가 존재하는 디렉터리로 이동한다.
그리고 gradlew.bat을 실행하면서 인자 값 jar 을 같이 넘겨준다.
빌드가 완료된 것을 볼 수 있다.
빌드가 완료되면 이제 프로젝트의 build 디렉터리 안에 libs 라는 디렉터리가 새로 생기는데, 이 안에 jar 파일이 생성되는 것을 확인할 수 있다. 이 jar 파일이 비로소 하둡 소프트웨어에 넘겨주면 되는 파일이다. 이 파일을 이제 하둡에서 실행하기 위해 하둡 노드 중 하나에 업로드 한다. 이는 하둡 내부에 업로드하라는 것이 아니라, 노드의 서버 리눅스에 옮기라는 의미이다.
필자는 하둡 메인 노드 서버에 방금 만든 jar 파일을 넣었으며 이제 이를 하둡 시스템에 전달하여 job으로 실행하도록 하면 된다. 아까 튜토리얼 사이트에서 복사한 코드는 WordCount 를 세는 프로그램이다. 첫 번째 인자로는 대량 파일이 존재하는 HDFS 경로, 두 번째 인자로는 그 결과가 내보내질 HDFS 경로를 입력하면 된다. JAR 을 실행하기 위해서 단순히 java -jar 로 시작하는 것이 아니라 하둡 시스템에 넘겨 전체 서버에 배포되고 실행되도록 해야한다.
명령어는 어렵지 않다.
hadoop jar <jar 파일 경로> <MAIN 클래스 위치> <전달 인자...>
여기서 jar 파일 경로는 현재 디렉터리 안에 있는 jar 파일 명을 입력해주고, MAIN 클래스 위치는 아까 Java 프로젝트를 생성할 때 기본 패키지 위치 및 Main 클래스 명칭을 입력해주면 된다. 마지막으로 이 프로그램에 넘겨질 인자, 아까 튜토리얼 기본 인자 2개는 대용량 파일 경로와 결과 출력 경로라고 했다. 이 정보를 입력해서 넘겨준다.
참고로 hadoop 명령어는 hadoop 이 설치된 배시 환경 (bashrc)에 등록되어 있기 때문에 하둡을 설치한 계정이 아닌 외부 계정의 경우 명령어가 없다고 뜰 수 있다.
Map 및 Reduce 작업이 수행되기 시작하는 것을 볼 수 있다. 필자의 경우 여기서 Yarn 관련 오류가 한번 떴었는데 환경 디렉터리가 명확하게 지정되어 있지 않아서 mapred-site.xml 에서 명확하게 추가하라는 오류가 떴었다. 이는 오류에 따라서 수정해주고 하둡 서버를 껐다 켜주면 된다... (모든 노드에 대해 진행하였다.)
아무튼 완료되면 결과 디렉터리가 아래와 같이 생성된다.
이 디렉터리에 들어가보면
실행된 리듀서 개수에 따라 part-r-**** 파일이 생성되어 있다. 이를 로컬로 내려받아 vi 로 열어본다.
개수가 잘 세져서 HDFS 에 기록되어 있는 것을 볼 수 있다.
참고로 part-r-00000 형식 파일 개수는 리듀서의 개수에 따라 늘어난다고 한다. 이 부분은 코드에서 지정할 수 있는데 분산 처리하는 개수라고 보면 되는 듯 싶다. 다음 게시글에서는 Map 코드와 Reduce 코드를 직접 작성하고 이해하는 과정에 대해서 작성할 것이다.
이 과정을 공부하기 위해서 다양한 공식 홈페이지 및 AI 채팅 서비스 (ChatGPT)를 다소 활용하였다. 다만 언급된 소스 코드, 내용, 글은 직접 필자가 이해한 내용으로 직접 작성한 것이고 상기 서비스는 원리 이해 및 검색에 참고만 하였을 뿐이다.
댓글 0개
댓글을 작성하는 경우 댓글 처리 방침에 동의하는 것으로 간주됩니다. 댓글을 작성하면 일회용 인증키가 발급되며, 해당 키를 분실하는 경우 댓글을 제거할 수 없습니다. 댓글을 작성하면 사용자 IP가 영구적으로 기록 및 부분 공개됩니다.
확인
Whitmemit 개인 일지 블로그는 개인이 운영하는 정보 공유 공간으로 사용자의 민감한 개인 정보를 직접 요구하거나 요청하지 않습니다. 기본적인 사이트 방문시 처리되는 처리 정보에 대해서는 '사이트 처리 방침'을 참고하십시오. 추가적인 기능의 제공을 위하여 쿠키 정보를 사용하고 있습니다. Whitmemit 에서 처리하는 정보는 식별 용도로 사용되며 기타 글꼴 및 폰트 라이브러리에서 쿠키 정보를 사용할 수 있습니다.
이 자료는 모두 필수 자료로 간주되며, 사이트 이용을 하거나, 탐색하는 경우 동의로 간주합니다.