소개
이 랩에서는 Hadoop 의 주요 구성 요소 중 하나인 HDFS 에 대해 계속 이야기할 것입니다. 이 랩을 통해 HDFS 의 작동 원리 및 기본 작업, 그리고 Hadoop 소프트웨어 아키텍처에서 WebHDFS 에 접근하는 방법을 이해하는 데 도움이 될 것입니다.
이 랩에서는 Hadoop 의 주요 구성 요소 중 하나인 HDFS 에 대해 계속 이야기할 것입니다. 이 랩을 통해 HDFS 의 작동 원리 및 기본 작업, 그리고 Hadoop 소프트웨어 아키텍처에서 WebHDFS 에 접근하는 방법을 이해하는 데 도움이 될 것입니다.
이름에서 알 수 있듯이, HDFS (Hadoop Distributed File System) 는 Hadoop 프레임워크 내의 분산 저장소 구성 요소이며, 내결함성 (fault tolerant) 과 확장성을 갖습니다.
HDFS 는 Hadoop 클러스터의 일부로 사용되거나 독립 실행형 범용 분산 파일 시스템으로 사용될 수 있습니다. 예를 들어, HBase는 HDFS 를 기반으로 구축되었으며 Spark 역시 HDFS 를 데이터 소스 중 하나로 사용할 수 있습니다. HDFS 의 아키텍처와 기본 작업을 배우는 것은 특정 클러스터의 구성, 개선 및 진단에 큰 도움이 될 것입니다.
HDFS 는 Hadoop 애플리케이션에서 사용되는 분산 저장소이며, 데이터의 소스이자 대상입니다. HDFS 클러스터는 주로 *파일 시스템 메타데이터를 관리하는 **NameNodes***와 *실제 데이터를 저장하는 **DataNodes***로 구성됩니다. 아키텍처는 다음 그림에 나와 있으며, NameNodes, DataNodes, 그리고 Clients 간의 상호 작용 패턴을 보여줍니다.

이 그림은 Hadoop 공식 웹사이트에서 인용되었습니다.
HDFS 소개 요약:
HDFS 에 대한 이러한 핵심 사항을 이해하면 Hadoop 클러스터를 효과적으로 구성, 최적화 및 진단하는 데 도움이 됩니다.
개발 초기에 HDFS 는 매우 큰 파일을 대규모 클러스터에 노드 간, 고가용성 방식으로 저장하도록 설계되었습니다. 앞서 언급했듯이 HDFS 는 파일을 블록 단위로 저장합니다. 구체적으로, 각 파일을 블록 시퀀스로 저장합니다. 마지막 블록을 제외하고 파일의 모든 블록은 동일한 크기입니다.

이 그림은 Hadoop 공식 웹사이트에서 인용되었습니다.
HDFS 데이터 복제 및 고가용성:
다음은 추가 읽기 자료입니다.
작업 코드를 작성하기 전에 먼저 hadoop 사용자로 전환해야 합니다. 데스크톱에서 Xfce 터미널을 두 번 클릭하여 열고 다음 명령을 입력하십시오. hadoop 사용자의 비밀번호는 hadoop입니다. 사용자 전환 시 필요합니다.
su - hadoop
labex:~/ $ su - hadoop
hadoop:~$
팁: hadoop 사용자의 비밀번호는 hadoop입니다.
HDFS 를 처음 사용하기 전에 NameNode 를 초기화해야 합니다. 이 작업은 디스크를 포맷하는 것과 비교할 수 있으므로 HDFS 에 데이터를 저장할 때는 이 명령을 주의해서 사용하십시오.
그렇지 않으면 이 섹션에서 실험을 다시 시작하십시오. "기본 환경"을 사용하고 다음 명령으로 HDFS 를 초기화하십시오.
/home/hadoop/hadoop/bin/hdfs namenode -format
팁: 위의 명령은 HDFS 파일 시스템을 포맷합니다. 명령을 실행하기 전에 HDFS 데이터 디렉토리를 삭제해야 합니다.
따라서 Hadoop 관련 서비스를 중지하고 Hadoop 데이터를 삭제해야 합니다.
stop-all.sh
rm -rf ~/hadoopdata
다음 메시지가 표시되면 초기화가 완료된 것입니다.
2024-03-01 11:16:10,439 INFO common.Storage: Storage directory /home/hadoop/hadoopdata/hdfs/namenode has been successfully formatted.
HDFS 는 로컬 디스크를 기반으로 구축된 계층화된 분산 저장 시스템이므로 HDFS 를 사용하기 전에 데이터를 가져와야 합니다.
일부 파일을 준비하는 첫 번째이자 가장 편리한 방법은 Hadoop 의 구성 파일을 예시로 사용하는 것입니다.
먼저 HDFS 데몬을 시작해야 합니다.
/home/hadoop/hadoop/sbin/start-dfs.sh
서비스 보기:
hadoop:~$ jps
8341 SecondaryNameNode
7962 NameNode
8474 Jps
8107 DataNode
터미널에 다음 명령을 입력하여 디렉토리를 생성하고 데이터를 복사합니다.
cd /home/hadoop
mkdir sample_data
cp -r /home/hadoop/hadoop/etc/hadoop/* sample_data/
디렉토리 내용 나열:
hadoop:~$ ls /home/hadoop/sample_data/
capacity-scheduler.xml kms-log4j.properties
configuration.xsl kms-site.xml
...
HDFS에 대한 모든 작업은 hdfs dfs로 시작하며 해당 작업 매개변수로 보완됩니다. 가장 일반적으로 사용되는 매개변수는 put이며 다음과 같이 사용되며 터미널에 입력할 수 있습니다.
/home/hadoop/hadoop/bin/hdfs dfs -put /home/hadoop/sample_data/hadoop-policy.xml /policy.xml
디렉토리 내용 나열:
hadoop:~$ hdfs dfs -ls /policy.xml
-rw-r--r-- 1 hadoop supergroup 11765 2024-03-01 11:37 /policy.xml
명령의 마지막 /policy.xml은 HDFS 에 저장된 파일 이름이 policy.xml이고 경로는 / (루트 디렉토리) 임을 의미합니다. 이전 파일 이름을 계속 사용하려면 경로 /를 직접 지정할 수 있습니다.
여러 파일을 업로드해야 하는 경우 로컬 디렉토리의 파일 경로를 연속적으로 지정하고 HDFS 대상 저장 경로로 끝낼 수 있습니다.
/home/hadoop/hadoop/bin/hdfs dfs -mkdir -p /user/hadoop
/home/hadoop/hadoop/bin/hdfs dfs -put /home/hadoop/sample_data/httpfs-env.sh /home/hadoop/sample_data/mapred-env.sh /user/hadoop
디렉토리 내용 나열:
hadoop:~$ hdfs dfs -ls /user/hadoop
Found 2 items
-rw-r--r-- 1 hadoop supergroup 1484 2024-03-01 11:42 /user/hadoop/httpfs-env.sh
-rw-r--r-- 1 hadoop supergroup 1764 2024-03-01 11:42 /user/hadoop/mapred-env.sh
경로 관련 매개변수를 지정하는 규칙은 Linux 시스템의 규칙과 동일합니다. 와일드카드 (예: *.sh) 를 사용하여 작업을 단순화할 수 있습니다.
마찬가지로 -ls 매개변수를 사용하여 지정된 디렉토리의 파일을 나열할 수 있습니다.
/home/hadoop/hadoop/bin/hdfs dfs -ls /user/hadoop
여기에 나열된 파일은 실험 환경에 따라 다를 수 있습니다.
파일의 내용을 보려면 cat 매개변수를 사용할 수 있습니다. 가장 쉽게 생각할 수 있는 것은 HDFS 에서 파일 경로를 직접 지정하는 것입니다. 로컬 디렉토리를 HDFS 상의 파일과 비교해야 하는 경우 해당 경로를 별도로 지정할 수 있습니다. 그러나 로컬 디렉토리는 file:// 표시자로 시작해야 하며 파일 경로 (예: /home/hadoop/.bashrc, 앞에 /를 잊지 마세요) 로 보완해야 합니다. 그렇지 않으면 여기에 지정된 모든 경로는 기본적으로 HDFS 의 경로로 인식됩니다.
/home/hadoop/hadoop/bin/hdfs dfs -cat file:///home/hadoop/.bashrc /user/hadoop/mapred-env.sh
출력은 다음과 같습니다.
hadoop:~$ hdfs dfs -cat file:///home/hadoop/.bashrc /user/hadoop/mapred-env.sh
## ~/.bashrc: executed by bash(1) for non-login shells.
## see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
## for examples
## If not running interactively, don't do anything
case $- in
...
파일을 다른 경로로 복사해야 하는 경우 cp 매개변수를 사용할 수 있습니다.
/home/hadoop/hadoop/bin/hdfs dfs -cp /user/hadoop/mapred-env.sh /user/hadoop/copied_file.txt
마찬가지로 파일을 이동해야 하는 경우 mv 매개변수를 사용합니다. 이것은 기본적으로 Linux 파일 시스템 명령 형식과 동일합니다.
/home/hadoop/hadoop/bin/hdfs dfs -mv /user/hadoop/mapred-env.sh /moved_file.txt
lsr 매개변수를 사용하여 하위 디렉토리의 내용을 포함하여 현재 디렉토리의 내용을 나열합니다. 출력은 다음과 같습니다.
hdfs dfs -lsr /
HDFS 의 파일에 새로운 내용을 추가하려면 appendToFile 매개변수를 사용할 수 있습니다. 또한 추가할 로컬 파일 경로를 지정할 때 여러 개를 지정할 수 있습니다. 마지막 매개변수는 추가할 객체가 됩니다. 파일은 HDFS 에 존재해야 하며, 그렇지 않으면 오류가 보고됩니다.
echo 1 >> a.txt
echo 2 >> b.txt
/home/hadoop/hadoop/bin/hdfs dfs -appendToFile a.txt b.txt /user/hadoop/mapred-env.sh
tail 매개변수를 사용하여 파일 꼬리 (파일의 끝 부분) 의 내용을 확인하여 추가가 성공했는지 확인할 수 있습니다.
/home/hadoop/hadoop/bin/hdfs dfs -tail /user/hadoop/mapred-env.sh
tail 명령의 출력을 봅니다.
hadoop:~$ echo 1 >> a.txt
echo 2 >> b.txt
hdfs dfs -appendToFile a.txt b.txt /user/hadoop/mapred-env.sh
hadoop:~$ hdfs dfs -tail /user/hadoop/mapred-env.sh
1
2
파일 또는 디렉토리를 삭제해야 하는 경우 rm 매개변수를 사용합니다. 이 매개변수는 Linux 파일 시스템 명령 rm과 동일한 의미를 갖는 -r 및 -f와 함께 사용할 수도 있습니다.
/home/hadoop/hadoop/bin/hdfs dfs -rm /moved_file.txt
moved_file.txt 파일의 내용이 삭제되고 명령은 'Deleted /moved_file.txt' 출력을 반환합니다.
이전 내용에서 HDFS 에서 디렉토리를 생성하는 방법을 배웠습니다. 실제로 여러 디렉토리를 한 번에 생성해야 하는 경우 여러 디렉토리의 경로를 매개변수로 직접 지정할 수 있습니다. -p 매개변수는 상위 디렉토리가 존재하지 않는 경우 자동으로 생성됨을 나타냅니다.
/home/hadoop/hadoop/bin/hdfs dfs -mkdir -p /user/hadoop/dir1 /user/hadoop/dir2/sub_dir1
특정 파일 또는 디렉토리가 얼마나 많은 공간을 차지하는지 확인하려면 du 매개변수를 사용할 수 있습니다.
/home/hadoop/hadoop/bin/hdfs dfs -du /user/hadoop/
출력은 다음과 같습니다.
hadoop:~$ hdfs dfs -du /user/hadoop/
1764 1764 /user/hadoop/copied_file.txt
0 0 /user/hadoop/dir1
0 0 /user/hadoop/dir2
1484 1484 /user/hadoop/httpfs-env.sh
4 4 /user/hadoop/mapred-env.sh
이전 섹션에서는 주로 HDFS 의 파일 및 디렉토리 작업을 소개했습니다. MapReduce 와 같은 애플리케이션이 계산되고 결과가 기록된 파일이 생성되면 get 매개변수를 사용하여 Linux 시스템의 로컬 디렉토리로 내보낼 수 있습니다.
여기서 첫 번째 경로 매개변수는 HDFS 의 경로를 나타내고 마지막 경로는 로컬 디렉토리에 저장된 경로를 나타냅니다.
/home/hadoop/hadoop/bin/hdfs dfs -get /user/hadoop/mapred-env.sh /home/hadoop/exported_file.txt
내보내기가 성공하면 로컬 디렉토리에서 파일을 찾을 수 있습니다.
cd ~
ls
출력은 다음과 같습니다.
a.txt b.txt exported_file.txt hadoop hadoopdata sample_data
각 NameNode 또는 DataNode 는 클러스터의 현재 상태와 같은 기본 정보를 표시하는 웹 서버를 내부적으로 실행합니다. 기본 구성에서 NameNode 의 홈 페이지는 http://localhost:9870/입니다. DataNode 및 클러스터에 대한 기본 통계를 나열합니다.
웹 브라우저를 열고 주소 표시줄에 다음을 입력합니다.
http://localhost:9870/
Summary에서 현재 "클러스터"의 활성 DataNode 노드 수를 확인할 수 있습니다.
웹 인터페이스는 HDFS 내부의 디렉토리 및 파일을 탐색하는 데에도 사용할 수 있습니다. 상단 메뉴 모음에서 "Utilities" 아래의 "Browse the file system" 링크를 클릭합니다.

이제 WebHDFS 의 몇 가지 기본 작업에 대한 소개를 마쳤습니다. 더 많은 지침은 WebHDFS 설명서에서 찾을 수 있습니다. 이 랩은 종료되었습니다. 습관적으로 Hadoop 클러스터를 종료해야 합니다.
/home/hadoop/hadoop/sbin/stop-yarn.sh
/home/hadoop/hadoop/sbin/stop-dfs.sh
hadoop:~$ jps
11633 Jps
이 랩에서는 HDFS 의 아키텍처를 소개했습니다. 또한, 명령줄에서 기본적인 HDFS 작업 명령을 배우고 HDFS 웹 접근 패턴으로 전환하여 HDFS 가 외부 애플리케이션을 위한 실제 스토리지 서비스로 작동하도록 했습니다.
이 랩에서는 WebHDFS 에서 파일을 삭제하는 시나리오는 나열하지 않았습니다. 직접 문서를 확인하실 수 있습니다. 더 많은 기능은 공식 문서에 숨겨져 있으므로 문서를 읽는 데 관심을 가지십시오.
다음은 추가 읽기 자료입니다.