补充讲解:Maven相关知识—含如何将jar包引入到maven项目当中来
简单回顾
第一次课:主要是解决环境的问题
windows的环境以及linux的环境的问题
可以开始愉快的写bug了
hdfs的课程:分布式的文件存储系统
主要是干嘛的,存储文件的
hdfs需要掌握到什么样的程度:最简单,熟练能够写hdfs的javaAPI以及hdfs的shell命令即可
hdfs的读写流程:面试之前回来好好背一背即可
面试是可以突击的,但是代码的功底没法突击
平时一定要多写代码
Mapreduce的分布式计算系统
1. mapreduce的定义
- mapreduce奠定了分布式计算系统的框架:后期的spark,flink等等所有的分布式计算的框架,都是类似于mapreduce
-
2. mapreduce的核心思想
核心的思想:分治 分而治之
- 将一份太大的计算任务,分解成为很多个小的计算任务,最后合并所有的任务结果,得到最后的结果
- 适用于一些可以分解的任务:大部分任务都是非常适合分解成为小任务的
- 如果不适合分解的任务,没法进行并行的计算
3. MapReduce编程模型
分布式计算主要分为两个步骤:
- map阶段:主要负责分开,将大任务分开成为一个个的小任务
- reduce阶段:负责合并,将每一个小任务的结果进行合并成为最终的结果
MapReduce是一个分布式的计算框架,别人已经给你定义好了每一步可以做什么事情,你需要往框架里面填写内容给即可
移动计算
- 移动计算比移动数据便宜:尽量选择在数据的机器上面启动任务
- 数据在哪一台机器,就在哪一台机器启动计算的任务
Q:block多个副本 怎么选择呢
A:选择客户端最近的,选择心跳比较鲜活的节点,集群资源比较空闲的节点
4. mapreduce编程指导思想
mapreduce的编程模型:主要有八个步骤
1、读取文件,解析成为key,value对 ===》 k1 v1
2、自定义map逻辑,接收k1,v1转换成为新的k2 v2进行输出
3、分区:使用的是k2 v2的数据
4、排序:使用的是k2 v2的数据
5、规约 combine:使用的是k2 v2的数据
6、分组:使用的是k2 v2的数据 相同key的数据进行合并,value形成一个集合
7、自定义reduce逻辑,接收k2 v2,转换输出新的k3 v3
8、将最终的结果输出保存k3 v3到外部一些系统当中,例如 hdfs mysql
尽量背下来
通过编程来实现最简单的单词计数的统计
八个步骤里面三个key,value对贯穿始终,一定要想清楚,每个key,value对类型
主要就是在定义三个key,valued对的类型
彭龙:在idea里执行和在linux上执行有什么不一样呢
idea是适用于本地的调试,
linux适用于线上的运行的环境
金城:1个并行度嘛
并行度就是task的个数的问题,后面会将得到
老李:如果本地没装hadoop是不是就不能用idea在本地调试了?只能直接上传到集群跑吗
是滴
徐伟:是懂非懂 ,自己参考开发一次,才能理解
自己写一遍代码
薛斌:能不能举例一个场景,这个干嘛的?
最早写了一个爬虫,抓取很多的网页,网页之间的关联性 pageRank如何进行计算
使用的就是mr的程序
也无风雨也无晴:从代码看 感觉第7步 接收的时K3 V3呢?
小兔弗雷迪:reduce拉取的时候才产生shuffle,然后分区排序combine分组
shuffle又可以进一步的细分:有些步骤是在map端执行的,有些步骤是在shuffle之后执行的:分组
分区,排序,规约combine都是在map端执行的
然后进行shuffle网络拷贝
然后执行分组
一支穿云箭:聚合只在reduce过程发生
melo:分区的依据是什么
默认使用的是HashPartitioner
并行度的问题:
mapTask的个数:如何决定的 由数据的切片来决定的
一个切片默认对应一个block块
block块是hdfs的一个概念:
切片是mapreduce当中的概念
默认切片的个数与block快的个数一一对应的
如何计算有多少个切片的
getSplits 获取所有的切片 ==》 根据切片的个数启动对应的mapTask
//确定每一个切片的大小
long blockSize = file.getBlockSize(); //获取block快的大小 128M
dfs.blocksize
134217728
//怎么计算的
blockSize = 128
minSize = 1
maxSize = 9223372036854775807L
long splitSize = this.computeSplitSize(blockSize, minSize, maxSize);
源码当中,切片的大小,默认就是跟block快的大小一致
如何调整切片的大小 通过这两个属性配置可以进行调整切片的大小
mapreduce.input.fileinputformat.split.minsize
mapreduce.input.fileinputformat.split.maxsize
涂伟鹏:一个单位是M,一个单位是L,怎们比较的
最后得到的结果是一个数值 ==》 128 确定切片的大小是128 单位是M
、
mapTask的个数,跟block块有关的
并不是maptask越多越好,也不是mapTask越好
每个mapTask处理的数据尽量是block快的大小
10个文件
每个文件都是1kb 占用多少个block块???10个block块 ===》 启动10个mapTask ==》 这样合不合理???
a.txt
b.txt
c.txt…….
可以进行小文件的合并
hdfs集群对小文件深恶痛绝:小文件占用大量的namenode的元数据信息 分布式计算的时候,小文件会启动大量的mapTask不合理
马晓环:每个task启动一个线程吗?
task都是现成,每个mapTask或者每个reduceTask都是一个线程
mapTask的个数的控制
老李:可以设置多个文件放在一个block里面吗?
不行
徐伟:L是什么单位
java当中的Long类型的数据
reducetask的个数:如何决定的
陈超:一个128M的block存了一个1k的文件,那这个block占多少空间啊
占用1kb
自定义输入,比较麻烦,了解一下
徐伟:刚刚看到的就是合并之后的文件吗?
对的
合并之后的三个文件的内容,到了一个大的文件里面去了
fileSplit 拿到了文件的切片,就可以拿到文件的内容 通过IO流的操作,可以将数据写入到字节数组里面去
也无风雨也无晴:晕车了
正常,习惯就好
mr八个步骤
第一步:读取文件,解析成为key,value对 ==》可以自定义
第二步:自定义map逻辑 一直在自定义
第三部:分区: 分区决定了数据分发到哪一个reduceTask里面去 有默认的分区的组件,也可以自定义分区规则
分区决定了哪些数据去往哪一个reduceTask
默认的分区类是HashPartitioner
可以自定义分区
public class HashPartitioner
/* Use {@link Object#hashCode()} to partition. /
public int getPartition(K key, V value,
int numReduceTasks) {
return (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks;
}
}
key:指代的是k2
return (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks;
numReduceTasks:reduceTask的个数 例如reduceTask的个数是5
job.setNumReduceTasks(5);
(key.hashCode() & Integer.MAX_VALUE) 得到的一定是一个正整数 % numReduceTask = 5 ====> 得到的结果只有可能是 0 - 4
200 % 5 = 0
201 % 5 =1
202% 5 =2
203 % 5 = 3
204 % 5 = 4
205 % 5 =0
老李:这hash之后的key和max int取& 不就是hash之后的key不变吗?
每次输入的key都是不一样的,如果key不一样,hash之后的结果也不一样
将数据分区到6个reduceTask里面去 ,每个reduceTask对应输出一个文件
一支穿云箭:对啊,这个分区没有处理数据倾斜吧
郑续才:谢谢谢谢,加油老王还真的1分钟都不拖堂的节奏
刘珍华:key value 场景案例设计 很多场景都是需要提前考虑好key,value的类型
求共同的好友,求pageRank等等,数据的处理等等
刘珍华:工作,怎么用的 根据实际的需求,进行数据的预处理,例如点击流日志数据的预处理
鱼苗:不如这个自己写?
老李:那为啥要取&呀,直接取hash的结果不可以吗
可以的,没问题
Angus:reduceTask会不会爆满 不会的,可以有很多reduceTask
金城:忘了&怎么算了
也无风雨也无晴:如果压缩文件大于blocksize 怎么搞
block无论如何都可以进行切开的,但是切片不一定能够切开的
徐伟:分区是什么意思啦,为什么要分区呀!
确定数据发送到哪一个reduceTask里面去
胡婷:reducetask的个数也是通过block块决定的吗
job.setNumReduceTasks来设置的
马晓环:当然不是
鱼苗:&int最大值就是截取32位
自定义输入,自定义map
自定义分区
也无风雨也无晴:那切片不能切 怎么处理呢?
读取的时候,一个mapTask读取整个文件的内容
老李:直接整个读进来
马晓环:mapreduce现在实际应用还多吗?、
不多,没人用了
Angus:概念还得多捋捋
金城:他说超过256
多分几个block即可
也无风雨也无晴:切片的大小不是和block大小一样么
前提是文件可以进行切片
小兔弗雷迪:hadoop 就三次课吗?
四次课
下次还有没有什么想要补课的???
可以在群里面讨论,确定了告诉我
一支穿云箭:gradle
马晓环:linux扫扫盲呗
安排
小灿:linux扫盲+1
刘珍华:不可切发的大文件,maptask个数怎么计算
一个文件就是一个mapTask
郝鑫磊:如何把javase中的语法转换成项目代码
主要是面向对象的思想
Q&A
Q:我数据库还卡在这里::ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/tmp/mysql.sock’
A:mysql安装有问题,或者就是权限的问题
Q:spring都换gradle了
A:gradle跟maven类似的
Q:一定要改local repository?用默认的user/.m2 会有什么问题?
A:使用默认的,就是会占用C盘的空间