HDFS文件系统

0 大数据

0.1 大数据特点

  1. 体量大 Volume
    MySQL 20G 上限
    数据体量达到TB和PB级别,或日增长数据量在GB级别。
    例如大型电商网站、金融行业的日志数据、订单数据。
  2. 多样性 Variety
    结构化:二维表
    半结构化:JSON XML
    非结构化:文本文件、图片、音频、视频、地理位置
  3. 快速 Velocity
    处理数据速度快,时效性要求高。
    1小时 1天
  4. 价值密度低 Value
    数据中存在大量无关紧要的数据,不同的业务需求,需要的业务数据又不一样,需要从海量数据中清洗除需要的关键性指

0.2 大数据起源

2005年google公开大数据的三个技术论文,并作出了相应的软件产品(不开源)

  1. GFS google file system 文件存储系统
  2. MapReduce 数据计算
  3. Big Table (no sql)

1 HDFS

1.1 简介

HDFS(Hadoop分布式文件系统)
全称:Hadoop Distributed File System 
说明:HDFS技术属于Hadoop内的一个子技术。
作用:解决海量数据存储问题---分布式文件系统(多台计算机存储),突破单体服务器的存储能力。

在这里插入图片描述

1.2 HDFS架构体系

1.2.0 HDFS架构图

在这里插入图片描述

1.2.1 HDFS核心进程

# NameNode
补充: 一个HDFS集群的主节点, 一个集群只有1个.
1. 基于内存存储管理文件的元数据信息。(NameNode内存要求高。)
   文件名    类型 大小   权限       用户 组 
   顾超.avi  文件 500MB rwxrwxrwx root root
2. 是HDFS集群的管理者master:管理集群中所有的datanode。
   datanode12 ip地址 磁盘容量 磁盘使用情况
   datanode13 ip地址 磁盘容量 磁盘使用情况
   目的:掌握datanode健康状况,了解磁盘容量,数据分布的负载均衡。
      均衡使用datanode的磁盘空间。
      集合多个datanode服务器的网络带宽,提高数据传输速度。
3. 接受客户端文件操作的请求(文件元数据操作请求)。
4. NameNode存储了文件拆分后的block分布信息:
   block0--[ip1,ip2]--起始位置--大小--checksum
   block1--所在dn的ip--起始位置--大小--checksum
# DataNode
补充: HDFS集群的从节点, 一个集群有多个.
1. 管理存储数据文件切分后的block(128MB),存放硬盘上。廉价机器。
2. 是HDFS的从机,slave
    heartBeat: 定期向namenode发送心跳(3s),告知datanode(ip 磁盘容量),如果超过10分钟,无心跳,则认为DataNode死亡。
    blockreport: 定期上报datanode中的存储的block的信息:
      db1,发送 dn1上存储的所有文件的block的信息,如果NameNode没有收到的block信息,则判断该block在该dn上失效。
3. 接收数据datablock上传下载的客户端请求。

1.2.2 HDFS核心概念

# block: 文件切分后的数据块。
     HDFS中的文件在物理上是分块存储(Block),块的大小可以通过配置参数( dfs.blocksize)来规定
     默认大小在Hadoop2.x版本中是128M,老版本中是64M。
     原因:
         1. HDFS中平均寻址时间大概为10ms;
         2. 大量测试发现,寻址时间为传输时间的1%时,为最佳状态;
         	最佳传输时间为10ms/0.01=1000ms=1s
         3. 磁盘的传输速率普遍为100MB/s;
         	计算出最佳block大小:100MB/s x 1s = 100MB,所以设定block大小为128MB。
     block过大:
     	导致单个block通过磁盘和网络读取读取时间过长,影响该部分数据的处理速度,
     	并且增加单个block传输的失败几率,重试成本过高,浪费IO资源。
     block过小:
     	block个数过多,导致namenode内存过度占用,导致不足。
     结论:HDFS块的大小设置主要取决于磁盘传输速率
         100MB/s的带宽,block设置为128MB
         220MB/s的带宽,block设置为256MB
     
# replication:副本(副本因子)
     每个block在hdfs的datanode会存储多份。默认replication=3,每个block有3分。
     原因:防止datanode因为单点故障,导致数据丢失。
     实战参数:一般block的replication就是3个。
     
# checksum:校验和
    datanode定期,计算本节点存储的block的checksum,判断是否和之前的checksum保持一致。
    说明:datanode掌握block文件是否损坏的判断手段。

2 HDFS伪分布式

Hadoop下载地址:点我

2.1 集群规划

在这里插入图片描述

2.2 服务器准备

# 准备虚拟机-虚拟物理修改ip
# 1. 设置hostname
    hostnamectl set-hostname hadoop10
# 2. 配置hosts(linux+windows)
    vim /etc/hosts
    ----------以下是文件信息------------
    192.168.199.8 hadoop10
    补充:一定要配置windows对集群中所有节点的映射关系。
# 3. 关闭防火墙
    systemctl stop firewalld #关闭防火墙
    systemctl disable firewalld # 禁止防火墙开机启动。
# 4. 安装jdk1.8
    [root@hadoop10 modules]# tar zxvf jdk-8u171-linux-x64.tar.gz  -C  /opt/installs/
    #起别名
    [root@hadoop10 installs]# mv jdk1.8.0_171/ jdk1.8
# 5. 配置jdk环境变量。
     [root@hadoop10 installs]# vi /etc/profile
     # JAVA
     # JAVA_HOME
     export JAVA_HOME=/opt/installs/jdk1.8/
     # PATH
     export PATH=$PATH:/opt/installs/jdk1.8/bin/
     # CLASSPATH
     export classpath=.
     #加载刷新配置
     source /etc/profile
     #验证 
     java 

2.3 安装

  • ①安装HDFS(Hadoop中包含HDFS)
    # 将hadoop-2.9.2.tar.gz上传到modeules目录,解压
      [root@hadoop10 modules]# tar zxvf hadoop-2.9.2.tar.gz  -C /opt/install/
    # 配置环境变量
      vim /etc/profile
      -------------以下是环境变量-------------
      # 配置HADOOP_HOME
      export HADOOP_HOME=/opt/installs/hadoop2.9.2
      # 配置PATH
      export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
    # 生效配置信息(重新执行profile中的指令,加载配置信息)
      source /etc/profile
    
    # hadoop目录结构
    [root@CentOS ~]# tree -L 1 /usr/hadoop-2.9.2/
    /usr/hadoop-2.9.2/
    ├── bin # hadoop客户端操作相关的脚本程序,hdfs、hadoop、yarn
    ├── etc # 配置目录xml、文本文件
    ├── include # 一些C的头文件,无需关注
    ├── lib # 第三方native实现C实现
    ├── libexec # hadoop运行时候,加载配置的脚本
    ├── LICENSE.txt
    ├── logs # 系统运行日志目录,排查故障!
    ├── NOTICE.txt
    ├── README.txt
    ├── sbin # hadoop服务器端操作相关脚本,通常用于启动服务例如:start|top-dfs.sh
    └── share # hadoop运行的依赖jars、内嵌webapp 
    
  • ②初始化配置文件
    #配置文件路径:/opt/installs/hadoop-2.9.2/etc/hadoop/
    hadoop-env.sh 	— hadoop环境配置(jdk)
    core-site.xml	— Hadoop核心配置文件
    hdfs-site.xml	— HDFS的个性化配置文件 副本因子
    slaves			— 在哪个节点启动datanode
    
    # hadoop-env.sh
        # jdk安装目录
        JAVA_HOME=/opt/installs/jdk1.8
    
    # core-site.xml(配置文件中尽量没有中文,包括注释)
      # 配置hdfs入口地址
      <property>
        <name>fs.defaultFS</name>
        <value>hdfs://hadoop10:9000</value>
      </property>
      # 配置数据保存位置(需要在hadoop的根目录下新建data目录)
      <property>
        <name>hadoop.tmp.dir</name>
        <value>/opt/installs/hadoop-2.9.2/data</value>
      </property>
    
    # hdfs-site.xml
      # 配置副本个数
      <property>
        <name>dfs.replication</name>
        <value>1</value>
      </property>
    
    # slaves (建议使用vi编辑)
        # 配置从机datanode的ip
          hadoop10
    
  • ③格式化HDFS(第一次安装HDFS格式化文件系统)
    格式化HDFS集群的数据目录初始化信息。
    # 一旦hadoop配置启动失败,清空data下的文件,再重新格式化。
        #初始化namenode和datanode存放数据的目录
        hdfs namenode -format
    
  • ④启动HDFS
    # 启动hdfs
      start-dfs.sh
    # 关闭hdfs
      stop-dfs.sh
    
  • ⑤验证
    # 查看hdfs进程
    [root@hadoop10 install]# jps
    2225 NameNode  # master namenode主机
    4245 Jps
    2509 SecondaryNameNode 
    2350 DataNode  # slave datanode从机
    
    # 查看hdfsWeb服务
    1. 查看namenode的web服务
    http://hadoop10:50070
      
    2. 查看datanode的Web服务
    http://hadoop10:50075
    

2.4 搭建知识

2.4.1 日志查看

  • 日志位置:/opt/installs/hadoop-2.9.2/logs/
    在这里插入图片描述
# namenode启动运行日志
  hadoop-用户名-namenode-主机名.log
  
# datanode启动日志
  hadoop-用户名-datanode-主机名.log

2.4.2 HDFS(配置修正)

# 1. 关闭启动的hdfs程序(NN DN)
# 2. 修改错误的配置文件。
# 3. data目录清空,重新格式化
    hdfs namenode -format
场景: 格式化或者启动hadoop失败。
    说明:hadoop/data文件夹
    作用:保存datanode和namenode持久化的数据。
    时机:
        1. 格式化hdfs namenode -format会初始化该目录下的文件。
        2. hdfs运行期间产生的数据,会操作该目录中的数据。
	必要操作:删除格式化或者启动数据保存的文件目录。

2.4.3 Web界面

  • NameNode的web管理器地址:http://ip:50070
  • 查看管理的datanode的信息
    在这里插入图片描述
  • 管理文件block的元数据。
    在这里插入图片描述
    在这里插入图片描述

2.5 常用端口

  • dfs.namenode.http-address:50070
  • dfs.datanode.http-address:50075
  • SecondaryNameNode:50090
  • dfs.datanode.address:50010
  • fs.defaultFS:8020 或者9000
  • yarn.resourcemanager.webapp.address:8088
  • 历史服务器web访问端口:19888

3 HDFS客户端

  • 上传文件、下载文件、修改文件名、删除文件、(HDFS中的文件内容一定不会修改)

3.1 HDFS命令

# 1. 命令所在目录
	${hadoop}/bin之下/hdfs

# 2. HDFS的文件系统结构
	和Linux类似。 

# 3. 命令格式
	hdfs dfs -xxx -参数 

3.2 常见命令

  1. 查看文件元数据信息
    hdfs dfs -ls [-R] hdfs文件路径
    hdfs dfs -ls /
    
  2. 新建文件夹
    #如果父目录不存在则添加-p参数
    hdfs dfs -mkdir -p /目录a/目录b
    hdfs dfs -mkdir -p /abc/file
    
  3. 文件上传
    #方式一(-put)
    hdfs dfs -put linux文件路径 hdfs目录
    hdfs dfs -put /opt/models/jdk /abc
    
    #方式二(-copyFromLocal)
    hdfs dfs -copyFromLocal linux文件路径 hdfs目录
    hdfs dfs -copyFromLocal jdk-8u191-linux-x64.rpm /
    
  4. 文件下载
    #方式一(-get)
    hdfs dfs -get hdfs文件 linux本地目录
    hdfs dfs -get /abc/jdk1.8 /opt
    
    #方式二(-copyToLOcal)
    hdfs dfs -copyToLocal hdfs文件 linux本地目录
    hdfs dfs -copyToLocal /jdk-8u191-linux-x64.rpm /root/
    
  5. 查看文件内容
    hdfs dfs -cat hdfs文档路径
    hdfs dfs -cat /abc/Test.java
    
  6. 删除文件
    hdfs dfs -rm hdfs文件路径
    hdfs dfs -rm /abc/Test.java
    
  7. 删除文件夹
    #删除空文件夹
    hdfs dfs -rm -r hdfs文件夹
    hdfs dfs -rm -r /abc
    #文件夹非空,使用-rmr
    hdfs dfs -rmr -r hdfs文件夹
    hdfs dfs -rmr -r /abc
    
  8. 移动HDFS文件系统内部文件
    hdfs dfs -mv /hdfs/demo1/wordcount1.log /hdfs/demo2
    
  9. 修改hdfs文件权限
    hdfs dfs -chmod 权限运算值 hdfs文件
    #参数-R,递归修改文件夹下属所有文件及文件夹权限
    hdfs dfs -chmod [-R] 权限运算值 hdfs文件
    hdfs dfs -chmod -R 777 /abc
    
  10. 将A文件内容追加到HDFS的B文件末尾
    hdfs dfs -appendToFile linux本地A文件 HDFS远程B文件
    hdfs dfs -appendToFile /etc/profile /Test1.java
    
  11. 将HDFS中目录下多个文件合并后下载本地
    hdfs dfs -getmerge HDFS的文件目录 linux本地文件
    hdfs dfs -getmerge /config/*.xml /hello.xml
    
    # 场景
      大量10w小文件在HDFS存储,每个文件1kb,总大小,100MB.(业务含义一样:2022-9-9豆瓣网电影影评日志信息)
      HDFS保存多少元数据:
          10w个文件描述信息
          10w个block描述信息
      HDFS保存多少Block: 
          10w*3个block.
    # 问题:
      产生大量的block描述信息,大量的文件元数据,占用大量的NameNode内存空间。
    # 解决:
      1. 使用HDFS命令合并下载本地。 -getmerge
      2. 将合并后的文件上传即可。 
      3. 原始的小文件删除了。 
    

3.3 Java操作HDFS

3.3.1 入门

  • 核心3个API

    API含义和作用
    Configuration配置信息,封装hdfs操作的相关配置文件信息
    FileSystemHDFS的分布式文件系统工具,操作HDFS文件。
    PATH表示操作路径
  • windows开发环境准备(开发和测试需要)

    # 1. 将hadoop2.9.2的软件,解压到window中,路径不能有中文,不能有空格。
    # 2. 拷贝hadoop的windows执行环境工具到bin路径下,替换客户端工具。
    # 3. 配置环境变量
      HADOOP_HOME=hadoop安装路径
      PATH=hadoop安装路径/bin
      HADOOP_USER_NAME=root #免去HDFS的操作权限限制
    # 4. 重启IDEA或者eclipse
    
  • HDFS依赖

    # 日志文件
    位置:/opt/installs/hadoop-2.9.2/etc/hadoop/log4j.properties
    
    <!-- HDFS依赖 -->
    <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-common -->
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-client</artifactId>
        <version>2.9.2</version>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
    </dependency>
    
  • 编程步骤(文件上传)

    //需求:向hdfs集群上传一个文件
    //命令:hdfs dfs -put 本地文件路径  hdfs远程路径位置。
    @Test
    public void test1() throws IOException {
        // 1. 初始化配置
        Configuration conf = new Configuration();
        conf.set("fs.defaultFS", "hdfs://192.168.199.10:9000");
        conf.set("dfs.replication", "1");
        // 2. 获得操作hdfs的客户端。
        FileSystem fs = FileSystem.get(conf);
        // 使用客户端的方法(命令),操作hdfs
        fs.copyFromLocalFile(new Path("D:/yangyang.mp4"), new Path("/data"));
        // 3. 关闭资源。
        if (fs != null) {
            fs.close();
        }
    }
    
    // 常见异常:
      Permission denied: user=Administrator, access=WRITE, inode="/hdfs":root:supergroup:drwxr-xr-x
    // 解决办法:
      为上传的hfds目录添加写w权限
      hdfs dfs -chmod 777 /hdfs  
    

3.3.2 常见API操作

  • 文件下载
    //需求:从hdfs中下载 /abc/demo.tar.gz 文件
    //命令:hdfs dfs -get /abc/demo.tar.gz  D:/
    @Test
    public void test2() throws IOException {
        //1. 初始化配置文件
        Configuration conf = new Configuration();
        conf.set("fs.defaultFS", "hdfs://192.168.199.10:9000");
        //2. 获得hdfs操作客户端
        FileSystem fs = FileSystem.get(conf);
        fs.copyToLocalFile(new Path("/abc/demo.tar.gz"), new Path("D:/demo.tar.gz"));// 拷贝到本地。
        //
        //3. 关闭资源
        fs.close();
    }
    
  • 创建目录
    //创建文件夹
    boolean isok = fileSystem.mkdir(new Path("/abc/yangdddir"));//返回值boolean,是否创建成功。 
    
  • 判断文件是否存在
    //判断文件是否存在
    boolean isexist = fileSystem.exists(new Path("/abc/yangdd")) 
    
  • 删除文件
    //参数1:远端hdfs的文件路径
    //参数2:是否递归删除,如果给false,删除无法递归则会抛出异常
    //返回值:是否删除成功
    Boolean deleteOK = fileSystem.delete(new Path("hdfs文件路径"),true); 
    
  • 获得目录所有文件和目录
    // 获得目录下所有文件和目录的元数据== hdfs dfs -ls /hdfs
    FileStatus[] fileStatuses = fs.listStatus(new Path("/hdfs"));
    for (FileStatus file : fileStatuses) {
        //1. 获得文件路径
        Path path = file.getPath();
        //2. 获得文件权限
        FsPermission permission = file.getPermission();
        //3. 获得文件副本数
        short replication = file.getReplication();
        //4. 获得文件修改时间,long的时间戳
        long modificationTime = file.getModificationTime();
        //5. 获得文件大小,单位B
        long len = file.getLen();
    } 
    
  • 读取文件信息及其block信息
    /**
     * 功能:递归获得目录下的所有文件的元数据信息,相当于hdfs的ls命令
     * listFiles参数1:要查看的目录
     * listFiles参数2:是否递归 -R
     */
    RemoteIterator<LocatedFileStatus> files = fs.listFiles(new Path("/hdfs"), true);
    while(files.hasNext()){
        //迭代获得每个file元数据
        LocatedFileStatus file = files.next();
        //1. 获得文件路径
        Path path = file.getPath();
        //2. 获得文件权限
        FsPermission permission = file.getPermission();
        //3. 获得文件副本数
        short replication = file.getReplication();
        //4. 获得文件修改时间,long的时间戳
        long modificationTime = file.getModificationTime();
        //5. 获得文件大小,单位B
        long len = file.getLen();
        //6. 获得block的切片分布信息
        BlockLocation[] blockLocations = file.getBlockLocations();
    }
    

4 HDFS原理相关

4.0 Trash回收站

HDFS为了规避由于用户的误操作,导致的数据删除丢失,用户可以在构建HDFS的时候,配置HDFS的垃圾回收功能。

所谓的垃圾回收,本质上是在用户删除文件的时候,系统并不会立即删除文件,仅仅是将文件移动到垃圾回收的目录。然后根据配置的时间,一旦超过该时间,系统会删除该文件,用户需要在到期之前,将回收站的文件移除垃圾站,即可避免删除

<!--开启垃圾回收,需要在core-site.xml中添加如下配置,然后重启hdfs即可-->
<!--垃圾回收,1440 minites == 1天-->
<property>
  <name>fs.trash.interval</name>
  <value>1440</value>
</property>
# 验证(日志会记录文件删除的回收站的位置)
[root@hadoop10 hadoop]# hdfs dfs -rm -r /Test1.java
20/11/13 18:28:50 INFO fs.TrashPolicyDefault: Moved: 'hdfs://hadoop10:9000/Test1.java' to trash 
at: hdfs://hadoop10:9000/user/root/.Trash/Current/Test1.java
# 恢复回收站数据(本质上就是移动文件)
hdfs dfs -mv /user/root/.Trash/Current/Test1.java / 

4.1 NameNode持久化

  • 场景引入

    # 问题:NameNode宕机,导致内存中的文件元数据丢失怎么办?
    # 解决:NameNode会将内存中的元数据持久化到磁盘中。 
    
  • 持久化方案分析
    在这里插入图片描述
    在这里插入图片描述

  • 持久化结论

    # 1. HDFS接受客户端的文件操作后。
    # 2. 先将操作的命令以日志的方式记录到editslog中。
    # 3. 然后再将指令对应的文件元数据的修改操作,修改内存中的元数据信息。
    # 4. SNN定期负责将editslog中的文件合并到fsimage中。
    

4.2 checkpoint机制

  • SNN的checkpoint工作机制
    1. SecondaryNameNode向NameNode发起合并请求
    2. NameNode将当前的Editslog文件保存改名edits,并新建EditsLog继续持久化工作
    3. 将改名后的edits文件和本地的FSImage(旧)发送给SecondaryNameNode
    4. SecondaryNameNode负责将FSImage(旧)+edits文件合并成FSImage(新)
    5. 将新的FSImage(新)发送给NameNode保存
    

在这里插入图片描述

  • checkpoint触发条件(时机)
    # 每1分钟检查一次触发条件。(SNN每隔1分钟,访问一次NN)
    1. 每隔1小时触发一次checkPoint
    2. 每100w次操作,触发一次checkpoint
    
    • hdfs-site.xml
      namevalue默认含义
      dfs.namenode.checkpoint.period36003600秒触发一次,数据合并
      dfs.namenode.checkpoint.txns1000000100w次操作触发一次
      dfs.namenode.checkpoint.check.period601分钟检查一次操作次数
  • SecondaryNameNode节点定制
    SNN和NN在一个服务器是上,存在单点故障。
    场景:一旦服务器磁盘崩坏,持久化的数据就会全部丢失。
    解决:SNN和NN放在不同的服务器上。
    
    <!--1. 配置hdfs-site.xml中的SNN的节点地址-->
      <property>
        <name>dfs.namenode.secondary.http-address</name>
        <value>hadoop12:50090</value>
      </property>
      <property>
        <name>dfs.namenode.secondary.https-address</name>
        <value>hadoop12:50091</value>
      </property>
    <!--2. 将修改hdfs-site的配置同步到其他节点。-->
    <!--3. 单独启动SecondaryNameNode -->
      hadoop-deamon start secondarynamenode 
    

4.3 HDFS启动(安全模式)

  • NameNode安全模式(SafeMode)
# 时机
  HDFS启动过程中, 会进入一个特殊状态(SafeMode),该状态下NameNode暂停接受客户端文件修改操作(只能接收文件读操作)
# HDFS启动流程-启动过程自动完成。
1. NameNode启动,加载最新的fsimage恢复数据,并加载未合并的editslog_inprogress,进一步恢复数据。--- NN管理内存数据完整。
2. 等待接受DataNode的心跳 HeartBeat 
	DN的本节点地址 健康状态 磁盘容量 剩余容量 版本号。
3. 等待接受DataNode的块报告 Block Report,判断是否满足最小副本因子(默认值1 dfs.namenode.replication.min)达到了, 则认为当前Block是安全的,完整的。
    DN的本节点的全部Block的信息: block的id offset length。
4. NameNode发现HDFS集群中所有的block的安全(完整)比例是否达到99.9%(dfs.namenode.safemode.threshold-pct), 如果达到,则立刻退出安全模式。
	①为什么要设置最小副本因子为1: 只要有1块完整,block数据即是完整,没必要等全部完整。
5. HDFS退出安全模式,才能正常工作。 

在这里插入图片描述
在这里插入图片描述

# 手动安全模式
  理由:实际开发中为了对HDFS进行维护,会手动NameNode进入安全模式
  注意:safemode安全模式下,只能对HDFS中文件进行读操作,不能进行写操作(上传 修改 删除 移动)
  
  0. 查看hfds安全模式状态
    hdfs dfsadmin -safemode get
  1. 进入安全模式
    hdfs dfsadmin -safemode enter
  2. 退出安全模式
    hdfs dfsadmin -safemode leave

4.4 文件上传

4.5 副本存放机制(机架感知)

  • 机架感知(rack-aware)
# 考虑要素:
   1. HDFS集群的DN有很多台节点。
   2. 节点内部的网络数据传输, 速度最快.
   3. 机架内可以安装多台服务器, 节点之间网络带宽, 由于机架之间的网络带宽.
# 机架感知-副本存放策略(hadoop2.7.6以前)--旧版本
  1. 第一个block副本放在客户端所在的服务器的datanode中。
  2. 第二个block副本放置在本机架内的其它数据节点datanode上
  3. 第三个block副本放置在不同机架的随机某个节点上。(防止某个机架数据丢失) 

在这里插入图片描述

# 副本存放策略(hadoop2.8.4以后)--新版本
  1. 第一个block副本,放在client所在的节点1
  2. 第二个block副本,放在另一个机架上的某个节点上。
  3. 第三个block副本,放在第二个机架的不同节点上。

在这里插入图片描述

4.6 文件下载

在这里插入图片描述

5 HDFS完全分布式

5.1 SSH免密登录

在这里插入图片描述

# start-x启动的原理。
start-dfs.sh和stop-dfs.sh会远程登录到NN和DN对应的节点执行hadoop-deamon.sh start namenode 或者hadoop-deamon.sh start datanode命令启动对应节点的服务。
# 免密登录设置
  0:ip hostname hosts的设置要在免密登录设置之前。
  1. 生成一对秘钥(私钥+公钥)
    ssh-keygen
  2. 将公钥拷贝到被免密登录的机器上。
    ssh-copy-id root@ip

5.2 HDFS分布式集群

5.2.1 集群规划

在这里插入图片描述

5.2.1 服务器准备

# 1. 准备3台虚拟机
  1. hostname
  2. ip
  3. hosts
  4. 防火墙
  5. jdk和环境变量配置

5.2.3 HDFS集群搭建

  • ①免密登录的设置
    1. 生成秘钥
    [root@hadoop11 hadoop]# ssh-keygen
    
    2. 发送公钥到集群所有节点 hadoop11 hadoop12 hadoop13
    [root@hadoop11 hadoop]# ssh-copy-id hadoop11
    [root@hadoop11 hadoop]# ssh-copy-id hadoop12
    [root@hadoop11 hadoop]# ssh-copy-id hadoop13 
    
    3. 验证免密登录效果
    ssh root@hadoop13
    
  • ②安装HDFS(先安装1台)
    1. 解压hadoop
    2. 配置环境变量
        HADOOP_HOME
        PATH
    3. 重新加载配置文件。
    	source /etc/profile
    
  • ③初始化配置文件(1台)
    1. hadoop-env.sh
        # jdk安装目录
        JAVA_HOME=/opt/installs/jdk1.8
    2. core-site.xml
    	# 配置hdfs入口地址
        <property>
            <name>fs.defaultFS</name>
            <value>hdfs://hadoop11:9000</value>
        </property>
        # 配置数据保存位置(需要在hadoop的根目录下新建data目录)
        <property>
            <name>hadoop.tmp.dir</name>
            <value>/opt/installs/hadoop-2.9.2/data</value>
        </property>
    3. hdfs-site.xml
        # 配置副本个数
        <property>
            <name>dfs.replication</name>
            <value>3</value>
        </property>
    4. slaves (配置多个DN节点,最好使用vi编辑器)
        # 配置从机datanode的ip
        hadoop11
        hadoop12
        hadoop13
    
    <!--指定SecondaryNameNode节点定制。
     1. 配置hdfs-site.xml中的SNN的节点地址-->
      <property>
        <name>dfs.namenode.secondary.http-address</name>
        <value>192.168.28.12:50090</value>
      </property>
      <property>
        <name>dfs.namenode.secondary.https-address</name>
        <value>192.168.28.12:50091</value>
      </property>
    <!--2. 将修改hdfs-site的配置同步到其他节点。 -->
    
  • ④同步配置文件到其他节点
    # 注意事项
    一个hadoop集群中,所有hadoop配置文件要完全一致
    将本机的hdfs配置同步到其他机器
    
  • ⑤初始化HDFS集群
    # 5. 初始化HDFS
      1. 删除hadoop的data文件夹
        [root@hadoop11 etc]# rm -rf /opt/installs/hadoop2.9.2/data/*
      2. 格式化集群
         在namenode节点执行格式化。
         hdfs namenode -format
    
  • ⑥配置window访问hdfs的集群的ip映射
    在这里插入图片描述
  • ⑦启动HDFS集群
    在拥有免密登录权限的节点上执行:
    start-dfs.sh 
    
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值