YARN 배치 작업을 제출하고 확인하기

빅 데이터Beginner
지금 연습하기

소개

Map, Shuffle, Reduce의 흐름을 따라가고 실제 로컬 WordCount 실행을 확인했습니다. 이제 소매업체는 환경의 자원 관리 서비스를 사용하여 HDFS 파일에 같은 집계 규칙을 적용하려고 합니다. 업무 질문은 같고 저장 및 실행 구성이 바뀝니다.

YARN은 애플리케이션의 자원을 관리합니다. ResourceManager는 자원 할당을 조정하고, NodeManager는 작업용 컴퓨터의 실행을 관리합니다. 제출된 각 애플리케이션에는 작업을 조정하는 ApplicationMaster가 있으며, 프로세스를 포함하는 자원 할당 단위인 **컨테이너(container)**에서 작업을 실행합니다. YARN 컨테이너가 반드시 Docker 컨테이너인 것은 아닙니다.

준비된 WordCount JAR를 제출하고 실제 YARN 애플리케이션을 식별하며, 완료 상태와 로그를 살펴보고 HDFS 결과를 확인합니다. 두 번째 실행은 다른 출력 경로를 사용하여 원본 입력과 첫 결과를 계속 사용할 수 있게 합니다. 실습에서 데이터를 따로 준비하고 서비스를 시작하므로 이전 실습의 파일이나 Java 프로그래밍 기술은 필요하지 않습니다. 터미널을 사용하세요.

익숙한 알고리즘을 YARN에 제출하기

이 단계에서는 HDFS 입력을 준비하고 구성된 YARN 프레임워크로 같은 WordCount 알고리즘을 제출합니다.

로컬 작업 공간에서 시작합니다.

cd /home/labex/project

준비된 입력을 읽습니다.

cat /home/labex/project/data/product-words.txt

알고리즘 설명에 사용한 것과 같은 여섯 줄입니다. 예상 합계도 folder=3, notebook=4, pen=4로 같습니다. 결과용 상위 디렉터리와 분리된 HDFS 원본 디렉터리를 만듭니다.

hdfs dfs -mkdir -p /user/labex/yarn-batch/raw /user/labex/yarn-batch/results

입력을 업로드합니다.

hdfs dfs -put /home/labex/project/data/product-words.txt /user/labex/yarn-batch/raw/product-words.txt

-put이 로컬 원본을 유지한다는 것은 이미 배웠습니다. HDFS의 raw 디렉터리가 작업 입력입니다. 이전 출력을 새 입력으로 읽지 않도록 results는 그 밖에 두어야 합니다.

예제 JAR와 wordcount 이름은 로컬 실행과 같습니다. 이번에는 로컬 모드 재정의를 생략합니다. 설치된 구성은 mapreduce.framework.name=yarn과 HDFS 기본 파일 시스템을 사용합니다. 따라서 아래의 마지막 두 인수는 모두 HDFS 경로입니다. 작업은 자체적으로 run-1 출력 디렉터리를 만들며, 해당 디렉터리는 미리 존재하면 안 됩니다.

hadoop jar /opt/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.5.0.jar wordcount /user/labex/yarn-batch/raw /user/labex/yarn-batch/results/run-1

명령이 끝날 때까지 기다리세요. 제출된 애플리케이션 ID, 작업 진행 상황, 성공적인 완료 메시지가 차례로 출력됩니다. 애플리케이션 및 작업 ID, 시간과 진행 순서는 달라집니다. 순간적으로 나타나는 RUNNING 상태를 잡을 필요는 없습니다. 완료된 애플리케이션도 살펴볼 수 있습니다.

명령을 각 역할과 연결해 보세요.

클라이언트가 애플리케이션 제출 → ResourceManager가 자원 할당
ApplicationMaster가 MapReduce 작업 조정 → NodeManager가 컨테이너 실행
태스크가 HDFS 입력 읽기 → 태스크가 HDFS 결과 쓰기

여전히 컴퓨터 한 대로 된 학습 환경입니다. 프로세스가 한 컴퓨터를 공유해도 YARN의 역할은 실제로 작동합니다. 다음으로 YARN에 직접 질의하여 애플리케이션이 성공적으로 완료되었다는 증거를 확인합니다.

완료된 애플리케이션 확인하기

이 단계에서는 실제 애플리케이션 ID를 보관하고 이를 사용하여 상태와 집계된 로그를 조회합니다.

YARN은 애플리케이션을 수락할 때 **애플리케이션 ID(Application ID)**를 할당합니다. HDFS 경로나 결과 파일 이름과는 다릅니다. 완료된 애플리케이션을 포함하여 모든 상태의 애플리케이션을 나열합니다.

yarn application -list -appStates ALL

이 새 환경에는 제출한 애플리케이션이 하나 있습니다. 유형은 MAPREDUCE, 상태는 FINISHED, 최종 상태는 SUCCEEDED여야 합니다. FINISHED만으로 성공을 증명할 수는 없습니다. 최종 상태도 중요합니다.

예제 값을 복사하지 않고 실제 애플리케이션 ID를 저장합니다. 다음 파이프라인의 grep -o는 일치하는 부분만 출력합니다. 이 패턴에서 [0-9]*는 애플리케이션 ID의 숫자 나열과 일치합니다.

yarn application -list -appStates ALL | grep -o 'application_[0-9]*_[0-9]*' > /home/labex/project/output/application-id.txt

저장한 ID를 읽습니다.

cat /home/labex/project/output/application-id.txt

application_으로 시작하는 한 줄이 보여야 합니다. 나머지는 이 환경에서 할당한 값입니다. 다른 학습자의 ID를 사용하지 마세요.

저장한 값을 명령에 넣으려면 $(cat ...)을 사용합니다. cat을 실행한 뒤 그 출력으로 치환합니다. 큰따옴표는 치환된 값을 하나의 인수로 유지합니다. 실제 애플리케이션을 조회합니다.

yarn application -status "$(cat /home/labex/project/output/application-id.txt)"

State, Final-State, Application-Type을 찾으세요. 각각 FINISHED, SUCCEEDED, MAPREDUCE여야 합니다. 보고서를 저장합니다.

yarn application -status "$(cat /home/labex/project/output/application-id.txt)" > /home/labex/project/output/application-status.txt

YARN은 컨테이너 로그도 모읍니다. logs -applicationId 명령은 선택한 애플리케이션의 로그를 읽습니다. 살펴볼 분량을 조절할 수 있도록 로그를 로컬에 저장합니다.

yarn logs -applicationId "$(cat /home/labex/project/output/application-id.txt)" > /home/labex/project/output/application.log

로컬 tail -n 20으로 마지막 스무 줄을 표시합니다.

tail -n 20 /home/labex/project/output/application.log

정확한 로그 메시지는 달라집니다. 컨테이너 제목과 태스크 메시지를 통해 애플리케이션을 YARN이 실제로 실행한 작업과 연결할 수 있습니다. 로그는 동작을 설명하는 데 도움이 됩니다. 안심되는 로그 한 줄보다 성공 상태와 올바른 업무 출력이 함께 있는 것이 더 강한 증거입니다. 다음 실습에서는 같은 진단 도구를 실패 상황에 사용합니다.

입력을 오염시키지 않고 검증하고 다시 실행하기

이 단계에서는 결과 데이터를 확인하고 내보낸 뒤 두 번째 출력 경로로 다시 실행합니다.

첫 결과 디렉터리의 목록을 확인합니다.

hdfs dfs -ls /user/labex/yarn-batch/results/run-1

_SUCCESS 표시 파일은 출력 완료를 나타냅니다. part-* 파일에 집계가 들어 있습니다. 앞에서처럼 따옴표로 묶은 HDFS 패턴을 사용하고 기록을 정렬하여 안정적으로 확인합니다.

hdfs dfs -cat '/user/labex/yarn-batch/results/run-1/part-*' | sort

예상 결과는 다음과 같습니다.

folder 3
notebook 4
pen 4

다시 읽는 방법을 사용하여 정렬된 로컬 내보내기 결과를 저장합니다.

hdfs dfs -cat '/user/labex/yarn-batch/results/run-1/part-*' | sort > /home/labex/project/output/run-1-counts.txt

다음 실행 전에 같은 입력에 다시 실행하면 개수가 바뀔지 예상해 보세요. 바뀌지 않아야 합니다. 새 출력 경로를 사용하면 첫 결과를 유지하면서 출력이 이미 있다는 오류를 피할 수 있습니다.

hadoop jar /opt/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.5.0.jar wordcount /user/labex/yarn-batch/raw /user/labex/yarn-batch/results/run-2

성공적으로 완료되면 두 번째 실행의 집계를 읽고 정렬하여 저장합니다.

hdfs dfs -cat '/user/labex/yarn-batch/results/run-2/part-*' | sort > /home/labex/project/output/run-2-counts.txt

두 로컬 내보내기 결과를 비교합니다.

diff /home/labex/project/output/run-1-counts.txt /home/labex/project/output/run-2-counts.txt

차이가 나타나지 않아야 합니다. 두 결과는 원본 입력 디렉터리 밖에서 나란히 있으므로 다시 실행해도 이전 출력이 다음 입력 배치에 추가되지 않았습니다. 알고리즘을 바꾸지 않고 실제 애플리케이션, 로그, 결과 데이터, 반복 가능한 동작을 모두 확인했습니다.

요약

익숙한 집계 알고리즘을 로컬 실행에서 HDFS와 YARN으로 옮겼습니다. 실제 MapReduce 애플리케이션을 식별하고 성공적인 완료 상태와 컨테이너 로그를 살펴보았으며 두 출력 경로에서 올바른 결과를 확인했습니다.

알고리즘은 그대로 유지하면서 저장과 자원 관리 구성을 바꿨습니다. 다음에는 클라이언트 측 문제와 이미 제출된 애플리케이션의 실패를 구분하고 가장 작고 적절한 수정을 하는 방법을 배웁니다.