Hadoop

Hadoop

HDFS

  • 组成

    • Block

      • 默认128M

      • 若切分数据小于block大小 不必占用block所有空间(eg. 数据大小60M 不会将128M都占用 只会用60M)

      • 便于数据切分 管理 复制

      • 放置策略

        • 若上传文件的服务器本身就是datanode 优先存储在本机上
        • 若不是 随机找一台磁盘不满 cpu不忙的节点 放置b1
        • 在其他机架放置b2(防止停电导致全部失效)
        • 在同一机架放置b3(机架内通讯较快)
    • NameNode

      • 存储HDFS元数据

        • 元数据

          • 文件和block关系
          • block数量
          • block和datanode关系
        • 元数据存储位置

          • 内存(实时数据)

            • 想在内存中进行的操作首先会在edits文件中做记录
          • 文件(持久化数据)

            • fsimage(元数据镜像文件)

            • edits(操作日志文件)

              • 操作成功写入edits文件后,会告诉内存成功,此时内存再进行具体操作
            • fstime(最近一次合并时间)

    • SecondNameNode

      • 辅助namenode进行工作 具有一定的备份功能 但无法完全备份
      • 当edits文件达到一定条件后 复制edits和fsimage文件到 SN 上 进行合并
      • NameNode上同时会创建一个edits.new文件 最新的指令写在其中
      • 合并完成后 发送回namenmode 替换旧的fsimage文件 并将edits.new文件修改为edits文件
    • DataNode

      • 初始化时 主动向NameNode发送数据节点上的block信息

      • 主动发送心跳 与namenode联系 若指定时间未发送 namenode认为该datanode已lost 会复制其上的block到其他datanode

      • 接收namenode的指令

      • 存储内容

        • block内容
        • block id 到 文件的映射关系
  • 原理

    • 存储

      • 1.客户端向namenode发送请求,namenode根据文件是否存在 成功则创建一条记录 失败返回异常
      • 2.写文件时,客户端将数据切分成packets,向namenode申请block,namennode返回block的信息,datanode列表
      • 3.packets以管道的形式 写入第一个datanode,然后再传递给下一个datanode,直到所有的datanode都被写入
      • 4.最后一个datanode写入完成后,发送ack包,在管道里传递至客户端 客户端会从ack队列中移除对应的数据
      • 5.若传输时 某个datanode出现故障,当前管道停止,故障datanode移除管道,剩余block继续传输,发生故障时传输的数据会在稍后继续传输
      • 6.全部完成后 通知namenode关闭文件
    • 读取

      • 客户端向namennode请求block所在的datanode列表
      • 若datanode在本机,直接在本机上寻找,否则寻找最近的datanode,获取数据
      • 若datanode发生故障,到备份datanode寻找,在到备份datanode寻找之前,将错误信息发给namenode
      • 读取完当前block后,继续读取下一个block,重复以上步骤,若block读取完文件仍然没有读取完,向namennode请求下一批的block列表
      • 读取完成后,告知namenode关闭连接
      • 这种读取方式的优点是 客户端直接与datanode进行通信,在高并发环境下十分有利
    • 安全模式

      • namenode启动时,文件fsimage和edits会被持久化到内存中
      • 此时内存中创建了元数据的映射,此时是文件系统对客户端来说是只读的
      • 每个datanode主动向namenode发送报告,当数据块达到最小副本数时,代表此数据块安全,当一定比例的数据达到安全时,退出安全模式

Map/Reduce

  • 运行过程

    • 创建APPMaster

      • 1.向ResourceManager申请此mapreduce的jobid
      • 2.job客户端将job资源复制到hdfs(jar文件,配置和分片信息)

实例

  • wordcount

    • 不使用自定义对象

    • 使用自定义对象

      • 自定义一个baen文件 实现writeable接口 实现write方法和readFields方法

shuffle操作

  • Partitioner 分区

    • 将map结果按照规则分发给不同reduce处理

      • 默认分区规则 只有一个reduce

      • 自定义Partitioner类

        • 编写getPartition方法 参数为map输出
        • 主类中添加 job.setPartitionerClass(FlowPartitioner.class); job.setNumReduceTasks(4);
  • sort排序

    • map执行完成 进入reduce之前 按照mkey进行排序
    • bean类实现WritableComparable接口 实现compareTo方法 主类中不用写setReducer 添加 job.setOutputKeyClass(ProfitInfo.class);
      job.setOutputValueClass(NullWritable.class);
  • Combiner 合并

    • 在map输出前 先做一次合并

      • job.setCombinerClass(WCReducer.class);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值