소개
이제 소매업체는 두 매장에서 이틀에 걸쳐 파일을 받습니다. 집계 프로그램은 전달받은 파일을 처리할 뿐, 여러분이 어느 날짜를 의도했는지 추측하거나 이전 결과 파일을 제외해야 한다고 판단하지 못합니다. 따라서 올바른 프로그램이라도 입력을 잘못 선택하면 잘못된 업무 결과를 낼 수 있습니다.
앞서 개별 파일을 보존하고 복사, 보관, 내보내는 방법을 배웠습니다. 여기서는 파일 하나에서 나아가 의도적으로 선택한 파일 집합인 **배치 입력(batch input)**을 준비합니다. 날짜를 나누고 파일 수와 내용을 비교하며, 한 번의 실행에 선택한 정확한 HDFS 파일 목록인 **매니페스트(manifest)**를 저장합니다.
HDFS는 상품 데이터의 열, 날짜 또는 CSV 헤더를 이해하지 않고 파일 내용을 저장합니다. 입력을 정리하기 전에 이러한 역할의 경계를 관찰합니다. 이 실습은 로컬 파일과 이전 결과 예시를 독립적으로 준비하며 이전 실습 상태에 의존하지 않습니다. 터미널을 사용하세요.
저장된 텍스트와 의미 구분하기
이 단계에서는 로컬에 도착한 파일을 살펴보고, CSV를 업로드해도 헤더가 일반 텍스트로 보존된다는 사실을 관찰합니다.
로컬 작업 공간에서 시작합니다.
cd /home/labex/project
첫 번째 날짜에 도착한 파일을 나열합니다. 디렉터리 이름에 날짜를 넣는 것은 유용한 규칙이지만 HDFS가 강제하는 데이터 형식은 아닙니다.
ls /home/labex/project/data/2026-10-14
store-east.txt와 store-west.txt가 보여야 합니다. 로컬 cat으로 그 순서대로 읽습니다.
cat /home/labex/project/data/2026-10-14/store-east.txt /home/labex/project/data/2026-10-14/store-west.txt
예상 텍스트는 다음과 같습니다.
notebook pen
notebook
folder pen
여기서는 각 단어가 기록된 상품 이름입니다. 이 파일은 이후에 배울 단어 집계 작업 흐름에 적합합니다. 다른 시스템에서는 다른 형식의 파일을 보냈습니다. 작은 CSV 예시를 읽습니다.
cat /home/labex/project/data/orders-preview.csv
예상 텍스트는 다음과 같습니다.
product,quantity
notebook,2
pen,1
CSV는 쉼표로 필드를 구분합니다. 첫 줄은 열 이름을 나타내는 **헤더(header)**이고 나머지 두 줄은 업무 기록입니다. HDFS는 첫 줄을 자동으로 제거하거나 quantity를 정수로 해석하지 않습니다.
이 예시를 상품 이름 배치와 분리합니다. 예시용 HDFS 디렉터리를 만듭니다.
hdfs dfs -mkdir -p /user/labex/batch-inputs/preview
CSV를 업로드합니다.
hdfs dfs -put /home/labex/project/data/orders-preview.csv /user/labex/batch-inputs/preview/orders.csv
다시 읽습니다.
hdfs dfs -cat /user/labex/batch-inputs/preview/orders.csv
헤더를 포함한 세 줄이 모두 남아 있습니다. 헤더를 건너뛸지, 숫자를 해석할지는 처리 단계에서 결정합니다. 모든 파일을 읽을 수 있더라도 이 파일을 상품 이름 입력에 섞으면 계산의 의미가 바뀝니다.
도착한 파일을 날짜별로 정리하기
이 단계에서는 날짜마다 원본 입력 디렉터리를 따로 만들고 해당하는 두 매장 파일을 업로드합니다.
입력과 출력의 차이가 드러나는 디렉터리 구조를 사용합니다.
batch-inputs/
raw/2026-10-14/ 첫날의 상품 파일
raw/2026-10-15/ 다음 날의 상품 파일
preview/ CSV 형식 예시
results/previous-run/ 미리 준비된 이전 실행 결과
이전 결과는 입력 선택을 배우기 위해 준비된 예시일 뿐입니다. 새 원본 배치에 포함되어서는 안 됩니다. 날짜별 디렉터리 두 개를 만듭니다.
hdfs dfs -mkdir -p /user/labex/batch-inputs/raw/2026-10-14 /user/labex/batch-inputs/raw/2026-10-15
셸의 *.txt 패턴은 .txt로 끝나는 로컬 파일 이름과 일치합니다. 다음 명령에서는 HDFS 클라이언트를 실행하기 전에 셸이 따옴표로 묶이지 않은 로컬 패턴을 두 원본 경로로 확장합니다. 마지막 인수는 이미 있는 HDFS 디렉터리입니다.
hdfs dfs -put /home/labex/project/data/2026-10-14/*.txt /user/labex/batch-inputs/raw/2026-10-14/
이제 두 위치의 날짜만 바꾸어 두 번째로 도착한 파일을 업로드합니다.
hdfs dfs -put /home/labex/project/data/2026-10-15/*.txt /user/labex/batch-inputs/raw/2026-10-15/
대상 파일이 이미 있다면 덮어쓰기를 결정하기 전에 내용을 확인하세요. 업로드 명령을 다시 실행하려고 원본 입력을 삭제하는 것보다 보존하는 것이 더 유용합니다.
파일 수명 주기 실습에서 배운 -count로 각 배치를 확인합니다.
hdfs dfs -count /user/labex/batch-inputs/raw/2026-10-14 /user/labex/batch-inputs/raw/2026-10-15
날짜마다 디렉터리 하나와 파일 두 개가 있어야 합니다. 날짜마다 기록이 다르므로 내용 크기 열은 같을 필요가 없습니다. 파일 수만으로 올바른 날짜를 선택했는지 증명할 수 없으므로 첫 날짜의 목록도 확인합니다.
hdfs dfs -ls /user/labex/batch-inputs/raw/2026-10-14
두 항목 모두 2026-10-14 아래에 예상한 매장 이름을 보여야 합니다. 파일 몇 개가 작으면 실습을 쉽게 읽고 이해할 수 있습니다. 규모가 훨씬 커지면 아주 작은 파일이 많을수록 HDFS 메타데이터 관리 부담이 생깁니다. 그렇다고 모든 작은 파일을 항상 합쳐야 한다는 뜻은 아닙니다.
배치 하나를 선택하고 확인하기
이 단계에서는 10월 14일의 정확한 파일 목록을 만들고 입력 텍스트를 해당 날짜에 도착한 로컬 파일과 비교합니다.
명령을 실행하기 전에 목록에 넣어야 할 디렉터리를 예상해 보세요. batch-inputs 전체, raw 전체, 아니면 raw/2026-10-14만 해당할까요? 범위를 좁힌 날짜 디렉터리는 요청한 날짜에 맞으며 다음 날짜, CSV 예시, 이전 결과를 제외합니다.
HDFS의 -ls -C 옵션은 자세한 목록 열 없이 경로만 출력합니다. 선택한 날짜에 사용합니다.
hdfs dfs -ls -C /user/labex/batch-inputs/raw/2026-10-14
두 경로는 store-east.txt와 store-west.txt로 끝나야 합니다. 저장한 목록을 쉽게 비교하려면 |로 표시하는 셸 **파이프라인(pipeline)**을 사용합니다. 첫 명령의 출력을 두 번째 명령에 전달합니다. sort는 줄을 정렬하고 >는 결과를 로컬에 저장합니다.
hdfs dfs -ls -C /user/labex/batch-inputs/raw/2026-10-14 | sort > /home/labex/project/output/input-manifest.txt
파일 목록을 읽습니다.
cat /home/labex/project/output/input-manifest.txt
예상 경로는 다음과 같습니다.
/user/labex/batch-inputs/raw/2026-10-14/store-east.txt
/user/labex/batch-inputs/raw/2026-10-14/store-west.txt
HDFS 쪽에서도 패턴을 사용할 수 있습니다. 작은따옴표는 *.txt를 그대로 전달하므로, 로컬 셸 대신 HDFS 클라이언트가 원격 경로를 찾습니다.
hdfs dfs -cat '/user/labex/batch-inputs/raw/2026-10-14/*.txt' > /home/labex/project/output/selected-input.txt
이 파일 이름에서는 HDFS가 east 파일을 west 파일보다 먼저 읽습니다. 이에 해당하는 로컬 텍스트를 같은 순서로 명시하여 저장합니다.
cat /home/labex/project/data/2026-10-14/store-east.txt /home/labex/project/data/2026-10-14/store-west.txt > /home/labex/project/output/expected-input.txt
둘을 비교합니다.
diff /home/labex/project/output/expected-input.txt /home/labex/project/output/selected-input.txt
차이가 나타나지 않아야 합니다. 추가로 wc -l은 각 파일에서 줄바꿈으로 끝나는 줄의 수를 셉니다.
wc -l /home/labex/project/output/selected-input.txt
결과는 3으로 시작해야 합니다. 이것은 상품 이름 다섯 개를 담은 텍스트 세 줄이며, 주문 세 건이 아닙니다. 기록의 의미는 HDFS가 아니라 파일 형식과 작업에서 정해집니다. 파일 목록, 파일 내용, 줄 수를 함께 확인하면 어떤 입력을 선택했는지 명확해집니다.
요약
CSV 예시를 일반 상품 이름 파일과 분리하고, 날짜마다 원본 입력을 별도 디렉터리에 보관한 뒤 파일 목록으로 배치 하나를 선택했습니다. 업로드나 파일 수만 믿는 대신 파일 이름과 내용을 모두 확인했습니다.
다음 도전 과제에서는 이미 연습한 파일 관리와 입력 선택 기술을 사용하여 새로 도착한 파일을 정리합니다.



