离线课程第四天
课程内容回顾
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是谷歌出品的一种压缩算法,压缩和解压缩速度都会比较快
常见的压缩速率比较
压缩算法 | 原始文件大小 | 压缩后的文件大小 | 压缩速度 | 解压缩速度 |
---|---|---|---|---|
gzip | 8.3GB | 1.8GB | 17.5MB/s | 58MB/s |
bzip2 | 8.3GB | 1.1GB | 2.4MB/s | 9.5MB/s |
LZO-bset | 8.3GB | 2GB | 4MB/s | 60.6MB/s |
LZO | 8.3GB | 2.9GB | 49.3MB/S | 74.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条