HDFS

HDFS的体系架构

NameNode:名称节点

  • 是HDFS的主节点、管理员
  • 接收客户端(命令行、java程序)的请求:创建目录、上传数据、下载数据、删除数据等
  • 管理和维护HDFS的日志和元信息

    日志文件(edits文件):记录的是客户端的所有操作,是一个二进制文件(JSON)

    位置:/root/training/hadoop/tmp/dfs/name/current
    edit_inprogress_00000000000000XXXXX:正在操作的日志文件
    hdfs oev -i edits_inprogress_00000000000000XXXXX -o ~/a.xml:通过日志查看器(edits viewer),把edits文件转换成文本(xml)格式
    元信息(fsimage文件):记录的是数据块的位置信息,数据块的冗余信息,是一个二进制文件
    位置:/root/training/hadoop/tmp/dfs/name/current
    fsimage_0000000000000XXXXX:元信息记录文件
    hdfs oiv -i fsimage_000000000000XXXXX -o ~/b.xml:将元信息记录文件转换成文本(xml或txt)格式

  • HDFS元信息保存位置配置
    1
    2
    3
    4
    5
    hdfs-site.xml:
    <property>
    <name>dfs.name.dir</name>
    <value>储存位置</value>
    </property>

DataNode:数据节点

  • 按照数据块保存数据

    1.X : 64M
    2.X : 128M

  • 数据块:表现形式就是一个文件(blk打头)

    位置:/root/training/hadoop-2.7.3/tmp/dfs/data/current/BP-XXX-数据节点-XXX/current/finalized/subdir0/subdir0/
    一个数据块对应的是一对文件,‘.meta’记录的是数据块的元信息
    设置数据块冗余度规则:一般跟数据节点个数相同,但最大不要超过3
    Hadoop 3.X之前,会造成存储空间极大的浪费
    Hadoop 3.X之后,采用HDFS纠删码技术,使得存储空间节约一半

  • HDFS文件系统的保存位置配置
    1
    2
    3
    4
    5
    hdfs-site.xml:
    <property>
    <name>dfs.data.dir</name>
    <value>储存位置</value>
    </property>

SecondaryNameNode:第二名称节点

  • 职责:进行日志信息的合并

    SecondaryNameNode向NameNode下载edits日志文件和fsimage元信息文件
    将edits中最新的信息写入fsimage文件
    将合并后的文件上传给NameNode
    当上次合并发生以后,用户进行新的操作,NameNode将产生新的edits_inprogress
    当HDFS发出检查点(checkpoint)的时候,会进行日志信息合并
    默认情况下,HDFS每隔60分钟或edits文件达到了64M产生一个检查点

  • 由于edits文件记录了最新的状态信息,并且随着操作越多,edits就会越大
  • 把edits中的最新信息写到fsimage中
  • edits文件就可以清空
  • 配置SecondaryNameNode节点位置
    1
    2
    3
    4
    5
    hdfs-site.xml:
    <property>
    <name>dis.namenode.secondary.http-address</name>
    <value>RedHat112:50090</value>
    </property>

HDFS基础命令

  • hdfs dfs -help :查看帮助
  • hdfs dfs -ls / :列出/目录下的文件和目录
  • hdfs dfs -put /本地路径 /上传路径 :上传文件
  • hdfs dfs -moveFromLocal /本地路径 /上传路径 :剪切上传文件
  • hdfs dfs -get /hdfs路径 /本地路径 :下载文件
  • hdfs dfs -getmerge /hdfs目录(是一个文件夹) /合并后的文件 :合并下载
  • hdfs dfs -mkdir /目录名 :创建目录
  • hdfs dfs -mkdir -p /目录名/目录名 :创建多级目录
  • hdfs dfs -mv /需要移动的目录(文件) /需要移动到的位置 :移动文件/文件夹
  • hdfs dfs -copy /需要复制的目录(文件) /需要复制到的位置 :复制文件/文件夹
  • hdfs dfs -rm /文件路径 :删除文件
  • hdfs dfs -rm -r /目录路径 :删除目录
  • hdfs dfs -cat /文件路径 :查看文件
  • hdfs dfs -tail -f /文件路径 :查看文件的最后指定行
  • hdfs dfs -count /目录路径(文件路径) :查看目录(文件)文件夹数,文件数、大小
  • hdfs dfs -df -h / :查看hdfs的总空间
  • hdfs dfs -setrep 冗余度 /文件路径 :设置单个文件冗余度

简单的HDFS上传文件代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package hdfs.demo1;

import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

public class HDFSClient {

public static void main(String[] args) throws IOException, InterruptedException, URISyntaxException {

//客户端加载配置文件
Configuration conf = new Configuration();

//指定配置(设置冗余度)
conf.set("dfs.replication","2");

//指定块大小
conf.set("dfs.blocksize", "64m");

//构造客户端
FileSystem fS = FileSystem.get(new URI("hdfs://192.168.0.102:9000/"),conf,"root");

//上传文件
fS.copyFromLocalFile(new Path("D:/123.txt"), new Path("/work.txt"));

//关闭资源
fS.close();
}
}

HDFS写数据流程

  • 请求N阿么N哦的上传文件123.txt(客户端——》NameNode)
  • 响应可以上传的文件(NameNode——》客户端)
  • 请求上传第一个Block(块文件)(0~120m),请求分会DataNode(客户端——》NameNode)
  • 返回DataNode1,DataNode2,DataNode3,表示采用这两个酒店储存具体的数据(NameNode——》客户端)
  • 请求建立一个Block传输通道(客户端——》DataNode1——》dataNode2——》dataNode3)
  • DataNode1,DataNode2,DataNode3应答成功(DataNode——》客户端)
  • 传输数据(客户端——》DataNode1——》dataNode2——》dataNode3)

HDFS读数据流程

  • 请求下载文件(客户端——》NameNode)
  • 返回目标文件的元数据(NameNode——》客户端)
  • 通过元信息请求第一块数据(客户端——》DataNode)
  • 传输数据给客户端(DtatNode——》客户端)
  • 继续通过元信息请求第二块数据。。。

NameNode与SecondaryNameNode工作机制

  • 启动集群,加载edits(编辑日志)与fsimage(镜像文件)
  • 元数据增删查改(客户端——》NameNode)
  • SecondaryNameNode请求是否需要CheckPoint(SecondaryNameNode——》NameNode)
  • SecondaryNameNode请求执行CheckPoint(SercondaryNameNode——》NameNode)
  • CheckPoint触发条件:1.通过定时;2.通过edits操作记录数量
  • CheckPoint触发时,SecondaryNameNode向NameNode拷贝edits文件并加载到内存(SercondaryNameNode——》NameNode)
  • 生成新的镜像文件fsimage.chkpoint
  • 将fsimage.chkpoint拷贝到NameNode(SercondaryNameNode——》NameNode)
  • NameNode将fsimage.chkpoint重命名为fsimage,再次发送到SecondaryNameNode当中(SercondaryNameNode——》NameNode)
  • NodeName与SencondaryNameNode将新的fsimage加载到内存中

HDFS重点

  • 一、工作机制
  • 二、读写流程
  • 三、客户端api
  • 四、集群部署安装