다크호스 프로그래머 - 빅데이터 입문부터 실전까지 - HDFS 분산저장

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 업로드 및 압축 해제

  1. Hadoop 설치 패키지를 node1 노드에 업로드합니다.
  2. /export/server/에 설치 패키지의 압축을 풉니다.
tar -zxvf hadoop-3.3.6.tar.gz -C /export/server/
  1. 소프트 링크 구축
cd /export/server
ln -s /export/server/hadoop-3.3.6 hadoop
  1. hadoop 설치 패키지를 입력하십시오.
cd hadoop

4.1.3 Hadoop 설치 패키지 디렉토리 구조

  • bin : 하둡의 각종 프로그램 저장

  • etc: Hadoop 구성 파일 저장

  • sbin: 관리자 프로그램

  • lib: Linux 시스템의 동적 링크 라이브러리(.so 파일) 저장

  • libexec: Hadoop 시스템을 구성하는 스크립트 파일(.sh 및 .cmd) 저장

4.1.4 구성 파일 수정

HDFS 클러스터를 구성하기 위해 주로 다음 파일을 수정합니다.

  1. 작업자 파일 구성
cd etc/hadoop  #进入配置文件目录
vim workers # 编辑workers文件
# 填入如下内容
node1
node2
node3
  1. 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
  1. 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 프로세스를 시작해야 함을 수정합니다.

  1. 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 데이터 디렉토리 준비

  1. node1 노드에서:
mkdir -p /data/nn
mkdir /data/dn
  1. node2, node3 노드에서:
mkdir -p /data/dn

4.1.6 Hadoop 폴더 배포

  1. 분포
# 在node1执行如下命令
cd /export/server
scp -r hadoop-3.3.6 node2:`pwd`/
scp -r hadoop-3.3.6 node3:`pwd`/
  1. node2에서 실행, hadoop용 소프트 링크 구성
# 在node2执行如下命令
ln -s /export/server/hadoop-3.3.6 /export/server/hadoop
  1. node3에서 실행, hadoop용 소프트 링크 구성
# 在node3执行如下命令
ln -s /export/server/hadoop-3.3.6 /export/server/hadoop

4.1.7 환경 변수 구성

  1. 정력 /etc/프로필
# 在/etc/profile文件底部追加如下内容
export HADOOP_HOME=/export/server/hadoop
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
  1. node2 및 node3에서 동일한 환경 변수 구성

4.1.8 전체 파일 시스템 포맷

  1. 형식 네임노드
# 确保以hadoop用户执行
su - hadoop
# 格式化namenode
hadoop namenode -format
  1. 시작하다
# 一键启动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 원클릭 시작 및 중지 스크립트

  1. 원클릭 시작 HDFS 클러스터
$HADOOP_HOME/sbin/start-dfs.sh

실행 원칙:

  • 이 스크립트를 실행하는 시스템에서 SecondaryNameNode를 시작합니다.
  • core-site.xml(fs.defaultFS 항목)의 내용을 읽고 NameNode가 있는 머신을 확인하고 NameNode를 시작합니다.
  • 작업자의 내용을 읽고 DataNode가 있는 기계를 확인하고 모든 DataNode를 시작합니다.
  1. HDFS 클러스터 원클릭 종료
$HADOOP_HOME/sbin/stop-dfs.sh

실행 원칙:

  • 이 스크립트를 실행하는 시스템에서 SecondaryNameNode를 종료합니다.
  • core-site.xml(fs.defaultFS 항목)의 내용을 읽고 NameNode가 있는 머신을 확인하고 NameNode를 종료합니다.
  • 작업자의 내용을 읽고 DataNode가 있는 머신을 확인하고 모든 NameNode를 종료합니다.

5.1.2 단일 프로세스 시작 및 중지

위치한 기계의 공정 시작과 정지를 개별적으로 제어

  1. $HADOOP_HOME/sbin/hadoop-daemon.sh
hadoop-daemon.sh (start|status|stop) (namenode|secondarynamenode|datanode)
  1. $HADOOP_HOME/bin/hdfs
hdfs --daemon (start|status|stop) (namenode|secondarynamenode|datanode)

5.2 파일 시스템 운영 명령어

  1. 폴더 생성
hadoop fs -mkdir [-p] <path>
hdfs dfs -mkdir [-p] <path>
  • -p: 경로를 따라 상위 디렉토리 생성
  1. 지정된 디렉토리의 내용 보기
hadoop fs -ls [-h] [-R] [<path> ....]
hdfs dfs -ls [-h] [-R] [<path> ....]
  • -h: 인간화 디스플레이 파일 크기
  • -R: 지정된 디렉터리 및 해당 하위 디렉터리를 재귀적으로 보기
  1. 지정된 HDFS 디렉터리에 파일 업로드
hadoop fs -put [-f] [-p] <localsrc> <dst>
hdfs dfs -put [-f] [-p] <localsrc> <dst>
  • -f: 대상 파일 덮어쓰기
  • -p: 액세스 및 수정 시간, 소유권 및 권한 유지
  • localsrc: 로컬 파일 시스템
  • dst: 대상 파일 시스템(HDFS)
  1. HDFS 파일 콘텐츠 보기
hadoop fs -cat <src> ....| more
hdfs dfs -cat <src> ....| more
  1. HDFS 파일 다운로드
hadoop fs -get [-f] [-p] <src>....<localdst>
hdfs dfs -get [-f] [-p] <src>....<localdst>
  • -f: 대상 파일 덮어쓰기
  • -p: 액세스 및 수정 시간 유지
  1. HDFS 파일 복사
hadoop fs -cp [-f] <src>....<dst>
hdfs dfs -cp [-f] <src>....<dst>
  • -f: 대상 파일 덮어쓰기
  1. HDFS 파일에 데이터 추가
hadoop fs -appendToFile <localsrc>....<dst>
hdfs dfs -appendToFile <localsrc>....<dst>
  1. HDFS 데이터 이동 작업
hadoop fs -mv <src>....<dst>
hdfs dfs -mv <src>....<dst>
  1. 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 데이터 쓰기 과정

1

  1. 클라이언트는 NameNode에 대한 요청을 시작합니다.
  2. NameNode는 권한과 남은 공간을 감사한 후 쓰기 허용 조건을 만족하고 클라이언트에게 쓸 DataNode 주소를 알려줍니다.
  3. 클라이언트는 데이터 패킷을 지정된 DataNode로 보냅니다.
  4. 데이터가 기록된 DataNode는 동시에 데이터 사본의 복제를 완료하고 수신한 데이터를 다른 DataNode에 배포합니다.
  5. 위와 같이 DataNode1은 DataNode2에 복제한 다음 DataNode2를 기반으로 DataNode3 및 DataNode4에 복제합니다.
  6. 쓰기가 완료되면 클라이언트는 네임노드에게 알리고 네임노드는 메타데이터 기록 작업을 한다.

6.4.2 데이터 읽기 과정

2

  1. 클라이언트는 NameNode에 적용하여 파일을 읽습니다.
  2. NameNode는 클라이언트의 권한 세부 사항을 판단한 후 읽기를 허용하고 이 파일의 차단 목록을 반환합니다.
  3. 클라이언트가 차단 목록을 얻은 후 DataNode를 찾아 스스로 읽을 수 있습니다.

추천

출처blog.csdn.net/m0_68111267/article/details/131734908