【Hadoop】分布式安装、HDFS (二)

Hadoop

分布式安装(下)

Hadoop配置(下)

  1. 进入Hadoop的命令目录

    cd /opt/software/hadoop-3.2.4/sbin/
    
  2. 修改文件

    vim start-dfs.sh
    # 在文件头部添加
    HDFS_NAME_USER=root
    HDFS_SECONDARYNAMENODE_USER=root
    HDFS_DATANODE_USER=root
    HDFS_DATANODE_SECURE_USER=root
    
  3. 修改文件

    vim stop-dfs.sh
    # 在文件头部添加
    HDFS_NAME_USER=root
    HDFS_SECONDARYNAMENODE_USER=root
    HDFS_DATANODE_USER=root
    HDFS_DATANODE_SECURE_USER=root
    
  4. 修改文件

    vim start-yarn.sh
    # 在文件头部添加
    YARN_RESOURCEMANAGER_USER=root
    YARN_NODEMANAGER_USER=root
    HDFS_DATANODE_SECURE_USER=root
    
  5. 修改文件

    vim stop-yarn.sh
    # 在文件头部添加
    YARN_RESOURCEMANAGER_USER=root
    YARN_NODEMANAGER_USER=root
    HDFS_DATANODE_SECURE_USER=root
    

配置历史服务器(可选)

  1. 在Hadoop中,MapReduce负责计算,计算完成之后,历史任务会被清理掉,如果需要将历史任务进行记录,那么就需要配置并开启历史服务器

  2. 步骤

    1. 进入Hadoop的配置目录

      cd /opt/software/hadoop-3.2.4/etc/hadoop/
      
    2. 编辑文件

      vim mapred-site.xml
      

      在文件中添加

      <!-- 历史服务器的地址 -->
      <property>
              <name>mapreduce.jobhistory.address</name>
              <value>hadoop02:10020</value>
      </property>
      <!--历史服务器的web访问地址-->
      <property>
              <name>mapreduce.jobhistory.webapp.address</name>
              <value>hadoop02:19888</value>
      </property>
      

日志聚集(可选)

  1. Hadoop任务在运行过程中会产生大量的日志,但是因为Hadoop是一个分布式架构,所以导致这些日志也是分布式在不同的节点上,对于维护和排错会带来较大的困难,所以希望将Hadoop产生的日志上传到HDFS上,进行日志的汇聚,方便进行调试

  2. 步骤

    1. 编辑文件

      vim yarn-site.xml
      
    2. 在文件中添加

      <!-- 开启日志聚集的功能 -->
      <property>
              <name>yarn.log-aggregation-enable</name>
              <value>true</value>
      </property>
      <!-- 设置日志聚集的服务器地址 -->
      <property>
              <name>yarn.log.server.url</name>
              <value>http://hadoop02:19888/jobhistory/log</value>
      </property>
      <!-- 设置日志保留时间  -->
      <property>
              <name>yarn.log-aggregation.retain-seconds</name>
              <value>604800</value>
      </property>
      

分发和启动

  1. 远程分发

    cd /opt/software/
    scp -r hadoop-3.2.4/ root@hadoop02:/opt/software
    scp -r hadoop-3.2.4/ root@hadoop03:/opt/software
    
  2. 配置环境变量并发送

    # 编辑文件
    vim /etc/profile.d/hadoophome.sh
    # 在文件中添加
    export HADOOP_HOME=/opt/software/hadoop-3.2.4
    export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
    # 保存退出,生效
    source /etc/profile.d/hadoophome.sh
    # 测试
    hadoop version
    # 远程分发
    scp /etc/profile.d/hadoophome.sh root@hadoop02:/etc/profile.d
    scp /etc/profile.d/hadoophome.sh root@hadoop03:/etc/profile.d
    # 分发完成之后,另外两个节点分别source分别测试
    
  3. 第一次启动之前,需要在第一个节点上格式化NameNode

    hdfs namenode -format
    

    如果出现Storage directory /opt/software/hadoop-3.2.4/tmp/dfs/name has been successfully formatted就表示格式化成功

  4. 在第一个节点上启动HDFS

    start-dfs.sh
    
  5. 在第三个节点上启动YARN

    start-yarn.sh
    
  6. 在第二个节点上启动历史服务器

    mapred --daemon start historyserver
    
  7. 查看进程

    jps
    # 第一个节点上有三个进程
    NameNode
    DataNode
    NodeManager
    # 第二个节点上
    SecondaryNameNode
    DataNode
    NodeManager
    JobHistoryServer
    # 第三个节点上
    ResourceManager
    NodeManager
    DataNode
    

HDFS

简介

  1. HDFS(Hadoop Distributed File System)是Hadoop提供的一套用于进行分布式存储的文件系统
  2. HDFS是仿照了Google的GFS来实现的

技术结构

概述

  1. HDFS典型的主从(Master/Slave,简称为M/S)结构。主进程是NameNode,从进程是DataNode
  2. HDFS会对上传的每一个文件进行切块处理,切出来的每一个数据块称之为是一个Block
  3. HDFS会对存储的每一个Block进行备份,称之为副本(replication/replicas)。默认情况下,副本数量为3
  4. HDFS仿照Linux设计了一套虚拟文件系统,根路径是/

Block

  1. 在HDFS中,Block是数据存储的基本单位。即,上传的每一个文件都会被切分成Block形式

  2. Block最终会落地到DataNode的磁盘上

  3. 在Hadoop1.x中,Block默认是64M,从Hadoop2.X开始,每一个Block的大小是134217728B(即128MB)。Block的大小可以通过dfs.blocksize属性来调节,放在hdfs-site.xml文件中,单位是字节。如果一个文件是1G大小,上传到HDFS上之后,会被切分成8个Block

    <property>
    	<name>dfs.blocksize</name>
        <value>134217728</value>
    </property>
    
  4. 如果一个文件大小不足Block的指定大小,那么这个文件是多大,对应的Block就是多大!例如:一个文件是300M大小,对应了3个Block:2*128+44。所以blocksize指定的Block的最大容量

  5. 在设计Block大小的时候,考虑Block在磁盘上的寻址时间和写入时间的比例。经过测试,一般而言,当寻址时间是写入时间的1%的时候,此时效率是最高的。大部分磁盘的寻址时间大约是10ms,那么就意味着写入时间大约是10ms*100=1000ms=1s的时候,效率最高。目前市面上,服务器基本上都是采用机械磁盘,大部分机械磁盘的写入速度是100MB/s150MB/s,那么就意味着Block的大小在100M150M之间。考虑到计算机中的存储单位进制的问题,所以采用了128M(1G=8*128)

  6. HDFS会为每一个Block分配一个全局递增且唯一的BlockID

  7. 切块的意义:能够存储超大文件。基于切块机制下,无论文件多大,都能够进行存储。换言之,集群规模越大,能够存储的文件就越大

NameNode

概述
  1. NameNode是HDFS的主进程,也是核心进程。在Hadoop1.x中只允许存在1个NameNode,在Hadoop2.x允许最多存在2个NameNode(1个Active+1个Standby),在Hadoop3.x中不再限制NameNode的数量(1个Active+n个Standby)
  2. 作为主进程,NameNode对外负责接收请求,对内负责记录元数据和管理DataNode
记录元数据
  1. 元数据(metadata)是用于描述数据的数据。在HDFS中,元数据是用于描述DataNode上存储文件的数据,可以理解为账本

  2. HDFS中,元数据的内容非常复杂,包含了三十多项,例如:

  3. 上传的文件名以及对应的虚拟存储路径

  4. 文件的所属用户和用户组

  5. 文件的权限

  6. 文件的大小

  7. Block的大小

  8. 文件和BlockID的映射关系

  9. 副本的数量

  10. Block和DataNode的映射关系等

  11. 在HDFS中,每一条元数据大小大约是150B左右

  12. NameNode会将元数据维系在内存以及磁盘中

    1. 维系在内存中的目的是为了读写快
    2. 维系在磁盘上的目的是为了持久化
  13. 元数据在磁盘上的存储位置由dfs.namenode.name.dir属性来决定,默认值是file://${hadoop.tmp.dir}/dfs/name,引用了hadoop.tmp.dir属性的值。hadoop.tmp.dir的默认值是/tmp/hadoop-${user.name},此时就意味着必须修改这个存储路径

  14. 在HDFS中,和元数据相关的文件

    1. edits文件:记录HDFS的写操作文件
    2. fsimage文件:元映像文件,记录的是HDFS的元数据
  15. 当NameNode接收到写请求的时候,首先会将这个命令解析记录到edits_inprogress文件中。记录完成之后,会更新内存中的元数据。更新完成之后,会给客户端返回一个ACK信号表示记录成功。注意,在这个过程中,fsimage文件中的元数据没有更新!也就意味着,fsimage文件中的元数据和内存中的元数据不是同步的!!!

    记录元数据
  16. 当达到指定条件之后,edits_inprogress文件就会产生滚动,滚动生成edits文件,同时产生一个新的edits_inprogress文件,新来的写操作记录到新的edits_inprogress文件中。生成edits文件之后,HDFS会解析edits文件,根据edits文件的内容,更新fsimage文件中的元数据

    fsimage文件更新
  17. edits_inprogress的滚动条件

    1. 空间:默认情况下,每隔1min(可以通过dfs.namenode.checkpoint.check.period属性来调节,单位是秒,默认值是60)扫描一次edits_inprogress文件。当扫描edits_inprogress文件的时候,发现达到指定大小(可以通过dfs.namenode.checkpoint.txns属性来调节,默认值是1000000,即edits_inprogress文件中记录达到1000000条)之后,会自动滚动生成edits文件
    2. 时间:当距离上一次滚动达到指定的时间间隔(可以通过dfs.namenode.checkpoint.period属性来调节,默认值是3600,单位是秒)的时候,edits_inprogress文件自动滚动生成edits文件
    3. 重启:当NameNode被重启的时候,也会自动触发edits_inprogress的滚动
    4. 强制:可以通过命令hdfs dfsadmin -rollEdits来强制滚动edits_inprogress
  18. 查看edits文件

    hdfs oev -i edits_0000000000000000012-0000000000000000028 -o a.xml
    
  19. HDFS会给每一给写操作一个递增的编号,称之为事务id,简写为txid

  20. 在HDFS中,会将开始记录日志(OP_START_LOG_SEGMENT)和结束记录日志(OP_END_LOG_SEGMENT)都看作是写操作,都会分配一个事务id

  21. 上传文件的时候,NameNode如何拆分的命令

    1. OP_ADD:在指定路径下添加文件名._COPYING_文件
    2. OP_ALLOCATE_BLOCK_ID:分配BlockID(意味着对文件进行切块)
    3. OP_SET_GENSTAMP_V2:设置时间戳编号
    4. OP_ADD_BLOCK:上传(添加)Block
    5. OP_CLOSE:关闭文件(本质上就是关流)
    6. OP_RENAME_OLD:重命名文件
  22. 在HDFS中,文件一旦写完就不能修改!!!(HDFS中的文件不允许被修改!!!)

  23. 查看fsimage文件

    hdfs oiv -i fsimage_0000000000000000033 -o a.xml -p XML
    
  24. HDFS第一次启动之后1min,会自动触发一次edits_inprogress文件的滚动

  25. NameNode会为每一个fsimage文件生成一个md5文件,用于对fsimage文件进行校验

管理DataNode
  1. NameNode通过心跳(heart beat)机制来管理DataNode:DataNode定时(通过dfs.heartbeat.interval属性来调节,默认值是3,单位是秒)给NameNode发送心跳信号。如果在一定时间内,NameNode没有收到DataNode的心跳信号,那么就表示这个DataNode已经lost(丢失),此时NameNode就会将这个DataNode上的数据重新备份到其他的DataNode上以保证整个集群中的副本数量

  2. 需要注意的是,心跳超时时间由两个属性决定:dfs.heartbeat.intervaldfs.namenode.heartbeat.recheck-interval

    属性默认值单位
    dfs.heartbeat.interval3
    dfs.namenode.heartbeat.recheck-interval300000毫秒

    心跳超时时间=2*dfs.namenode.heartbeat.recheck-interval+10*dfs.heartbeat.interval,默认情况下,心跳超时时间=2*5min+10*3s=10min30s

  3. 心跳信号

    1. clusterid:集群编号。
      1. 当NameNode被格式化(hdfs namenode -format)的时候,自动计算产生一个clusterid
      2. HDFS启动之后,DataNode第一次给NameNode发送心跳,NameNode会在心跳响应中将clusterid返回给这个DataNode,并且要求DataNode在后续的请求(包括心跳)中携带clusterid
      3. 当NameNode收到DataNode的请求之后,会校验clusterid是否一致。如果clusterid一致,那么NameNode才会接收DataNode的请求或者心跳,如果不一致,那么可能会导致DataNode进程或者NameNode进程结束
      4. 每一次格式化,NameNode都会重新计算产生一个新的clusterid
    2. 当前DataNode的状态(预服役、服役、预退役)
  4. 默认情况下,DataNode每隔6个小时(由dfs.blockreport.intervalMsec属性来调节,单位是毫秒,默认值是21600000),会给NameNode汇报一次当前DataNode上存储的Block情况

  • 14
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZikH~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值