补充讲解:Maven相关知识—含如何将jar包引入到maven项目当中来

简单回顾

第一次课:主要是解决环境的问题
windows的环境以及linux的环境的问题
可以开始愉快的写bug了

hdfs的课程:分布式的文件存储系统
主要是干嘛的,存储文件的
hdfs需要掌握到什么样的程度:最简单,熟练能够写hdfs的javaAPI以及hdfs的shell命令即可
hdfs的读写流程:面试之前回来好好背一背即可

面试是可以突击的,但是代码的功底没法突击
平时一定要多写代码

Mapreduce的分布式计算系统

推荐:分布式计算模型MapReduce 基础知识点

1. mapreduce的定义

  • mapreduce奠定了分布式计算系统的框架:后期的spark,flink等等所有的分布式计算的框架,都是类似于mapreduce
  • 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 extends Partitioner {

/* 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盘的空间