HDFS 파일 수명 주기 관리하기

빅 데이터Beginner
지금 연습하기

소개

소매업체에 상품 파일이 도착했습니다. 한 동료에게는 검토용 사본이, 다른 동료에게는 보관용 사본이 필요하며, 여러분은 검토한 파일을 내려받아 확인해야 합니다. 이 과정에서 실수로 원본을 덮어쓰거나 삭제하면 팀은 신뢰할 수 있는 입력을 잃습니다.

파일의 **수명 주기(lifecycle)**는 도착, 사용, 보관, 내보내기, 최종 삭제처럼 파일이 거치는 작업을 말합니다. HDFS에는 각 작업을 위한 연산이 있지만 그 효과는 서로 다릅니다. 업로드와 다운로드는 파일 시스템 사이에서 복사하고, HDFS 안에서의 복사와 이동은 HDFS 내부에서 이루어집니다.

원본, 보관, 임시 작업용 디렉터리를 나누고, 원본 파일을 보존하면서 보관 파일을 내보낸 뒤 일회용 사본만 삭제합니다. HDFS 경로와 업로드 및 읽기 명령은 이미 알고 있습니다. 이번에는 신중한 파일 관리 방법을 더합니다. 환경과 데이터는 이전 실습과 독립적입니다. 실습 내내 터미널을 사용하세요.

원본 입력 보존하기

이 단계에서는 원본 파일 전용 디렉터리에 소매업체의 입력을 업로드합니다.

원본(raw) 파일은 처음 형태 그대로 보관하는 입력입니다. 별도의 임시 작업(scratch) 디렉터리에는 임시 파일을 두고, 보관(archive) 디렉터리에는 계속 유지할 사본을 둡니다. 디렉터리 이름이 이런 규칙을 자동으로 강제하지는 않지만 작업 의도를 드러내 줍니다.

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

cd /home/labex/project

저장하기 전에 입력을 읽습니다.

cat /home/labex/project/data/products.txt

내용은 다음과 같습니다.

notebook pen notebook
folder pen
notebook folder

세 디렉터리 경로를 -mkdir -p에 전달합니다. HDFS는 지정한 각 디렉터리와 없는 상위 디렉터리를 만듭니다.

hdfs dfs -mkdir -p /user/labex/file-lifecycle/raw /user/labex/file-lifecycle/archive /user/labex/file-lifecycle/scratch

로컬 입력을 원본 디렉터리에 업로드합니다.

hdfs dfs -put /home/labex/project/data/products.txt /user/labex/file-lifecycle/raw/products.txt

업로드가 성공하면 대개 출력이 없습니다. 반복 실행하면 대상이 이미 있다는 오류가 저장된 파일을 실수로 덮어쓰지 않도록 보호합니다. 오류를 없애려고 파일을 삭제하는 대신 저장된 입력을 살펴보세요.

hdfs dfs -cat /user/labex/file-lifecycle/raw/products.txt

텍스트는 로컬 원본과 같아야 합니다. 로컬 파일 시스템에도 원본이 남습니다. -put은 로컬 원본을 이동하지 않고 복사하기 때문입니다. 이후에는 사본으로 작업하여 이 원본 입력을 그대로 유지합니다.

HDFS 안에서 복사하고 보관하기

이 단계에서는 검토용 사본을 만든 뒤 원본 입력을 이동하지 않고 그 사본을 보관 위치로 옮깁니다.

-cp 연산은 HDFS 원본을 HDFS 대상에 복사합니다. -put과 달리 아래의 두 경로는 모두 HDFS를 가리킵니다.

hdfs dfs -cp /user/labex/file-lifecycle/raw/products.txt /user/labex/file-lifecycle/scratch/review.txt

검토용 사본을 확인합니다.

hdfs dfs -cat /user/labex/file-lifecycle/scratch/review.txt

같은 상품 이름이 보여야 합니다. 이름이 달라도 데이터는 같으며, 새로운 판매 배치가 아닙니다.

검토용 사본을 보관할 준비가 되면 -mv로 옮깁니다. 이 파일 시스템 안에서 이동하면 경로가 바뀌며 원래 경로는 남지 않습니다. 실행 전에 어느 파일이 사라지고 어느 파일이 남을지 예상해 보세요.

hdfs dfs -mv /user/labex/file-lifecycle/scratch/review.txt /user/labex/file-lifecycle/archive/products-reviewed.txt

임시 작업 디렉터리와 보관 디렉터리를 함께 나열합니다. -ls는 여러 경로를 받을 수 있습니다.

hdfs dfs -ls /user/labex/file-lifecycle/scratch /user/labex/file-lifecycle/archive

보관 항목은 /archive/products-reviewed.txt로 끝나야 하며, 임시 작업 디렉터리에는 review.txt 항목이 없어야 합니다. 원본 파일이 영향을 받지 않았는지 확인합니다.

hdfs dfs -cat /user/labex/file-lifecycle/raw/products.txt

세 줄의 내용이 여전히 같아야 합니다. 이 단계를 마친 뒤 다시 돌아왔다면 복사와 이동을 반복하지 말고 기존 보관 파일을 확인하세요. -mv로 임시 작업 원본은 이미 이동했으며, 기존 보관 파일을 함부로 덮어써서는 안 됩니다.

파일 내보내기와 크기 측정하기

이 단계에서는 보관 파일을 내려받고 파일 수와 저장 공간 사용량을 확인합니다.

-get 연산은 HDFS 원본을 로컬 대상에 복사합니다. 아래에서 첫 번째 경로는 HDFS 경로이고 두 번째는 로컬 경로입니다.

hdfs dfs -get /user/labex/file-lifecycle/archive/products-reviewed.txt /home/labex/project/output/products-exported.txt

출력 없이 프롬프트가 돌아와야 합니다. 이미 다운로드를 완료했다면 로컬 대상을 살펴보세요. 기존 파일에 다시 다운로드하면 파일이 있다는 메시지가 나올 수 있습니다. 첫 실습에서처럼 로컬 diff로 내용을 확인합니다.

diff /home/labex/project/data/products.txt /home/labex/project/output/products-exported.txt

차이가 나타나지 않아야 합니다. 이것은 내보낸 사본입니다. HDFS 보관 파일과 로컬 원본은 모두 남아 있습니다.

디렉터리 내용을 측정하는 -count는 디렉터리 수, 파일 수, 바이트 단위 내용 크기, 경로를 출력합니다. 디렉터리 수에는 지정한 디렉터리 자체도 포함됩니다.

hdfs dfs -count /user/labex/file-lifecycle/raw /user/labex/file-lifecycle/archive

각 행은 파일 하나가 들어 있는 디렉터리 하나를 나타내야 합니다. 보관된 바이트와 원본 바이트가 같으므로 두 행의 내용 크기는 같아야 합니다. 실제 행을 저장합니다.

hdfs dfs -count /user/labex/file-lifecycle/raw /user/labex/file-lifecycle/archive > /home/labex/project/output/file-counts.txt

-du 연산은 파일 크기를 요약합니다. -h는 필요할 때 사람이 읽기 쉬운 단위를 사용합니다.

hdfs dfs -du -h /user/labex/file-lifecycle/raw

각 열은 내용 크기, 복제본을 포함해 사용하는 공간, 경로를 나타냅니다. 이 환경의 복제 계수는 1이므로 이 파일에서는 두 크기 열의 값이 같아야 합니다. 블록과 복제는 이후 실습에서 살펴봅니다. 다른 환경에서 두 번째 열이 더 크다고 해서 업무 기록이 더 많다는 뜻은 아닙니다.

계속하기 전에 경계를 스스로 설명해 보세요. -cp는 HDFS 내부에서 복사했고, -mv는 HDFS 경로를 바꾸었으며, -get은 로컬 사본을 만들었습니다.

일회용 사본만 삭제하기

이 단계에서는 삭제 정책을 확인하고 입력과 보관 파일을 유지하면서 용도를 알고 있는 임시 파일만 삭제합니다.

삭제는 성격이 다른 연산입니다. 파일이 더 이상 필요하지 않으면 그 경로를 제거할 수 있습니다. HDFS에는 휴지통(Trash) 보존 정책이 있을 수 있지만, HDFS를 사용한다는 이유만으로 복구가 보장되지는 않습니다. 먼저 분 단위로 설정된 휴지통 보존 시간을 읽습니다.

hdfs getconf -confKey fs.trash.interval

준비된 환경에서는 0을 사용하며, 이는 휴지통 보존이 비활성화되어 있다는 뜻입니다. 여기서는 삭제하면 즉시 제거된다고 생각하세요. 다른 환경에서 양수를 설정하면 보존 기간이 활성화되지만, 신뢰할 수 있는 입력을 따로 유지하는 일을 대신하지는 못합니다.

삭제 연습에만 사용할 사본을 만듭니다.

hdfs dfs -cp /user/labex/file-lifecycle/raw/products.txt /user/labex/file-lifecycle/scratch/disposable.txt

무엇이든 삭제하기 전에 정확한 대상을 나열합니다.

hdfs dfs -ls /user/labex/file-lifecycle/scratch/disposable.txt

경로가 raw/products.txt나 보관 파일이 아니라 scratch/disposable.txt로 끝나는지 확인하세요. -rm 연산은 지정한 파일을 삭제합니다. 재귀 삭제나 와일드카드는 필요하지 않습니다.

hdfs dfs -rm /user/labex/file-lifecycle/scratch/disposable.txt

명령은 지정한 파일이 삭제되었다고 알립니다. 반복하면 파일이 없다고 나옵니다. 이때는 삭제 대상을 넓히지 말고 현재 상태를 살펴봐야 합니다. 임시 작업 디렉터리를 나열하여 임시 파일이 남아 있지 않은지 확인합니다.

hdfs dfs -ls /user/labex/file-lifecycle/scratch

빈 디렉터리에는 파일 항목이 출력되지 않습니다. 마지막으로 반드시 남아 있어야 하는 두 파일을 확인합니다.

hdfs dfs -ls /user/labex/file-lifecycle/raw/products.txt /user/labex/file-lifecycle/archive/products-reviewed.txt

두 경로가 모두 표시되어야 합니다. 원본을 잃지 않고 업로드, 복사, 보관, 내보내기, 측정을 수행하고 임시 작업 파일만 삭제하는 수명 주기를 완료했습니다.

요약

원본 데이터를 그대로 유지하면서 검토용 사본을 만들고, 그 사본을 보관 위치로 이동한 뒤 로컬 파일 시스템으로 내보냈습니다. 파일 수와 저장 크기를 해석하고, 휴지통 설정을 확인했으며, 이름으로 지정한 일회용 파일만 삭제했습니다.

다음에는 여러 파일이 포함된 일일 배치에 이러한 습관을 적용합니다. 파일을 업로드하는 방법만큼이나 어떤 파일이 배치에 속하는지 아는 것도 중요합니다.