소개
소매업체가 **매장의 일일 기록에 어떤 상품이 가장 자주 등장했는가?**라는 간단한 질문에 답하도록 도와주는 상황입니다. 무엇이든 세기 전에 먼저 파일을 모으고 내용에 접근할 수 있는지, 내용이 올바른지 확인해야 합니다. 이 실습은 그 여정의 첫 단계입니다.
일상적인 데이터에서 빅데이터로
매장 하나의 일일 기록은 노트북에서 열 수 있는 작은 파일에 저장할 수 있습니다. 이제 수천 개의 매장에서 매일 기록을 보내고, 웹사이트 활동과 창고의 변경 정보도 함께 들어온다고 생각해 보세요. 보관할 데이터는 많아지고 새 데이터는 계속 도착하며, 파일 구조도 서로 다를 수 있습니다.
빅데이터는 크기, 유입 속도 또는 복잡성 때문에 현재 사용하는 도구와 자원으로 처리하기 어려운 데이터 작업을 말합니다. 파일이 몇 행을 넘으면 빅데이터가 된다는 보편적인 기준은 없습니다. 실제로 중요한 질문은 데이터를 저장할 수 있는지, 주어진 시간 안에 처리할 수 있는지, 장비에 장애가 발생해도 작업을 계속할 수 있는지입니다.
작은 판매 파일이라면 스프레드시트, 데이터베이스 또는 Python 스크립트로 충분할 수 있습니다. 작업 규모가 커지면 서로 연결된 여러 컴퓨터에 저장과 처리를 나누는 방법을 사용할 수 있습니다. 함께 일하는 컴퓨터 집합을 **클러스터(cluster)**라고 하며, 여러 컴퓨터가 작업을 나누는 방식을 분산(distributed) 컴퓨팅이라고 합니다.
Hadoop의 역할
Apache Hadoop은 클러스터에서 데이터를 저장하고 처리하는 오픈 소스 도구 모음입니다. 다음 두 구성 요소를 알면 기본적인 역할을 이해할 수 있습니다.
| 구성 요소 | 역할 | 소매업체의 질문 |
|---|---|---|
| HDFS — Hadoop 분산 파일 시스템(Hadoop Distributed File System) | 여러 컴퓨터에 파일을 저장하고, 설정에 따라 데이터 복제본을 유지합니다. | 매일 들어오는 입력 파일을 어디에 보관할 수 있을까요? |
| MapReduce — 배치 처리 프레임워크 | 처리 작업을 작은 태스크로 나눈 뒤 결과를 합칩니다. | 여러 파일에 있는 상품 이름을 어떻게 셀 수 있을까요? |
**배치(batch)**는 어제의 파일처럼 범위가 정해져 있고 함께 처리하는 데이터 집합입니다. 이후 실습에서는 미리 만들어진 집계 프로그램을 실행합니다. 이번 실습에서는 저장을 담당하는 HDFS를 사용합니다. 계산은 의도한 데이터를 읽어야 의미가 있기 때문입니다.
Hadoop은 더 넓은 데이터 도구 생태계의 일부입니다. 이후 과정에서는 파일을 SQL로 조회하는 Hive, 코드로 데이터를 처리하는 Spark, 이벤트를 지속적으로 전달하는 Kafka를 소개합니다. 이 실습을 시작하는 데 해당 도구는 필요하지 않으며, 지금 이름을 모두 외울 필요도 없습니다.
작업 흐름의 첫 단계
소매업체의 작업 흐름을 간단히 나타내면 다음과 같습니다.
상품 파일 수집 → HDFS에 저장 → 배치 처리 → 집계 결과 확인
여기서 시작
여러분의 작업은 파일 하나를 업로드하고 다시 읽은 뒤 내용이 그대로 보존되었는지 확인하는 것입니다. 요리에 쓰기 전에 재료를 확인하는 것과 비슷합니다. 신뢰할 수 있는 계산을 하려면 먼저 데이터를 올바르게 저장해야 합니다.
이 실습은 컴퓨터 한 대에 Hadoop을 제공하므로, 클러스터를 설치하지 않고 실제 HDFS 명령을 배울 수 있습니다. 이 환경에서도 로컬 파일과 HDFS 파일은 경로와 접근 명령이 구분됩니다. 여러 컴퓨터에 분산된 저장이나 컴퓨터 장애로부터의 복구를 보여주는 환경은 아닙니다. 이후 HDFS를 살펴보면서 이러한 개념을 더 자세히 이해하게 됩니다.
실습을 마치면 다음을 할 수 있습니다.
- 로컬 파일과 HDFS에 저장된 파일을 구분합니다.
- HDFS 디렉터리를 만들고 파일을 업로드합니다.
- HDFS 파일을 읽어 로컬 원본과 비교합니다.
- 같은 데이터를 다른 대상 파일 이름으로 업로드합니다.
실습 내내 Terminal(터미널) 탭을 사용합니다. 기본적인 터미널 사용법만 알면 되며 Java나 Python 프로그래밍은 필요하지 않습니다. 경로와 터미널 명령이 처음이라면 Linux 학습 경로부터 시작해 보세요.
첫 번째 파일을 HDFS에 업로드하기
이 단계에서는 로컬 파일을 살펴보고, 자신의 HDFS 디렉터리를 만든 다음 파일을 업로드합니다.
터미널은 요청을 입력하는 곳입니다. hdfs 명령은 클라이언트로서, 저장된 파일을 관리하는 실행 중인 HDFS 서비스에 요청을 보냅니다. 아래에는 로컬 Linux 명령과 HDFS 명령이 함께 나옵니다. 어떤 명령을 사용하는지 보면 어느 저장소에 접근하는지 알 수 있습니다.
실습 환경에는 HDFS 서비스가 이미 시작되어 있고 작은 입력 파일도 준비되어 있습니다. 터미널을 클릭하고 아래 명령을 차례로 실행하세요. 각 명령을 실행한 뒤 프롬프트가 다시 나타나면 다음 명령으로 넘어갑니다. 프롬프트 기호 없이 명령만 복사하세요.
cd로 셸의 현재 위치를 로컬 프로젝트 디렉터리로 이동합니다.
cd /home/labex/project
경로가 /로 시작하므로 절대 경로입니다. 로컬 입력 파일은 이 위치 아래의 data 디렉터리에 있습니다. 일반적인 Linux cat 명령은 로컬 파일의 내용을 표시합니다.
cat /home/labex/project/data/products.txt
예상 내용은 다음과 같습니다.
notebook pen notebook
folder pen
notebook folder
이 단순화된 예제에서 각 단어는 상품 이름이고, 한 번 등장할 때마다 기록된 상품 한 개를 나타냅니다. notebook과 pen은 합쳐서 다섯 번 등장합니다. 공책(notebook) 세 개와 펜(pen) 두 개이므로 손으로도 셀 수 있습니다. 큰 파일이 많아지면 배치 프로그램이 이 집계를 대신할 수 있습니다.
지금은 이 질문을 기억하면서 텍스트를 그대로 저장하는 데 집중하세요. 결과가 올바른지 즉시 알아볼 수 있도록 읽기 쉬운 세 줄을 사용합니다. 이 예제 자체에 Hadoop이 필요한 것은 아닙니다.
HDFS에는 별도의 디렉터리 트리가 있습니다. 이 환경에서 hdfs dfs는 파일 시스템 명령을 HDFS로 보냅니다. Linux mkdir로 로컬 디렉터리를 만들어도 HDFS 디렉터리는 만들어지지 않습니다.
HDFS 홈인 /user/labex 아래에 디렉터리를 만듭니다. -mkdir 연산은 디렉터리를 만들고, -p는 없는 상위 디렉터리도 만들며 대상 디렉터리가 이미 있어도 허용합니다.
hdfs dfs -mkdir -p /user/labex/your-first-hadoop-lab
성공하면 대개 아무것도 출력되지 않습니다. 작업이 끝나면 프롬프트가 다시 나타납니다. 로컬 경로와 같은 슬래시 표기법을 사용하지만 이 디렉터리는 HDFS에 있습니다.
-put 연산은 로컬 원본 파일을 HDFS 대상 위치에 복사합니다. 아래에서 첫 번째 경로는 로컬 경로이고 두 번째 경로는 HDFS 경로입니다.
hdfs dfs -put /home/labex/project/data/products.txt /user/labex/your-first-hadoop-lab/products.txt
업로드가 성공하면 대개 출력이 없으며 로컬 원본도 그대로 남습니다. 성공한 뒤 같은 명령을 반복하면 HDFS는 대상이 이미 있다고 알립니다. 파일을 확인하는 단계로 계속 진행하세요. 삭제하거나 덮어쓸 필요는 없습니다.
-ls로 HDFS 디렉터리의 내용을 나열합니다.
hdfs dfs -ls /user/labex/your-first-hadoop-lab
Found 1 items와 함께 다음 경로로 끝나는 파일 항목이 보여야 합니다.
/user/labex/your-first-hadoop-lab/products.txt
항목에는 권한, 소유자, 그룹, 크기와 수정 시간도 포함됩니다. 이 정보는 이후에 살펴봅니다. 지금은 대상 경로를 통해 HDFS에 파일이 있다는 것을 확인하면 됩니다. 다음으로 내용을 확인하겠습니다.
파일을 다시 읽고 내용 확인하기
이 단계에서는 HDFS 파일을 읽고 내용을 로컬에 저장한 뒤 원본과 비교합니다.
소매업체는 결국 저장된 파일의 상품 이름을 집계하게 됩니다. 잘못된 파일을 업로드하거나 한 줄이 빠지면 프로그램이 성공적으로 실행되어도 집계가 잘못될 수 있습니다. 디렉터리 목록은 파일이 있다는 것은 보여주지만 내용이 올바른지는 보장하지 않습니다.
다시 읽기 전에 무엇이 보여야 할지 예상해 보세요. 업로드하면 상품 이름이 바뀌거나 줄이 없어질까요? HDFS의 -cat 연산은 HDFS 파일을 읽어 터미널에 내용을 출력합니다.
hdfs dfs -cat /user/labex/your-first-hadoop-lab/products.txt
예상 내용은 다음과 같습니다.
notebook pen notebook
folder pen
notebook folder
1단계에서 살펴본 로컬 파일과 비교하세요. 단어와 줄바꿈이 같아야 합니다. 명령의 차이도 확인하세요. cat은 로컬 파일을 읽고, 이 환경의 hdfs dfs -cat은 HDFS 파일을 읽습니다.
다시 읽은 결과를 로컬 사본으로 보관하려면 셸의 > 연산자를 사용합니다. 명령이 출력한 내용을 로컬 파일로 리디렉션하며, 파일이 없으면 만들고 있으면 기존 내용을 바꿉니다. 준비된 output 디렉터리에 결과를 저장합니다.
hdfs dfs -cat /user/labex/your-first-hadoop-lab/products.txt > /home/labex/project/output/products-readback.txt
이번에는 텍스트가 로컬 출력 파일에 기록되므로 터미널에 상품 텍스트가 보이지 않습니다. HDFS 원본은 바뀌지 않습니다. 로컬 cat 명령으로 저장한 결과를 읽습니다.
cat /home/labex/project/output/products-readback.txt
같은 세 줄이 표시되어야 합니다. 이제 로컬 원본, HDFS 파일, 로컬에 다시 읽어 저장한 파일이 각각 있습니다.
diff로 원본과 저장한 결과를 비교합니다. 두 파일이 동일하면 diff는 아무것도 출력하지 않고 성공적으로 종료됩니다.
diff /home/labex/project/data/products.txt /home/labex/project/output/products-readback.txt
차이점이 출력되지 않고 프롬프트가 돌아오면 다시 읽은 내용이 원본과 같다는 뜻입니다. 차이가 나타나면 위에 나온 정확한 HDFS 원본 경로와 로컬 출력 경로로 다시 읽는 명령을 반복하고 비교하세요.
다른 대상 파일 이름으로 연습하기
이 단계에서는 업로드 명령의 한 부분을 바꾸고 파일 내용도 바뀌는지 확인합니다.
다음 명령을 실행하기 전에 결과를 예상해 보세요. 로컬 원본을 유지하고 HDFS 대상 파일 이름만 바꾸면 상품 이름이 바뀔까요? 첫 번째 HDFS 파일은 여전히 남아 있을까요?
로컬 원본을 다시 업로드하되 이번에는 대상 이름으로 products-copy.txt를 사용합니다.
hdfs dfs -put /home/labex/project/data/products.txt /user/labex/your-first-hadoop-lab/products-copy.txt
앞에서처럼 업로드가 성공하면 대개 출력이 없습니다. 이미 이 업로드를 완료했다면 대상이 존재한다는 메시지는 다시 업로드하지 말고 파일을 확인하라는 뜻입니다.
HDFS 디렉터리 내용을 나열하여 예상을 확인합니다.
hdfs dfs -ls /user/labex/your-first-hadoop-lab
이제 Found 2 items와 함께 다음 경로로 끝나는 항목이 보여야 합니다.
/user/labex/your-first-hadoop-lab/products-copy.txt
/user/labex/your-first-hadoop-lab/products.txt
-put은 지정한 대상에 로컬 원본을 복사하며 앞서 만든 HDFS 파일의 이름을 바꾸지 않으므로 두 파일이 모두 남습니다. 두 번째 파일은 같은 기록의 연습용 사본이며 새로운 날짜의 판매 데이터가 아닙니다. 배치 입력을 준비하는 방법을 배울 때는 같은 사본을 두 번 집계하지 않도록 파일을 신중하게 선택하게 됩니다.
새 HDFS 파일을 읽습니다.
hdfs dfs -cat /user/labex/your-first-hadoop-lab/products-copy.txt
출력에는 동일한 세 줄의 상품 이름이 있어야 합니다. 파일 이름을 바꿔도 내용은 바뀌지 않습니다.
같은 방법으로 새 파일을 다시 읽어 로컬에 저장합니다.
hdfs dfs -cat /user/labex/your-first-hadoop-lab/products-copy.txt > /home/labex/project/output/products-copy-readback.txt
저장한 결과를 원본과 비교합니다.
diff /home/labex/project/data/products.txt /home/labex/project/output/products-copy-readback.txt
차이가 출력되지 않아야 합니다. 첫 번째 HDFS 파일이 남아 있고 두 번째 파일에도 동일한 데이터가 있다는 두 가지 예상을 모두 확인했습니다.
다음으로 넘어가기 전에 로컬 파일을 읽는 명령과 HDFS 파일을 읽는 명령을 구분해 보세요. 다음 실습에서는 HDFS 명령이 어디로 연결할지 결정하는 구성을 살펴봅니다.
요약
소매업체가 상품 기록을 모으고 집계해야 하는 상황에서 시작했습니다. 데이터 작업 규모가 커지면 왜 분산 저장과 처리가 필요할 수 있는지, Hadoop이 어떤 역할을 하는지 배웠습니다. HDFS는 파일을 저장하고 MapReduce는 배치를 처리할 수 있습니다.
작업 흐름 중 저장 부분을 완료했습니다. 로컬 상품 텍스트 파일을 HDFS에 업로드하고 다시 읽은 다음, diff로 내용이 보존되었는지 확인했습니다. 이어서 HDFS 대상 이름만 바꾸었을 때의 영향을 예상하고 검증했습니다.
hdfs dfs -mkdir -p, -put, -ls, -cat을 연습하고 이러한 HDFS 연산을 로컬 cat 및 셸 출력 리디렉션과 구분했습니다. 다음으로 Hadoop 클라이언트가 HDFS를 찾는 방식과 저장 및 계산이 함께 작동하는 방식을 살펴봅니다.



