Hadoop入门

Hadoop入门

分布式文件系统架构

文件切分思想

  • 文件存放在一个磁盘上效率肯定是低的

    • 读取效率低
    • 如果文件特别大会超出单机的存储范围
  • 字节数组

    • 文件在磁盘真实存储文件的抽象概念
    • 数组可以进行拆分和组装,源文件不会受到影响
  • 切分数据

    • 对字节数组进行切分
  • 拼接数据

    • 按照数组的偏移量将数据连接到一起,将字节数组链接到一起
  • 偏移量

    • 当前数据在数组中的相对位置,你可以理解为 下标
    • 数组都有对应的索引(下标),可以快速的定位数据
  • 数据存储的原理

    • 不管文件的的大小,所有的文件都是由字节数组构成
    • 如果我们要切分文件,就是将一个字节数组分成多份
    • 我们将切分后的数据拼接到一起,数据可以继续使用
    • 我们需要根据数据的偏移量将他们重新拼接到一起

Block拆分标准

  • 拆分的数据块需要等大

    • 数据不统一,算法很难设计
    • 数据拉取的时候时间相对一致
    • 通过偏移量就知道这个块的位置
    • 相同文件,分成的数据块大小应该相等
  • 数据块 Block

    • 数据被切分后的一个整体称之为块

    • 在H1默认大小为64M,在H2及其以后默认大小为128M

    • 同一个文件中,数据块大小要一致除了最后一个节点外

      • 不同文件中,块的大小可以不一致
      • 文件大小不同可以设置不同的块的数量
    • 真实情况下,会根据文件大小和集群节点的数量综合考虑块的大小

    • 数据块的个数 =Ceil( 文件大小 / 每个块的大小)

  • 注意事项

    • HDFS中一旦文件被存储,数据不允许被修改

      • 修改会影响偏移量
      • 修改会导致数据倾斜
      • 修改数据会导致蝴蝶效益
    • 但是可以被追加,但是不推荐

      • 追加设置需要手动打开
    • 一般HDFS存储的都是历史数据。所以 将来Hadoop的mr都用来进行离线数据的处理

    • 块的大小一旦文件上传之后就不允许被修改

    • 问题

      • 如果数据文件的切割点128M整好是一个单词的中间部分,切分数据如何保证数据的完整性?

Block数据安全

  • 对存储数据做备份

  • 备份的数据肯定不能存放在一个节点上

  • 所以备份的数量要小于等于节点的数量

  • 每个数据块会有3个副本(总)

  • 副本的数量可以变更

    • 可能近期的数据被分析的可能性跟大,副本数可以多设置几个
    • 后期数据很少被分析,可以减少副本数

Block的管理效率

  • 分工

    • 存储 DataNode
    • 记录 NameNode
    • 日志 secondaryNameNode

HDFS的特点

  • 优点

    • 高容错性

      • i.保存多个副本,且提供容错机制。
      • ii.副本丢失或宕机自动恢复。默认存3份。
    • 运行在廉价的机器上(商用机)

      • i.通过副本提高可靠性
      • ii.提供了容错和恢复机制
    • 适合批处理

      • i.移动计算而非数据
      • ii.数据位置暴露给计算框架。NameNode上有位置
    • 适合大数据的处理

      • i.TB,甚至PB级数据
      • ii.百万规模以上的文件数量
      • iii.10K+节点规模
    • 流式数据访问

      • i.一次写入,多次读取,高吞吐量,所以可以同时处理大量数据
  • 缺点

    • 不擅长低延迟数据访问

      • 比如毫秒级
    • 不擅长小文件的分区

      • i.占用NameNode大量内存,每个小文件都有一个元数据信息,甚至比文件还大
      • ii.磁盘寻道时间超过读取时间
    • 不擅长并发写入,文件随机修改

      • i.一个文件只能有一个写入者
      • ii.仅支持append,也就是添加(有组件实现删等)

Hadoop集群命令

分类

  • hadoop fs

    • 该命令可以用于其他文件系统,不止是hdfs文件系统内,也就是说该命令的使用范围更广
  • hadoop dfs(推荐)

    • 专门针对hdfs分布式文件系统

hdfs dfs命令

  • -mkdir

  • -ls

  • -put

  • -get

  • -du

    • 显示给定目录中包含的文件和目录的大小或文件的长度,用字节大小表示
  • -dus

    • 显示文件长度的摘要
  • -mv

    • 不允许跨文件系统移动文件
  • -cp

  • -copyFromLocal

    • 从本地复制文件到hdfs文件系统(与-put命令相似)
  • -copyToLocal

    • 复制hdfs文件系统中的文件到本地 (与-get命令相似)
  • -rm

  • -cat

  • -text

    • 获取源文件并以文本格式输出文件
  • -touchz

    • 创建一个零长度的文件
  • -stat

  • -tail

    • 显示文件的最后1kb内容到标准输出
  • -getmerge

    • 将源目录和目标文件作为输入,并将src中的文件连接到目标本地文件(把两个文件的内容合并起来
  • -distcp

    • 最常用在集群之间的拷贝

文件的数据类型

文件有一个stat命令

  • 元数据信息–>描述文件的属性

文件有一个vim命令

  • 查看文件的数据信息

分类

  • 元数据

    • 文件的基本信息
  • 文件数据

    • 真实存在于文件中的数据

NameNode(NN)

功能

  • 接受客户端的读写服务

    • NameNode存放文件与Block的映射关系
    • NameNode会记录Block与DataNode的映射关系,但是不会持久化
  • 保存文件的元数据信息

    • 文件的归属
    • 文件的权限
    • 文件的大小时间
    • Block信息,但是block的位置信息不会持久化,需要每次开启集群的时候DN上报
  • 收集Block的信息

    • 系统启动时

      • NN关机的时候是不会存储任意的Block与DN的映射信息

      • DN启动的时候,会将自己节点上存储的Block信息汇报给NN

      • NN接受请求之后重新生成映射关系

        • Block–DN3
      • 如果某个数据块的副本数小于设置数,那么NN会将这个副本拷贝到其他节点

    • 集群运行中

      • NN与DN保持心跳机制,三秒钟发送一次
      • 如果客户端需要读取或者上传数据的时候,NN可以知道DN的健康情况
      • 可以让客户端读取存活的DN节点
  • 如果DN超过三秒没有心跳,就认为DN出现异常

      • 不会让新的数据读写到DataNode
      • 客户访问的时候不提供异常结点的地址
    • 如果DN超过10分钟+30秒没有心跳,那么NN会将当前DN存储的数据转存到其他节点

性能

  • NameNode为了效率,将所有的操作都在内存中完成

    • NameNode不会和磁盘进行任何的数据交换

    • 问题

      • 数据的持久化
      • 数据保存在内存中,掉电易失

DataNode(DN)

功能

  • 存放的是文件的数据信息和验证文件完整性的校验信息

    • 数据会存放在硬盘上
    • 1m=1条元数据 1G=1条元数据
    • NameNode非常排斥存储小文件,一般小文件在存储之前需要进行压缩
  • 汇报

    • 启动时

      • 汇报之前先验证Block文件是否被损坏
      • 向NN汇报当前DN上block的信息
    • 运行中

      • 向NN保持心跳机制
      • 客户可以向DN读写数据
  • 当客户端读写数据的时候,首先去NN查询file与block与dn的映射,然后客户端直接与dn建立连接,然后读写数据

SecondaryNameNode

传统解决方案

  • 日志机制

    • 做法

      • 做任何操作之前先记录日志
      • 当NN下次启动的时候,只需要重新按照以前的日志“重做”一遍即可
    • 缺点

      • edits文件大小不可控,随着时间的发展,集群启动的时间会越来越长
      • 有可能日志中存在大量的无效日志
    • 优点

      • 绝对不会丢失数据
  • 拍摄快照

    • 做法

      • 我们可以将内存中的数据写出到硬盘上(序列化)
      • 启动时还可以将硬盘上的数据写回到内存中(反序列化)
    • 缺点

      • 关机时间过长
      • 如果是异常关机,数据还在内存中,没法写入到硬盘
      • 如果写出频率过高,导致内存使用效率低(stop the world) JVM
    • 优点

      • 启动时间较短

SNN解决方案

  • 解决思路(日志edits+快照fsimage)

    • 让日志大小可控
    • 定时快照保存
  • NameNode文件目录

  • 解决方案

    • 启动一个集群的时候,会产生四个文件

      • edits_0000000000000000001
      • fsimage_00000000000000000
      • seen_txid
      • VERSION
    • 我们每次操作都会记录日志 -->edits_inprogress-000000001

    • 随和时间的推移,日志文件会越来越大,当达到阈值的时候(64M 或 3600秒)生成新的日志文件(合并一次Fsimage快照 和 Edits日志)

      • edits_inprogress-000000001 -->edits_0000001
      • 创建新的日志文件edits_inprogress-0000000016
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值