【大数据】HDFS

发布时间 2023-10-06 10:59:05作者: PythonNew_Mr.Wang

HDFS原理



基本介绍


1:HDFS全称:Hadoop Distributed File System

2:Hadoop三大组件( HDFS、MapReduce、YARN)之一

3:可在多台服务器上构建集群,提供分布式数据存储能力

4:NameNode:主角色,管理HDFS集群和DataNode角色

5:DataNode:从角色,负责数据的存储

6:SecondaryNameNode:辅助角色,协助NameNode整理元数据	



储存原理


1:分布式储存:HDFS将大文件(通常是GB或TB级别)分成多个数据块,并将这些数据块分布在Hadoop集群的不同节点上。

2:冗余备份:HDFS通过在多个节点上保存数据块的多个副本来提供容错能力。

3:数据局部性:HDFS通过将计算任务分配给存储着数据块副本的节点来提高数据访问性能。

4:命名空间和元数据:HDFS使用一个中心化的命名空间和元数据存储来管理文件和目录。

5:数据可靠性:HDFS通过周期性地校验数据块的完整性和一致性来确保数据的可靠性。



权限控制


1:用户和组:HDFS使用Unix样式的用户和组来管理访问权限。每个文件和目录都有一个所有者和一个所属组,可以分别设置权限。

2:权限模式:HDFS使用三种权限模式来控制对文件和目录的访问:读取(r)、写入(w)和执行(x)。权限可被设置为所有者、所属组和其他用户。

3:访问控制列表(ACL):HDFS还支持访问控制列表(ACL),允许对文件和目录的权限进行更详细的控制。ACL可以为特定用户或组设置特定的权限。

4:超级用户:HDFS有一个超级用户(类似于Unix的root用户),拥有对所有文件和目录的完全访问权限。哪个用户登录就是哪个,hadoop这个用户。

5:NameNode权限:HDFS的权限控制是由NameNode负责的,NameNode存储了文件系统的元数据和权限信息。



基本操作


    hdfs dfs -put <本地文件路径> <HDFS目标路径>        # 文件上传 - 基础命令与LInux差不多

    hdfs dfs -ls:列出HDFS上指定目录下的文件和子目录。  # 基础命令与LInux差不多 - 基础命令与LInux差不多

    hdfs fsck <路径> [-files [-blocks [-locations | -racks]]] # 检查HDFS中文件和目录的完整性



NameNode元数据管理维护(NameNode基于edits和FSImage的配合,完成整个文件系统文件的管理)


1:每次对HDFS的操作,均被edits文件记录

    2:edits达到大小上线后,开启新的edits记录

    3:定期进行edits的合并操作:

    3-1:如当前没有fsimage文件,将全部edits合并为第一个fsimage

    3-2:如当前已存在fsimage文件,将全部edits和已存在的fsimage进行合并,形成新的fsimage

    
    演示:
    [hadoop@test1 nn]$ cd current/
    [hadoop@test1 current]$ ll
    total 2100
    -rw-rw-r-- 1 hadoop hadoop 1048576 Oct  3 00:25 edits_0000000000000000001-0000000000000000001
    -rw-rw-r-- 1 hadoop hadoop     115 Oct  5 10:44 edits_0000000000000000002-0000000000000000004
    -rw-rw-r-- 1 hadoop hadoop      42 Oct  5 11:44 edits_0000000000000000005-0000000000000000006
    -rw-rw-r-- 1 hadoop hadoop      42 Oct  5 12:44 edits_0000000000000000007-0000000000000000008
    -rw-rw-r-- 1 hadoop hadoop      42 Oct  5 13:44 edits_0000000000000000009-0000000000000000010



HDFS数据的读写流程


数据写入流程:

        1:客户端向NameNode发起请求

        2:NameNode审核权限、剩余空间后,满足条件允许写入,并告知客户端写入的DataNode地址

        3:客户端向就近的一个DataNode发送数据包

        4:被写入数据的DataNode同时完成数据副本的复制工作,将其接收的数据分发给其它DataNode

        5:DataNode1复制给DataNode2,然后基于DataNode2复制给Datanode3和DataNode4

        6:写入完成客户端通知NameNode,NameNode做元数据记录工作,并向客户端响应

	注意:
	    1:NameNode不负责数据写入,只负责元数据记录和权限审批
	    2:客户端直接向1台DataNode写数据,这个DataNode一般是离客户端最近(网络距离)的那一个
        3:数据块副本的复制工作,由DataNode之间自行完成(构建一个PipLine,按顺序复制分发)

 数据读取流程:

        1:客户端向NameNode申请读取某文件

        2:NameNode判断客户端权限等细节后,允许读取,并返回此文件的block列表

        3:客户端拿到block列表后自行寻找DataNode读取即可

	注意:
	    1:数据同样不通过NameNode提供
	    2:NameNode提供的block列表,会基于网络距离计算尽量提供离客户端最近的,这是因为1个block有3份,会尽量找离客户端最近的那一份让其读取



HDFS配置



HDFS的4个文件配置


(1): 配置workers文件

[root@test1 hadoop]# cd hadoop/etc/hadoop/ 
[root@test1 hadoop]# vim workers 

test1
test2
test3  

...多少台就配置多少


(2): 配置hadoop-env.sh文件

[root@test1 hadoop]# vim hadoop-env.sh

export JAVA_HOME=/export/server/jdk        		   # 配置了 Java 的安装目录
export HADOOP_HOME=/export/server/hadoop   		   # 配置了 Hadoop 的安装目录
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop             # 配置了 Hadoop 的配置文件所在目录。
export HADOOP_LOG_DIR=$HADOOP_HOME/logs                    # 配置了 Hadoop 日志文件的存放目录。



(3): 配置core-site.xml文件 

[root@test1 hadoop]# vim core-site.xml 

<configuration>
  <property>
    <name>fs.defaultFS</name>
    <value>hdfs://test1:8020</value>      # test1的主机上的HDFS服务端口为8020的地址
  </property>
  <property>
    <name>io.file.buffer.size</name>
    <value>131072</value>                 # 控制文件读写缓冲大小的配置项
  </property>
</configuration>


# (4): 配置hdfs-site.xml文件  

[root@test1 hadoop]# vim hdfs-site.xml

<configuration>
  <property>
    <name>dfs.datanode.data.dir.perm</name>
    <value>700</value>                       # 权限设置为700
  </property>
  <property>
    <name>dfs.namenode.name.dir</name>
    <value>/data/nn</value>                  # NameNode的数据文件夹
  </property>
  <property>
    <name>dfs.namenode.hosts</name>
    <value>test1,test2,test3</value>         # NameNode主机配置
  </property>
  <property>
    <name>dfs.blocksize</name>
    <value>268435456</value>                # 一个分卷的大小
  </property>
  <property>
    <name>dfs.namenode.handler.count</name>
    <value>100</value>                      #  最大连接数
  </property>
  <property>
    <name>dfs.datanode.data.dir</name>
    <value>/data/dn</value>                 # DataNode的数据文件夹
  </property>
</configuration>



将配置完的4个文件分发给其他节点


[root@test1 server]# scp -r /export/server/hadoop-3.3.4 test2:/export/server/

[root@test1 server]# scp -r /export/server/hadoop-3.3.4 test3:/export/server/

...



创建数据存储的文件夹


# NameNode主机添加 /data/dn /data/nn 
# DataNode主机创建 /data/dn

[root@test1 hadoop]# mkdir -p /data/nn       # test1
[root@test1 hadoop]# mkdir -p /data/dn       # test1

[root@test2 hadoop]# mkdir -p /data/dn       # test2
[root@test3 hadoop]# mkdir -p /data/dn       # test3
...