hadoop基础

22 篇文章 0 订阅

2003年,The Goole File System -------> HDFS
2004年,MapReduce:Simplified Data Processing On Large Cluster -----> Mapreduce
2006年,BigTable:A Distributed Storage system for Structure Data ----->HBase

HDFS + Mapreduce = Hadoop
Hadoop开源的

Hadoop主要完成两件事,分布式存储和分布式计算。

Hadoop主要由两个核心部分组成:

1.HDFS:分布式文件系统,用来存储海量数据。

2.MapReduce:并行处理框架,实现任务分解和调度。

HDFS采用的是有中心节点的存储方式,前端有一个元数据存储服务器,后端的每个节点只存储一部分数据,客户想问访问数据,首先要去联系元数据节点。

Mapreduce代表了三种东西:

1、它是一个开发api。
2、又是一个运行框架,api写的东西在此平台上运行。
3、它也是一个运行环境,能为此程序的运行提供基础保障。

所以当程序员需要分布式处理程序时:

1、先调用api写代码,将代码运行成多个实例在多个节点上运行,在每个节点上只处理本地的数据。
2、处理后的数据合并起来,如果节点的处理速度不一样,快的还要等慢的(木桶效应),所以运行速度取决于最慢的那个

**map:**将程序映射为多个实例而后在每一个要处理的数据节点上运行的过程。
**reduce:**归约

NN: NameNode,名称节点,存储元数据
DN: DataName ,数据节点,存储数据
SNN: SecondNameNode,辅助名称节点

名称节点数据备份:

本来NN需要做三件事:
(1)更新自己的内存数据,(2)将内存数据写入“追加日志“(3)将日志中的数据与映像文件合并。
一旦NN崩溃:
(1)从磁盘上载入数据, (2)等待每一个数据节点报告自己所持有的数据列表。最终完成文件系统检测。
这就很花时间了。所以我们可以采用辅助名称节点SNN,由SNN不断的将事务日志的信息合并的映像文件中。缩短了一部分时间,但无法从根本上解决问题。后来元数据不再存储于本地内存中,而是找一个共享存储来存放,该共享存储也是基于内存来完成其文件系统的(例如nfs),但是可能会发生脑裂等问题。再后来开始用了zookeeper了。Zookeeper本身就是一种文件系统,自身能特别好的支持分布式应用,也能解决脑裂等问题。因此NN节点可以直接将元数据存储于zookeeper上,SNN的更新操作也向zookeeper发送,这样每一个NN节点可以获得同一份元数据。

默认存三份,基于链式复制机制,任何一个节点故障,都会导致某个数据块节点的副本数据不够了,当副本数量不够时,必须要让元数据节点尽早得知,给它补足副本。所以数据节点不断的向名称节点发送自己地状态信息以及自己所持有地数据块列表。

所以元数据节点记录了两种视图:

一、有多少数据块,这些数据块分布在哪些节点上,(以数据为核心,存储于哪些节点上)
二、哪个DN节点持有哪些数据块(以节点为核心,存放了哪些数据块)

有一个总控节点**(JobTracker,作业追踪器)**,能接受用户运行请求,由此节点决定将此作业划分成几个map,这几个map需要运行在哪个或哪些节点上。
TaskTracke::这些负责运行程序的节点在mapreduce中不叫DN,而是TaskTracker,任务追踪器。

一个hadoop其实是两类集群的结合,数据存储和任务处理

**传统数据处理方案:**程序在哪就把数据加载过去
对于hadoop而言: 数据在哪,就让程序在哪个上面跑,如果该节点上的任务已经满了,则把程序跑在其他节点上,再把数据传过去。

NN和jobTracker没有冲突,可以放在一个节点上,但速度会比较慢

如果节点任务跑满了:

同时可能由很多人提交任务,每个任务可能只是用到一个或者几个节点,每个节点上也只能运行有限个任务。如果存放数据的节点及其副本节点可以跑的任务满了(每个节点上有几个任务槽都是提前定义好的)这时要么等待,要么找一个空闲节点,将数据通过网络传输的到空闲节点上再跑。

**函数式编程:**把一个函数当成另一个函数的参数进行传递,可以嵌套n次。map,fold。

map:接受一个函数为参数,将其应用与列表中的所有元素,从而生成一个结果列表。
fold:flod是将这个结果列表整合起来得到最终结果。

#####mapreduce: mapper,reducer

统计一本书每个单词出现的次数:
mapper: 用于拆分成为单词。如果一本数有500页,每100页为一个单位,则我们需要5个mapper,把整本书拆分成里10000个单词
reducer:
假如有两个reducer:reducer1,reducer2
mapper只能把每个相同的单词发给同一个reducer
reducer1统计结果:this 500 we 300 do 489…
reducer2统计结果:how 3004 old 7889 when 8456…

mapper处理时先将每个单词从文章中以键值(K-V)形式取出来
this 1,we 1,this 1,how 1,we 1,old 1…
同一个键只能发往同一个reducer(shuffle and sort
reducer最终进行统计合并:

所以mapreducer只能处理键值形式的数据,有的任务可能需要mapreducer 多次

mapreduce框架:

1、有一个大数据,将其切割成多块,将内容转换成K-V格式,把这些键值数据发送给mapper,也有可能mapper内部做一些处理再转化成键值,mapper对输入的键值进行处理后输出的也是键值,而且可能不止一个
2、用户提交作业后,什么时候启动mapper,什么时候启动reducer并没有严格的时间限定。一般mapper1结束任务后,reduce才能启动,但是mapper可以中间处理结果数据不断的发送给reducer,如果reducer启动得太晚,mapper先将结果保存起来。Mapper也可以和reducer一块启动,也可以在mapper启动后作业运行到10%,20%,30%…后再启动reducer。
对于mapper来讲,它所处理的中间结果可以在mapper端先合并以后再发送给reducer,这样可以大大减少传输的数据量。

MRv1(Hadoop1)-------> MRv2(Hadoop2)
MRv1:cluster resource manager,Data processing
MRv2:
YARN:Cluster resource manager
MRv2:Data Processing
MR:batch
Tez:execution engine

Resource Manager 资源管理
Nose Manager 管理当前节点

RM:Resource Manager
NM:Node Manager
AM:Appliaction Manager
container:执行mr任务
资源管理与程序运行分开,程序运行有App mast负责
资源分配由RM负责

当一个Client提交一个作业时,RM会问NM有没有空闲的容器来启动一个程序,如果有,则会在节点上启动该程序的主控进程Application master,接下来这个application要怎么运行由App mast分配,如在哪个节点上启动几个Container,App mast会向RM申请(Resource Request),RM将App Mast所请求的Container分配好然后告诉app mast,appcation master就可以使用这Container来运行作业了。每个Container会不断向App Mast报告作业情况,以但运行完成,app mast会向RM报告,由RM收回资源。

partitioner: 决定哪一个key发给哪一个reducer。

这里写图片描述

**combiner:**可以在本地先进行折叠,将折叠后的结果再发送给reducer
由于mapper和reducer可以做一些处理工作,所以输入键和输出键可能不同。但combiner输入键和输出键相同。
这里写图片描述

这里写图片描述

Hadoop MapReduce master = Job Tracker
JobTracker负责分发作业,监控每一个map和reduce,一旦发生故障还需要做出重启决策。如果是一个非常繁忙的系统,jobTracker很容易成为性能瓶颈。
这里写图片描述

Hadoop的发展:
Hadoop1:MRv1(MapReduce version1)

MRv1: Cluster Resource Manager,Data processing

Hadoop2:MRv2(MapReduce version2)

MRv2:
	YARN: Cluster Resource Manager
	MRv2:Data processing
		MR:batch,批处理作业
		Tez:excution engine,提供运行时环境
		
		RM:Resource Manager
		NM:Node Manager

		AM:Application Master
		container:mr任务

这里写图片描述

这里写图片描述
YARN分成两部分:Resource Manager ,Node Manager
这里写图片描述
APP Mstr:当客户端提交一个作业时,Resource Manager 不再单独管理这个作业(map运行在哪,reduce运行在哪等),而是为此作业启动一个App Mstr,App Mstr负责决定map和reduce的启动情况。
container:每一个map和reduce也不再被单独称为MapReduce,而是叫container(容器),作业都在容器内运行。

App Mstr 其实也运行于Container中,只不过它是整个程序的管理者。
Container不断向自己的App Mstr报告自己的状态信息。App mstr不断的向Resource Manager报告自己运行到哪一步了。

运行过程:

客户端提交任务,RM会问有没有空闲容器来运行次任务,有,则去启动此程序的主控进程(App Mstr)。map reduce该怎么运行由App Matr分配。
App mstr向RM请求资源,RM将对方请求的Continer所需的资源分配好
App Mstr就可以使用此Continer运行作业了
在运行过程中Continer不断地向自己的App Mstr反馈作业任务。
一旦作业运行完成,App Mstr会向RM报告,由RM将资源回收。

这里写图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值