1. 분산 스토리지가 필요한 이유
① 데이터 양이 너무 많고 단일 시스템의 저장 용량에 상한이 있으며 양으로 문제를 해결해야 함 ② 양의 증가는
네트워크 전송, 디스크 읽기 및 쓰기, CPU, 메모리 등 분산 조합은 1+1>2의 효과를 얻을 수 있습니다.
2. 분산 인프라 분석
① 분산형 모드: 명확한 센터가 없고 모두가 작업을 조율합니다.
② 중앙화 모드: 명확한 센터가 있고 중앙 노드(Hadoop)를 기반으로 작업이 분산됩니다.
3. HDFS 인프라
- NameNode: 마스터 역할, HDFS 클러스터 관리 및 DataNode 역할
- DataNode: 데이터 저장을 담당하는 역할에서
- SecondaryNameNode: NameNode가 메타데이터를 구성하도록 돕는 보조 역할
4. HDFS 클러스터 환경 구축
4.1 VMware 가상 머신에 배포
4.1.1 클러스터 계획
Hadoop HDFS의 역할
- 네임노드
- 데이터노드
- SecondaryNameNode
노드 서비스
- node1:NameNode、DataNode、SecondaryNameNode
- 노드2:데이터노드
- node3:데이터노드
4.1.2 업로드 및 압축 해제
- Hadoop 설치 패키지를 node1 노드에 업로드합니다.
- /export/server/에 설치 패키지의 압축을 풉니다.
tar -zxvf hadoop-3.3.6.tar.gz -C /export/server/
- 소프트 링크 구축
cd /export/server
ln -s /export/server/hadoop-3.3.6 hadoop
- hadoop 설치 패키지를 입력하십시오.
cd hadoop
4.1.3 Hadoop 설치 패키지 디렉토리 구조
-
bin : 하둡의 각종 프로그램 저장
-
etc: Hadoop 구성 파일 저장
-
sbin: 관리자 프로그램
-
lib: Linux 시스템의 동적 링크 라이브러리(.so 파일) 저장
-
libexec: Hadoop 시스템을 구성하는 스크립트 파일(.sh 및 .cmd) 저장
4.1.4 구성 파일 수정
HDFS 클러스터를 구성하기 위해 주로 다음 파일을 수정합니다.
- 작업자 파일 구성
cd etc/hadoop #进入配置文件目录
vim workers # 编辑workers文件
# 填入如下内容
node1
node2
node3
- hadoop-env.sh 파일 구성
# 填入如下内容
export JAVA_HOME=/export/server/jdk
export HADOOP_HOME=/export/server/hadoop
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export HADOOP_LOG_DIR=$HADOOP_HOME/logs
- core-site.xml 파일 구성
# 在文件内部填入如下内容
<configuration>
<property>
<name>fs.defaultFS</name> # HDFS文件系统的网络通讯路径
<value>hdfs://node1:8020</value>
</property>
<property>
<name>io.file.buffer.size</name>
<value>131072</value> # io操作文件缓冲区大小
</property>
</configuration>
-
hdfs://node1:8020은 전체 HDFS의 내부 통신 주소이며 응용 프로토콜은 hdfs://(Hadoop 내장 프로토콜)입니다.
-
DataNode가 node1의 포트 8020과 통신하고 node1이 NameNode가 있는 시스템임을 나타냅니다.
-
이 구성은 node1이 NameNode 프로세스를 시작해야 함을 수정합니다.
- hdfs-site.xml 파일 구성
# 在文件内部填入如下内容
<configuration>
<property>
<name>dfs.datanode.data.dir.perm</name> # hdfs文件系统,默认创建的文件权限设置
<value>700</value>
</property>
<property>
<name>dfs.namenode.name.dir</name> # NameNode元数据的存储位置
<value>/data/nn</value>
</property>
<property>
<name>dfs.namenode.hosts</name> # NameNode允许哪几个节点的DataNode连接(即允许加入集群)
<value>node1,node2,node3</value>
</property>
<property>
<name>dfs.blocksize</name> # hdfs默认块大小
<value>268435456</value>
</property>
<property>
<name>dfs.namenode.handler.count</name> # namenode处理的并发线程数
<value>100</value>
</property>
<property>
<name>dfs.datanode.data.dir</name> # 从节点DataNode的数据存储目录
<value>/data/dn</value>
</property>
</configuration>
4.1.5 데이터 디렉토리 준비
- node1 노드에서:
mkdir -p /data/nn
mkdir /data/dn
- node2, node3 노드에서:
mkdir -p /data/dn
4.1.6 Hadoop 폴더 배포
- 분포
# 在node1执行如下命令
cd /export/server
scp -r hadoop-3.3.6 node2:`pwd`/
scp -r hadoop-3.3.6 node3:`pwd`/
- node2에서 실행, hadoop용 소프트 링크 구성
# 在node2执行如下命令
ln -s /export/server/hadoop-3.3.6 /export/server/hadoop
- node3에서 실행, hadoop용 소프트 링크 구성
# 在node3执行如下命令
ln -s /export/server/hadoop-3.3.6 /export/server/hadoop
4.1.7 환경 변수 구성
- 정력 /etc/프로필
# 在/etc/profile文件底部追加如下内容
export HADOOP_HOME=/export/server/hadoop
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
- node2 및 node3에서 동일한 환경 변수 구성
4.1.8 전체 파일 시스템 포맷
- 형식 네임노드
# 确保以hadoop用户执行
su - hadoop
# 格式化namenode
hadoop namenode -format
- 시작하다
# 一键启动hdfs集群
start-dfs.sh
# 一键关闭hdfs集群
stop-dfs.sh
# 如果遇到命令未找到的错误,表明环境变量未配置好,可以以绝对路径执行
/export/server/hadoop/sbin/start-dfs.sh
/export/server/hadoop/sbin/stop-dfs.sh
5. HDFS의 쉘 동작
5.1 프로세스 시작 및 중지 관리
5.1.1 원클릭 시작 및 중지 스크립트
- 원클릭 시작 HDFS 클러스터
$HADOOP_HOME/sbin/start-dfs.sh
실행 원칙:
- 이 스크립트를 실행하는 시스템에서 SecondaryNameNode를 시작합니다.
- core-site.xml(fs.defaultFS 항목)의 내용을 읽고 NameNode가 있는 머신을 확인하고 NameNode를 시작합니다.
- 작업자의 내용을 읽고 DataNode가 있는 기계를 확인하고 모든 DataNode를 시작합니다.
- HDFS 클러스터 원클릭 종료
$HADOOP_HOME/sbin/stop-dfs.sh
실행 원칙:
- 이 스크립트를 실행하는 시스템에서 SecondaryNameNode를 종료합니다.
- core-site.xml(fs.defaultFS 항목)의 내용을 읽고 NameNode가 있는 머신을 확인하고 NameNode를 종료합니다.
- 작업자의 내용을 읽고 DataNode가 있는 머신을 확인하고 모든 NameNode를 종료합니다.
5.1.2 단일 프로세스 시작 및 중지
위치한 기계의 공정 시작과 정지를 개별적으로 제어
- $HADOOP_HOME/sbin/hadoop-daemon.sh
hadoop-daemon.sh (start|status|stop) (namenode|secondarynamenode|datanode)
- $HADOOP_HOME/bin/hdfs
hdfs --daemon (start|status|stop) (namenode|secondarynamenode|datanode)
5.2 파일 시스템 운영 명령어
- 폴더 생성
hadoop fs -mkdir [-p] <path>
hdfs dfs -mkdir [-p] <path>
- -p: 경로를 따라 상위 디렉토리 생성
- 지정된 디렉토리의 내용 보기
hadoop fs -ls [-h] [-R] [<path> ....]
hdfs dfs -ls [-h] [-R] [<path> ....]
- -h: 인간화 디스플레이 파일 크기
- -R: 지정된 디렉터리 및 해당 하위 디렉터리를 재귀적으로 보기
- 지정된 HDFS 디렉터리에 파일 업로드
hadoop fs -put [-f] [-p] <localsrc> <dst>
hdfs dfs -put [-f] [-p] <localsrc> <dst>
- -f: 대상 파일 덮어쓰기
- -p: 액세스 및 수정 시간, 소유권 및 권한 유지
- localsrc: 로컬 파일 시스템
- dst: 대상 파일 시스템(HDFS)
- HDFS 파일 콘텐츠 보기
hadoop fs -cat <src> ....| more
hdfs dfs -cat <src> ....| more
- HDFS 파일 다운로드
hadoop fs -get [-f] [-p] <src>....<localdst>
hdfs dfs -get [-f] [-p] <src>....<localdst>
- -f: 대상 파일 덮어쓰기
- -p: 액세스 및 수정 시간 유지
- HDFS 파일 복사
hadoop fs -cp [-f] <src>....<dst>
hdfs dfs -cp [-f] <src>....<dst>
- -f: 대상 파일 덮어쓰기
- HDFS 파일에 데이터 추가
hadoop fs -appendToFile <localsrc>....<dst>
hdfs dfs -appendToFile <localsrc>....<dst>
- HDFS 데이터 이동 작업
hadoop fs -mv <src>....<dst>
hdfs dfs -mv <src>....<dst>
- HDFS 데이터 삭제 작업
hadoop fs -rm -f [-skipTrash] [URl..]
hdfs dfs -rm -f [-skipTrash] [URl..]
- -skipTrash는 휴지통을 건너뛰고 직접 삭제합니다.
5.3 HDFS 권한
약간
5.4 HDFS 클라이언트
약간
6. HDFS의 저장 원리
6.1 보관 원칙
약간
6.2 fsck 명령
6.2.1 HDFS 복제본 블록 수 구성
- hdfs-site.xml에서 구성:
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
- 또는
hadoop fs -D dfs.replication=2 -put test.txt /tmp/
6.2.2 fsck 명령은 파일의 복사본 수를 확인합니다.
hdfs fsck path [-files [-blocks [-locations]]]
6.2.3 블록 구성
<property>
<name>dfs.blocksize</name>
<value>268435456</value>
<description>设置HDFS块大小,单位是b</description>
</property>
6.3 네임노드 메타데이터
약간
6.4 HDFS 데이터 읽기 및 쓰기 프로세스
6.4.1 데이터 쓰기 과정
- 클라이언트는 NameNode에 대한 요청을 시작합니다.
- NameNode는 권한과 남은 공간을 감사한 후 쓰기 허용 조건을 만족하고 클라이언트에게 쓸 DataNode 주소를 알려줍니다.
- 클라이언트는 데이터 패킷을 지정된 DataNode로 보냅니다.
- 데이터가 기록된 DataNode는 동시에 데이터 사본의 복제를 완료하고 수신한 데이터를 다른 DataNode에 배포합니다.
- 위와 같이 DataNode1은 DataNode2에 복제한 다음 DataNode2를 기반으로 DataNode3 및 DataNode4에 복제합니다.
- 쓰기가 완료되면 클라이언트는 네임노드에게 알리고 네임노드는 메타데이터 기록 작업을 한다.
6.4.2 데이터 읽기 과정
- 클라이언트는 NameNode에 적용하여 파일을 읽습니다.
- NameNode는 클라이언트의 권한 세부 사항을 판단한 후 읽기를 허용하고 이 파일의 차단 목록을 반환합니다.
- 클라이언트가 차단 목록을 얻은 후 DataNode를 찾아 스스로 읽을 수 있습니다.