04-map reduce的原理及过程详解

离线课程第四天

课程内容回顾

1、hdfs的详细的介绍

2、hdfs的设计目标

3、hdfs的来源

4、hdfs的架构图 得要知道

​ namenode:主节点,

​ datanode:从节点

​ snn:辅助namneode管理元数据信息

5、hdfs的副本机制以及block块存储

6、hdfs的元数据管理

​ fsimage:一份比较完整的元数据信息。内存 + 磁盘

​ edits:最近一段时间的操作日志(包括最近一段时间的元数据信息)

​ snn:合并fsimage与edist文件,避免edits文件会膨胀太大

​ 合并的过程得要知道

​ 第一步:snn通知namenode准备切换edits文件

​ 第二步:snn通过http的方式获取fsimage与edits

​ 第三步:将fsimage与edist文件加载到内存当中。进行合并

​ 第四步:将合并之后新的fsimage发还给namendoe替换掉旧的fsimage

​ 合并的触发条件:edits文件大小64M 时间长短3600S

7、hdfs的写入数据的过程

​ 第一步:客户端请求上传文件

​ 第二步:namenode校验客户端的权限,以及文件是否存在

​ 第三步:客户端请求namenode第一批文件的block块

​ 第四步:namenode寻找离客户端比较近,比较鲜活的,磁盘比较空闲的机器,返回给客户端block块的地址

​ 第五步:客户端 拿到block块的地址与datanod建立pipeline管道连接,数据以packet的方式往datanode上面写入数据

​ 第六步:循环依次写入,直到数据上传完成为止

8、hdfs的文件的读取的过程

​ 第一步:客户端请求读取文件

​ 第二步:namenode校验客户端的权限,数据是否存在,校验通过,返回第一批block块的地址给客户单

​ 第三步:客户端拿到block块之后,与datanode建立通信连接,开始读取数据

​ 第四步:所有的数据全部读取完成,在客户端进行文件的拼接

9、hdfs的javaAPI操作 基本常识 掌握

10、mapreduce分布式文件计算系统

mapreduce核心思想:分治 分而治之

mapreduce八个步骤:

map阶段两个步骤

​ 第一步:读取文件,解析成key,value对 k1 v1

​ 第二步:自定义map逻辑,接收k1 v1 准换成新的 k2 v2 输出

shuffle阶段四个步骤

​ 第三步:分区。相同key的数据,发送到同一个reduce里面去,key合并,value形成一个集合

​ 第四步:排序

​ 第五步:规约

​ 第六步:分组

reduce阶段两个步骤

​ 第七步:自定义reduce逻辑,接收k2 v2 转换成新的k3 v3 进行输出

​ 第八步:输出k3 v3

wordCount的单词计数统计

sql语句

今日课程内容

1、分区以及reduceTask的个数

分区:主要的作用就是决定我们数据去到哪一个reduceTask里面去

物以类聚,人以群分。相同key的数据发送到同一个reduce里面去

csv格式的数据可以直接被excel加载。excel是一个很强大的数据库。excel里面有很多的函数,日期,时间,金额,求最大值,求最小值,平均值

比较早的时候,很多做数据统计的人都是使用的excel。excel可以出各种统计图表。

2、排序以及序列化

序列化:是为了实现网络之间的数据传输。hadoop当中,没有沿用java的那一套序列化,使用自己封装的一套序列化机制。所有的数据类型,都需要实现序列化,才可以实现跨网络传输

hadoop当中的序列化接口叫做writable,只要实现了writable就可以实现序列化

Writable:hadoop当中序列化的接口
Comparable :javaSE当中的排序的接口

如果我们只需要序列化:实现writable即可
如果既需要序列化也需要排序:实现  WritableComparable
默认排序规则是对k2  进行排序。以后记住:需要对谁进行排序就把谁作为k2  

a	1
a	9
b	3
a	7
b	8
b	10
a	5
a	9



排序需求:先对第一列进行排序,如果第一列相等了,再对第二列进行排序

a	1
a	5
a	7
a	9
a	9

b	3
b	8
b	10

二级排序:

两个字段都要进行排序,两个字段都要作为我们K2 。可不可以将两个字段封装成一个javaBean,作为我们k2

javaBean需要序列化 要排序 javaBean 实现 WritableComparable 即可

3、mapreduce当中的计数器

计数器主要是mr当中提供给我们的一个计数的工具

mapreduce当中的一个调优的手段

4、mapreduce当中的规约的过程

规约是我们的第五步:mapreduce当中的调优的过程,主要是为了减少发送到redcue端key2的数据量,提前在每个maptask数据的数据进行一次聚合

输入

map

分区

排序

规约:mapreduce当中调优的手段。combiner就是一个reducer的程序、combiner是运行在map端的一个reduce程序,reducer是真正运行在reduce端的一个程序

分组

reduce

输出

一个reduceTask对应一个输出文件

如果显示的手动指定分区号,并且reduceTask的个数大于分区的个数,就会产生空文件

reduceTask的个数可以大于分区的个数

如果显示的手动指定分区号,并且reduceTask的个数小于分区的个数,会报错

如果显示的手动指定分区号 ,reduceTask的个数要大于等于分区的个数

@Override
    public int getPartition(Text text, FlowBean flowBean, int i) {
        String phoneNum = text.toString();
        if(phoneNum.startsWith("135")){
            return 0;
        }else if(phoneNum.startsWith("136")){
            return 1;
        }else if(phoneNum.startsWith("137")){
            return 2;
        }else if(phoneNum.startsWith("138")){
            return 3;
        }else if(phoneNum.startsWith("139")){
            return 4;
        }else {
            return 5;
        }

如果分区的规则这样写,分区的个数会有多少个????

如果这样定义我们的分区规则,那么我们reduceTask的个数永远不可能小于分区的个数

/** Use {@link Object#hashCode()} to partition. */
  public int getPartition(K key, V value,
                          int numReduceTasks) {
    return (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks;
  }

4、maptask的运行机制以及maptask的并行度

默认一个block块对应一个maptask

如果不配置以下两个属性,那么我们文件的切片的大小,默认就是block块大小 128M

mapred.min.split.size

mapred.max.split.size

5、reduce阶段的运行机制以及reducetask的并行度

6、mapreduce的整个的执行流程

1、maptask的个数:取决于block块的个数

2、reducetask的个数:job.setNumReduceTasks(2)

3、环形缓冲区大小:100M

4、溢写的比例:80%

5、排序:两个地方都有排序

​ map阶段的数据排序:局部的排序,每个maptask内部的数据会进行排序

​ reduce阶段的数据排序:全局的排序,针对每个reudcetask的内部 的排序

7、数据的压缩

snappy是谷歌出品的一种压缩算法,压缩和解压缩速度都会比较快

常见的压缩速率比较

压缩算法原始文件大小压缩后的文件大小压缩速度解压缩速度
gzip8.3GB1.8GB17.5MB/s58MB/s
bzip28.3GB1.1GB2.4MB/s9.5MB/s
LZO-bset8.3GB2GB4MB/s60.6MB/s
LZO8.3GB2.9GB49.3MB/S74.6MB/s

以上常见的压缩算法都没有snappy快,压缩和解压缩的速度都没有snappy快,实际工作当中,压缩算法没得选,就是snappy

课程总结

1、mapreduce的分区以及reducetask的个数

自定义分区:显示的指定分区号,根据reducetask的个数动态的获取我们分区个数

如果是显示的指定分区号,reducetask的个数 大于等于分区的个数

根据reducetask的个数动态的来进行获取:reduceTask 3

2、排序以及序列化

​ 自己封装了一套序列化规则

​ 如果要序列化:Writable

​ 如果既要序列化,也要排序:WritableComparable

二次排序 尽量搞定

​ 对谁排序,就把谁作为k2

-如果多个字段都要排序,将多个字段封装成javaBean

3、mapreduce当中的计数器 了解

4、mapreduce当中的规约 combiner 知道 优化的过程,

​ 减少发送到reducetask的key2的数据量

5、mapreduce综合练习:手机上网流量综合练习

6、maptask,reducetask以及mapreducetask的运行机制 流程尽量背下来

7、数据的压缩:

​ snappy的数据压缩方式,如何支持snappy重新编译hadoop

8、更多编程案例

​ reduce 端join

​ map端join:

sql语句 2条

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值