- ResourceManager:全局资源管理器,负责和ApplicationMaster交互和资源调度,资源分配
- ApplicationManager:ResourceManager组件,负责接收作业提交,协商启动Container
- Scheduler:ResourceManager组件,负责作业调度(公平调度或容器调度)
- NodeManager:一台机器上的管理者,负责和ResourceManager与ApplicationMaster交互
- ApplicationMaster:与ResourceManager进行协商,与NodeManager一起监视和执行任务
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SwU1saq1-1590335949584)(.\imgs\hadoop架构.png)]
3、Hadoop进程:
1、NameNode:管理元数据和DataNode,处理读写请求
2、DadaNode:负责管理和存储数据
3、ResourceManager:负责资源调度
4、NodeManager:负责和ApplicationMaster和ResourceManager通信和启动监听Container
5、JournalNode:负责管理日志信息
6、ZKFS:负责监听NameNode
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XBQc3UOn-1590335949585)(.\imgs\HDFS的读数据流程.png)]
1、调用distributedFileSystem的open()方法,首先获取文件的位置
2、DistributeFileSystem返回一个FSDataInputStream对象,调用read()方法,
3、FSDataInputStream连接最近的一个DataNode去读取数据
4、读到块的末端时,关闭与DataNode的连接,寻找下一块最佳DataNode
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tvGcE9mH-1590335949586)(.\imgs\HDFS的写数据流程.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-U05DMon6-1590335949586)(.\imgs\MapReduce详细工作流程.png)]
MapReduce粗粒度解释
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mCpr04py-1590335949587)(.\imgs\MapReduce粗粒度过程.png)]
MapReduce实例演示
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MbUVExcP-1590335949587)(.\imgs\MR.png)]
详细解释:
过程:MapTask落地到中间文件到ReduceTask读取这一过程叫做Shuffle (数据分区,排序,局部聚合,缓存,拉取,分组合并)
1、客户端submint()前,会获取待处理数据的信息,然后提交给集群。
2、对于整个流程来说,首先进行FileInputFormat的读入工作,将数据以KV对的形式读入map中进行逻辑处理
3、使用context.write写出到OutputCollector中,并写入到环形缓冲区(KVBuffer)
4、当数据进入环形缓冲区之后,一部分是数据,一部分是索引数据,索引数据和数据朝向两个不同的方向写入,并且索引数据包含(key起始位置,value的起始位置,partition分区(HashPartition),value的长度),会将相同分区的数据进行排序(Key-CompareTo排序)(指map分区)。
5、对于环醒缓冲区里的内容到达80%的时候,会进行SortAndSpill,这里会形成很多小文件,每个小文件是有序的(快排)。
6、然后在进行多个溢写文件的合并(归并),将所有的Segment合并成一个Segment
7、Reduce端通过Http请求copy数据并且聚合。
8、然后写到文件中。
如何进行切片的?
FileInputFormat切片源码解析
1、程序先找到数据存储的目录。
2、开始遍历处理(规划切片)目录下的每一个文件
3、遍历第一个文件ss.txt
获取文件大小fs.sizeOf(ss.txt)
计算切片大小:computeSplitSizee(Math.max(minSize,Math.min(maxSize,blocksize)))=blocksize== 128M
默认情况下,切片大小=blocksize
开始切片,第一个切片128M,。。。。(每次切片时,都要判断切完剩下的部分是否大于块的1.1倍,不大于1.1倍就划分一块切片)
将切片信息写到一个切片规划文件中
整个切片的核心过程就是在getSplit()方法中完成的
InputSplit只记录了切片的元数据信息,比如起始位置、长度以及所在的节点列表等
4、提交切片规划文件到YARN上,YARN上的MRAppMaster就可以根据切片规划文件计算开启MapTask个数。
FileInputFormat切片机制
1、切片机制
简单地按照文件的内容长度进行切片
切片大小,默认等于Block大小
切片时不考虑数据集整体,然后逐个对每一个文件单独切片。(一个数据集可以有多个文件,但是这里只是以文件为个体,进行切分)
切片大小的参数配置
1、源码中的计算切片大小的公式
Math.max(minSize,Math.min(maxSize,blockSize));
mapreduce.input.fileinputformat.split.minsize=1 默认值为1
mapreduce.input.fileinputformat.split.maxsize=long.MAXValue 默认值LongMAXValue
因此,默认情况下,切片大小=blocksize.
2、切片大小设置
maxsize(切片最大值):参数如果调的比blockSize小,则会让切片变小,而且就等于配置的整个参数的值。
minsize(切片最小值):参数调的比blockSize大,则可以让切片变的比blockSize还大。
3、获取切片的信息API:
//获取切片的文件名称
String name = inputSplit.getPath().getName();
//根据文件类型获取切片信息
FileSplit inputSplit = (FileSplit) context.getInputSplit();
Map个数由什么决定?:
Split:Map=1:1
Reduce个数由什么决定?:
可以设定mapred.tasktracker.map.task.maximum和mapred.tasktracker.reduce.task.maximum属性的值来指定map和reduce的数量。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FxMhgkGy-1590335949589)(.\imgs\ReduceTask个数决定.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dhN2jKLD-1590335949589)(.\imgs\MR优化之Combiner.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9L9gRQ57-1590335949590)(.\imgs\MR优化之compress1.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UPtFucWW-1590335949592)(.\imgs\MR优化之compress2.png)]
Hadoop是一个免费开源框架,能够部署在低成本服务器上,用于储存大量数据,并发处理/查询集群上的数据
组件包括:HDFS,MapReduce,Yarn
HDFS:有高度容错能力,提供高吞吐量的访问
MapReduce:是一个计算引擎,并行处理集群上的大量数据
Yarn:调度系统,将资源分配给各种正在运行的应用程序
举例:
设想一下这样的应用场景. 我有一个100M 的数据库备份的sql 文件.我现在想在不导入到数据库的情况下直接用grep操作通过正则过滤出我想要的内容。例如:某个表中含有相同关键字的记录,有几种方式,一种是直接用linux的命令 grep 还有一种就是通过编程来读取文件,然后对每行数据进行正则匹配得到结果好了
现在是100M 的数据库备份.上述两种方法都可以轻松应对.那么如果是1G , 1T 甚至 1PB 的数据呢 ,上面2种方法还能行得通吗? 答案是不能.毕竟单台服务器的性能总有其上限.那么对于这种 超大数据文件怎么得到我们想要的结果呢?有种方法 就是分布式计算, 分布式计算的核心就在于 利用分布式算法 把运行在单台机器上的程序扩展到多台机器上并行运行.从而使数据处理能力成倍增加.但是这种分布式计算一般对编程人员要求很高,而且对服务器也有要求.导致了成本变得非常高.Hadoop 就是为了解决这个问题诞生的.Hadoop 可以很轻易的把很多linux的廉价pc 组成分布式结点,然后编程人员也不需要知道分布式算法之类,只需要根据mapreduce的规则定义好接口方法,剩下的就交给Haddop. 它会自动把相关的计算分布到各个结点上去,然后得出结果.例如上述的例子 : Hadoop 要做的事 首先把 1PB的数据文件导入到 HDFS中, 然后编程人员定义好 map和reduce, 也就是把文件的行定义为key,每行的内容定义为value , 然后进行正则匹配,匹配成功则把结果 通过reduce聚合起来返回.Hadoop 就会把这个程序分布到N
个结点去并行的操作.
大数据量存储:分布式存储(各种云盘,百度,360~还有云平台均有hadoop应用)
日志处理: Hadoop擅长这个
海量计算: 并行计算
ETL:数据抽取到oracle、mysql、DB2、mongdb及主流数据库
使用HBase做数据分析: 用扩展性应对大量读写操作—Facebook构建了基于HBase的实时数据分析系统
机器学习: 比如Apache Mahout项目(Apache
Mahout简介 常见领域:协作筛选、集群、归类)
搜索引擎:hadoop + lucene实现
数据挖掘:目前比较流行的广告推荐
大量地从文件中顺序读。HDFS对顺序读进行了优化,代价是对于随机的访问负载较高。
用户行为特征建模
个性化广告推荐
智能仪器推荐
ache
Mahout简介 常见领域:协作筛选、集群、归类)
搜索引擎:hadoop + lucene实现
数据挖掘:目前比较流行的广告推荐
大量地从文件中顺序读。HDFS对顺序读进行了优化,代价是对于随机的访问负载较高。
用户行为特征建模
个性化广告推荐
智能仪器推荐
### 3、Hadoop的优缺点:
### 4、重要设置参数: