hadoop离线day06--Hadoop MapReduce、HDFS高阶

hadoop离线day06--Hadoop MapReduce、HDFS高阶


今日内容大纲

#1.MapReduce 
    数据压缩
    自定义分组
        分组在reduce阶段 前后key比较 相同的在一组 一组去调用一次reduce方法
    join问题
        多个数据之间关联操作
        map端join
        分布式缓存
        reduce端join
    CombineTextInputFormat 处理小文件的类
        默认TextInputFormat  不管多小文件 都是一个切片 都会启动一个maptask
    优化参数
        资源相关的
        容错相关的
        效率稳定性相关的
#2、HDFS 高阶
    namenode元数据管理机制
    secondarynamenode(SNN)职责 checkpoint机制(合并元数据)
​
#重点  all

Hadoop MapReduce

  • MapReduce数据压缩机制

    • 何谓压缩

      使用算法对数据文件进行重新编排的过程。使数据变成整体,降低数据size.
      追求无损压缩。
    • 压缩性能指标

      • 压缩时间

      • 压缩比、压缩率

        压缩率(Compression rate),描述压缩文件的效果名,是文件压缩后的大小与压缩前的大小之比
      • 压缩算法是否免费

    • MapReduce中使用压缩地方

      • map输出的时候(中间输出压缩)

        减少map的输出量 降低shuffle时数据量 减少shuffle IO次数
      • reduce输出的时候(最终输出压缩)

        减少reduce的输出量 降低磁盘的存储空间
    • 压缩的缺点

      消耗时间
      消耗CPU、内存
    • Hadoop支持压缩算法

      • 推荐使用snappy压缩格式

        Snappy 是一个 C++ 的用来压缩和解压缩的开发包。其目标不是最大限度压缩或者兼容其他压缩格式,而是旨在提供高速压缩速度和合理的压缩率
      • 使用snappy压缩需要在hadoop源码编译的时候集成。

    • MapReduce中如何使用压缩

      • 方式1:在代码中使用conf设置 影响本程序

      • 方式2:在集群配置文件中mapred-site.xml中设置 影响集群上所有mr程序。

    • 注意,在当下企业中,直接使用MapReduce编程已经几乎没有了,所有使用MapReduce设置压缩的机会也几乎没有了。但是离线使用Hive进行数据分析,可以设置数据压缩,其底层原理就是今天所讲MapReduce压缩的机制。

  • Hadoop小文件问题

    • 存储角度

      • 文件不管多小,本身都是一个单独的 。都需要一条元数据来记录

      • 小文件吃内存情况。

    • MapReduce计算角度

      • 文件不管多小 本身都是一个切片 都需要一个maptask来处理。

      • 浪费性能 浪费资源

    • 使用CombineTextInputFormat来处理小文件

      • step1: CombineTextInputFormat.setMaxInputSplitSize(job, 4194304); // 4m

      • step2:虚拟存储过程

        将待处理文件和上述设置的值进行比较
        ​
        #1、小于等于 保持不变
        #2、大于超过2倍  根据4M切分
            大于不超过2倍 等分为2
        ​
      • step3:判断每一个切片和4M的大小情况 如果小于和后面的结合参与计算 直到大于4M

  • MapReduce程序可以没有reduce阶段的

    • 只需要将reducetask个数设置为0即可。

      job.setNumReduceTasks(0);
    • 此时,maptask处理完数据之后 就不会进行shuffle了 直接输出结果到磁盘中。

    • 关于MapReduce输出结果文件名称

      #part-r-000000
          r表示是reducetask输出的文件  
          part表示的就是分区
          00000就是分区的标号
      ​
      #part-m-000000
          m表示是maptask输出的文件 
          part表示的就是切片
          00000就是切片的标号
  • MapReduce中join的问题

    • 适合处理两份数据之间的关联操作

    • 分为map端join(map side join) reduce端join (reduce side join)

    • map端join适合大小表数据 使用分布式缓存技术将小表数据进行缓存

    • 没有shuffle阶段 没有reducetask.

    • 当下企业实战中 没有之间编写MapReduce处理join问题 但是后面使用数仓软件Apache hive,需要使用join进行数据处理 并且涉及到join优化,其底层的原理就是mapreduce join.


MapReduce 优化参数

  • MapReduce程序运行是由很多参数支撑的 大多数都是以默认的形式默认值存在。

  • 需要进行优化调整的时候 用户可以进行重新定义覆盖。

  • 默认的参数在哪里。 xxxx-defult.xml中。

  • 用户设置的参数

    • 代码中使用conf.set

    • mapred-site.xml 放置工程classpath下 也就是resources目录下。

  • 容错 failover

    • 所谓的容错指的是容忍错误的发生。说的再直白一点,发生了错误,对程序也没有影响。

    • 容错主要可以解决单点故障问题,让问题错误的发送不至于影响正常的执行。

  • 推测执行机制

    • 找出拖后腿的task

    • 启动备份task 两者同时处理同一份数据

    • 谁先处理完 谁的结果作为最终结果。

    • 企业中建议关闭该机制。


HDFS高阶

  • namenode元数据

    • 元数据是什么

      元数据(Metadata),又称中介数据、中继数据,为描述数据的数据(data about data),主要是描述数据属性(property)的信息,用来支持如指示存储位置、历史数据、资源查找、文件记录等功能。
      ​
      #记录数据的数据 描述数据的数据
    • hdfs中元数据指的是什么

      • 文件系统的元数据(namespace、块的位置)

      • datanodes状态信息(健康、磁盘使用率)

  • 回想首次启动HDFS集群的时候 进行format操作

    • 本质就是初始化操作 初始化namenode工作目录和元数据文件。

    • 元数据存储的目录由参数dfs.namenode.name.dir决定 在NN部署机器的本地linux文件系统中

      针对课程环境 最终目录
      ​
      /export/data/hadoopdata/dfs/name
  • secondarynamenode

    • 要想成为namenode的备份 需要具备两个东西

      • 数据状态要和namenode保持一致。

      • 承担和namenode一样的职责

    • secondarynamenode根本不是namenode的备份,其主要职责帮助nameNode进行元数据的合并。


 

你可能感兴趣的:(Hadoop,Java基础)