带你快速了解Hadoop之HDFS(一)

带你快速了解Hadoop之HDFS(一),第1张

带你快速了解Hadoop之HDFS(一) Hadoop-HDFS Hadoop历史 Hadoop进化史
  • Nutch

    • Hadoop最早起源于Nutch。
    • Nutch的设计目标是构建一个大型的全网搜索引擎,包括网页抓取、索引、查询等功能
    • 但随着抓取网页数量的增加,遇到了严重的可扩展性问题——如何解决数十亿网页的存储和索
      引问题。
  • Google

    • 2003年、2004年谷歌发表的两篇论文为该问题提供了可行的解决方案。
    • GFS : Google File System
    • MapReduce :数据计算的方法
  • Doug cutting 花费了自己的两年业余时间,将论文实现了出来

    • 2008年1月,HADOOP成为Apache顶级项目
  • Hadoop

    ​ 狭义上来说,hadoop就是单独指代hadoop这个软件,

    • 广义上来说,hadoop指代大数据的一个生态圈,包括很多其他的软件
Hadoop官网

http://hadoop.apache.org/

Hadoop Model

  • Hadoop Common 基础型功能
  • Hadoop Distributed File System 负责存放数据
  • Hadoop YARN 负责资源的调配
  • Hadoop MapReduce 大数据的计算框架
  • Hadoop Ozone 数据存放到仓库
  • Hadoop Submarine 机器学习引擎
分布式文件系统架构
  • FS File System
    • 文件系统是基于硬盘之上的一个文件管理系统的工具
    • 我们用户 *** 作文件系统可以和硬盘进行解耦
  • DFS Distributed FileSyetem
    • 分布式文件系统
    • 管理网络中跨多台计算机存储的文件系统称为分布式文件系统
    • 将我们的数据存放在多台电脑上存储
    • 分布式文件系统有很多,HDFS(Hadoop Distributed FileSyetem)是Hadoop自带的分布式文件系统
    • HDFS是Map Reduce计算的基础
文件切分思想
  • 文件存放在一个磁盘上存在的问题
    • 读取效率低
    • 如果文件特别大会超出单机的存储范围
  • 数据存储的原理
    • 不管文件的大小,所有的文件都是由字节数组构成
    • 如果我们要切分文件,就是将一个字节数组分成多份
    • 我们将切分后的数据拼接到一起,数据还可以继续使用
    • 我们需要根据数据的偏移量将他们重新拼接到一起
  • 字节数组
    • 文件在磁盘真实存储文件的抽象概念
    • 数组可以进行拆分和组装,源文件不会收到影响
  • 切分数据
    • 对字节数组进行切分
  • 拼接数据
    • 按照数组的偏移量将数据连接到一起,也就是将字节数组连接到一起
  • 偏移量
    • 当前数据在数组中的相对位置,可以理解为下标
    • 数组都有对应的索引,可以快速定位数据
Block(块)拆分标准
  • 数据块Block

    • 磁盘进行数据 读/写的最小单位
    • 在Hadoop 1默认大小为64M,在Hadoop 2及其之后默认大小为128M
      • 块这么大是为了最小化寻址开销
    • 同一个文件中,每个数据块的大小要一致除了最后一个节点
      • 不同文件中,块的大小可以不一致
      • 文件大小不同可以设置不同的块的数量
      • HDFS中小于一个块的大小的文件不会占据整个块的空间
    • 真实情况下,会根据文件大小和集群节点的数量综合考虑块的大小
    • 数据块的个数=Ceil(文件大小/每个块的大小)
  • 拆分的数据块需要等大

    • 数据计算的时候简化问题的复杂度(否则进行分布式算法设计的时候会因为数据量不一很难设计)
    • 数据拉取的时候时间相对一致
    • 通过偏移量就知道这个块的位置
    • 相同文件分成的数据块大小应该相等
  • 注意事项

    • 只要有任意一个块丢失,整个数据文件被损坏
    • HDFS中一旦文件被存储,数据不允许被修改
      • 修改会影响偏移量
      • 修改会导致数据倾斜
      • 修改数据会导致蝴蝶效应
    • 但是可以被追加(一般不推荐)
      • 追加设置需要手动打开
    • 一般HDFS存储的都是历史数据.所以将来Map Reduce都用来进行离线数据的处理
    • 块的大小一旦文件上传之后就不允许被修改
      • 128M-512M
Block数据安全
  • 只要有任意一个块丢失,整个数据文件被损坏
  • 肯定要对存储数据做备份
  • HDFS是直接对原始数据进行备份的,这样能保证回复效率和读取效率
  • 备份的数据肯定不能存放在一个节点上,使用数据的时候可以就近获取数据
  • 备份的数量要小于等于节点的数量
  • 每个数据块默认会有三个副本,相同副本是不会存放在同一个节点上
  • 副本的数量可以变更
    • 可能近期数据被分析的可能性很大,副本数可以多设置几个
    • 后期数据很少被分析,可以减少副本数
Block的管理效率
  • 需要专门给节点进行分工
    • 存储 DataNode
    • 记录 NameNode
    • 日志 Secondary NameNode
HDFS特点
  • 优点
    • 1)高容错性
      • 保存多个副本,并且提供容错机制.
      • 副本丢失或宕机自动恢复,默认存3份
    • 2)运行在廉价的机器上(商用机)
      • 通过副本提高可靠性
      • 提供了容错和恢复机制
    • 3)适合批量处理
      • 移动计算而非数据
      • 数据位置暴漏给计算框架,NameNode上有位置
    • 4)适合大数据的处理
      • TB,甚至PB级数据
      • 百万规模以上的文件数量
      • 10K+的节点规模
    • 5)流式数据访问
      • 一次写入,多次读取,高吞吐量所以可以同时处理大量数据
  • 缺点
    • 1)不擅长低延迟数据访问;比如毫秒级
    • 2)不擅长小文件的分区
      • 占用NameNode大量内存
      • 磁盘寻道时间超过读取时间
    • 3)不擅长并发写入,文件随机修改
      • 一个文件只能有一个写入者
      • 仅支持append也就是追加(有组件实现删等)
Hadoop3完全分布式搭建

准备安装环境
[root@node01 ~]# tar -zxvf hadoop-3.1.2.tar.gz
[root@node01 ~]# mv hadoop-3.1.2 /opt/yjx/
修改集群环境

[root@node01 ~]# cd /opt/yjx/hadoop-3.1.2/etc/hadoop/ [root@node01 hadoop]# vim hadoop-env.sh

##直接在文件的最后添加
export JAVA_HOME=/usr/java/jdk1.8.0_231-amd64
export HDFS_NAMENODE_USER=root
export HDFS_DATANODE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root
修改配置文件
  • [root@node01 ~]# cd /opt/yjx/hadoop-3.1.2/etc/hadoop/ [root@node01 hadoop]# vim core-site.xml

    
    fs.defaultFS
    hdfs://node01:9000
    
    
    hadoop.tmp.dir
    /var/yjx/hadoop/full
    
    
  • [root@node01 hadoop]# vim hdfs-site.xml

    
    dfs.namenode.secondary.http-address
    node02:50090
    
    
    dfs.namenode.secondary.https-address
    node02:50091
    
    
    dfs.replication
    2
    
    
  • [root@node01 hadoop]# vim workers

    node01
    node02
    node03
    
拷贝软件到其他主机

将配置好的软件发到其他两台主机

[root@node02 ~]# scp -r root@node01:/opt/yjx/hadoop-3.1.2 /opt/yjx/
[root@node03 ~]# scp -r root@node01:/opt/yjx/hadoop-3.1.2 /opt/yjx/
修改环境变量
  • [123]# vim /etc/profile 三台主机都需要修改

    export HADOOP_HOME=/opt/yjx/hadoop-3.1.2
    export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
    
  • 重新加载三台主机的环境变量[123]# source /etc/profile

格式化NameNode
  • [root@node01 yjx]# hdfs namenode -format

  • 启动[root@node01 yjx]# start-dfs.sh

    Starting namenodes on [node01]Last login: Fri Oct 30 21:32:11 CST 2020
    from 192.168.58.1 on pts/0node01: Warning: Permanently added
    'node01,192.168.58.101' (ECDSA) to the list of known hosts.Starting
    datanodesLast login: Fri Oct 30 22:06:12 CST 2020 on pts/0node03:
    Warning: Permanently added 'node03,192.168.58.103' (ECDSA) to the list
    of known hosts.node02: Warning: Permanently added
    'node02,192.168.58.102' (ECDSA) to the list of known hosts.node01:
    Warning: Permanently added 'node01,192.168.58.101' (ECDSA) to the list
    of known hosts.node03: WARNING: /opt/yjx/hadoop-3.1.2/logs does not
    exist. Creating.node02: WARNING: /opt/yjx/hadoop-3.1.2/logs does not
    exist. Creating.Starting secondary namenodes [node02]Last login: Fri Oct
    30 22:06:14 CST 2020 on pts/0node02: Warning: Permanently added
    'node02,192.168.58.102' (ECDSA) to the list of known hosts.
    
测试集群
  • 访问http://node01:9870 node01替换成IP地址

  • 如果出以下下页面代表成功

关闭集群
  • [root@node01 ~]# stop-dfs.sh

    Stopping namenodes on [node01]Last login: Fri Oct 30 22:06:20 CST 2020
    on pts/0node01: Warning: Permanently added 'node01,192.168.58.101'
    (ECDSA) to the list of known hosts.Stopping datanodesLast login: Fri Oct
    30 22:16:34 CST 2020 on pts/0node03: Warning: Permanently added
    'node03,192.168.58.103' (ECDSA) to the list of known hosts.node02:
    Warning: Permanently added 'node02,192.168.58.102' (ECDSA) to the list
    of known hosts.node01: Warning: Permanently added
    'node01,192.168.58.101' (ECDSA) to the list of known hosts.Stopping
    secondary namenodes [node02]Last login: Fri Oct 30 22:16:35 CST 2020 on
    pts/0node02: Warning: Permanently added 'node02,192.168.58.102' (ECDSA)
    to the list of known hosts.
    
  • 关机拍摄快照

文件的数据类型
  • 元数据

    • stat命令,查看元数据信息(描述文件的属性)

    • File 文件名
      Size 文件大小(字节)
      Blocks 文件使用的数据块总数
      IO Block 数据块的大小
      regular file:文件类型(常规文件)
      Device 设备编号
      Inode 文件所在的Inode
      links 硬链接次数
      Access 权限
      Uid 属主id/用户
      Gid 属组id/组名
      Access Time:简写为atime,表示文件的访问时间。当文件内容被访问时,更新这个时间
      Modify Time:简写为mtime,表示文件内容的修改时间,当文件的数据内容被修改时,更新这个
      时间。
      Change Time:简写为ctime,表示文件的状态时间,当文件的状态被修改时,更新这个时间,例
      如文件的链接数,大小,权限,Blocks数。
      
  • 文件数据

    • 文件的真实数据,文件真正存放的内容,这个数据就是存储在硬盘上的二进制数据
NameNode

功能
  • 接受客户端的读写服务
    • NameNode存放文件与Block的映射关系
    • NameNode会记录Block与DateNode的映射关系,但是不会持久化
  • 保存文件的元数据信息
    • 文件的归属
    • 文件的权限
    • 文件的大小时间
    • Block信息,但是Block的位置信息不会持久化,需要每次开启集群的时候DataNode上报
  • 收集Block的信息
    • 系统启动时
      • NameNode关机的时候式不会存储任意的Block与DataNode的映射信息
      • DataNode启动的时候,会将自己节点上存储的Block信息汇报给NameNode
      • NameNode接受请求之后重新生成新的映射关系
      • 如果某个数据块的副本数小于设置数,那么NameNode会将这个副本拷贝到其他节点
    • 集群运行中
      • NameNode与DataNode保持心跳机制,三秒钟发送一次
      • 如果客户端需要读取或者上传数据的时候,NameNode可以知道DataNode的健康情况
      • 可以让客户端读取存活的DataNode节点
  • 当集群关机时
    • 元数据,文件与块的映射会被实例化到硬盘上,但是Block与DataNode的映射不会存放到硬盘
    • 为了保证每个Block对应的DataNode都是有效的,所以每次集群启动的时候,DataNode会向NameNode汇报当前节点所拥有的有效节点
  • 如果DataNode超过三秒没有心跳,就认为DataNode出现异常
    • 不会让新的数据读写到DataNode
    • 客户访问的时候不提供异常节点的地址
    • 如果DataNode超过10分钟+30秒没有心跳,那么NameNode会将当前DataNode存储的数据转存到其他节点
      • 超时时长的计算公式为: timeout = 2 * heartbeat.recheck.interval + 10 *
        dfs.heartbeat.interval。 而默认的heartbeat.recheck.interval 大小为5分钟,
        dfs.heartbeat.interval默认为3秒。
性能
  • NameNode为了效率,将所有的 *** 作都在内存中完成
    • NameNode不会和磁盘进行任何的数据交换
DataNode 功能
  • 存放的是文件的数据信息和验证文件完整性的校验信息
    • 数据会存放在硬盘上
    • 1m=1条元数据;1G=1条元数据
    • NameNode非常排斥存储小文件,一般小文件在存储之前需要进行压缩
  • 汇报
    • 启动时
      • 汇报之前先验证Block文件是否被损坏
      • 向NameNode汇报当前DataNode上Block的信息
    • 运行中
      • 向NameNode保持心跳机制
      • 客户可以向DataNode读写数据
  • 当客户端读写数据的时候,首先去NameNode查询file与Block与DataNode的映射
    • 然后客户端直接与DataNode建立连接,然后读写数据

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5683717.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存