【Hadoop学习笔记】


Hadoop概述

Hadoop 官网

Hadoop的核心分为MapReduce、HDFS、YARN。

Hadoop生态还包括ZooKeeper(分布式协调服务)、HBase(分布式列式数据库)、Hive(数据仓库工具,进行数据整理、特殊查询、分析存储等)、Pig(更简单抽象的过程语言,查询大型半结构化数据集)、Mahout(数据挖掘)、Flume(日志管理系统)、Sqoop(Hadoop和关系数据库之间交换数据)、Ambari(基于web的集群管理)。

MapReduce 是一个高性能的分布式计算框架,用于对海量数据进行并行分析和处理,是对谷歌MapReduce的开源实现;

HDFS(Hadoop Distributed File System)是面向普通硬件环境的分布式文件系统,具有较高的读写速度、很好的容错性和可伸缩性,支持大规模数据的分布式存储,是对谷歌文件系统(Google File System)的开源实现;

YARN是Hadoop2.0版出现的分布式资源管理调度框架。


MapReduce概述

MapReduce的核心思想是“分而治之”:把输入的数据块切分为若干独立的数据块,分发给一个主节点管理下的各个分节点来共同并行完成;最后整合各个节点的中间结果得到最终结果。

一个重要的设计思想是“计算向数据靠拢”:将Map程序就近地在HDFS数据所在的节点运行。(因为移动数据需要大量的网络传输开销,尤其是大数据环境下)

MapReduce 优点

· MapReduce适合于离线计算/批处理
· MapReduce编程对于自己实现分布式而言是要简单的
· 扩展性强,可以横向添加机器,来增加计算能力
· 处理的数据量可以很大
· 容错性能比较高

MapReduce缺点

· Task都是以进程级别运行,进程开启关闭需要时间,MapReduce总体运行速度会比较慢
· MapReduce不适合实时处理

MapReduce大致流程:

(1)输入:InputFormat模块做Map前的预处理,比如验证输入的格式是否符合输入定义;然后将输入文件切分为逻辑上的多个InputSplit。InputSplit是一个逻辑概念,记录了要处理数据的位置和长度。RecordReader收集分片split数量,配置文件打成的jar包地址等信息,形成一个个<key,value>传给Map。

(3)Map阶段:根据用户自己定义的映射规则形成map任务,输出一系列的<key,value>作为中间结果传到环形缓冲区。

(4)Shuffle阶段:将Map阶段传入的<key,value>进行分区(Partition)、排序(Sort)、合并(Combine)、归并(Merge)等操作之后得到<key,value-list>形式的中间结果,再交给Reduce任务处理。

(5)Reduce阶段:将<key,value-list>作为输入,执行用户自己定义的逻辑生成的reduce任务,输出结果提交给OutputFormat模块。

(6)输出:OutputFormat模块会验证输出目录是否已经存在,以及输出结果类型是否符合配置文件中的配置类型,如果都满足,就输出Reduce的结果到分布式文件系统。

举一个简单的例子:

假设需要调查某省某市甲乙两条商业街的人流量性别情况,假如人流量数据分布式存储于两个节点,且由两个Map节点,两个Reduce节点处理。

split过程本情景下的split过程很简单,以不同商业街为区别进行数据的切分。甲商业街对应map节点1,乙商业街对应map节点2。

Map过程首先会在每个节点分别扫描数据,以性别为key值分辨,每扫描到一次生成一对<key,value>,其value值为1,假设结果如下:

Map节点1

性别(key)出现(value)
1
1
1
1
1
1
1
1
1
1

Map节点2

性别(key)出现(value)
1
1
外星人1
外星人1
1
1
外星人1
1
1
1

此时我们需要思考一个问题,Reduce节点有两个,Map节点怎么知道将这些中间数据交给哪个Reduce节点呢?
这里会用到分区机制,Map节点会根据key的值取哈希码,然后模掉Reduce节点的个数(这里是模2)取余数作为分区号。这里有两点需要说明:

我们并不在意这里产生哈希冲突,只要保证相同的key分配到同一个Reduce节点就可以,而哈希值取模完全可以做到。
实际过程中,Map节点会将数据排序,把相同的key放到一起,主要是为了Reduce节点拉数据时的效率更高。
最终同步给Reduce节点的中间数据会变成:

Map节点1

性别(key)出现(value)区号
10
10
10
10
11
11
11
11
11
11

Map节点2

性别(key)出现(value)区号
10
10
10
11
11
11
11
外星人10
外星人10
外星人10

combine过程

Map节点1

性别(key)出现(value)区号
40
61

Map节点2

性别(key)出现(value)区号
30
41
外星人30

Reduce过程,此时Reduce节点可以根据分区号计算所需数据,分区号为0的给第一个节点,分区号为1的给第二个节点:

Reduce节点1

性别(key)出现(value)区号
40
30
外星人30

Reduce节点2

性别(key)出现(value)区号
61
41

接下来,我们让Reduce节点将相同的key合并起来,合并时将value求和,Mapreduce会提供相关的api,于是两个Reduce节点分别输出最终的文件:

Reduce节点1

性别(key)出现(value)
7
外星人3

Reduce节点2

性别(key)出现(value)
10

接下来就可以把这个数据传到省数据中心,与其他市的数据进行新的mapreduce模型计算了!


HDFS概述

HDFS(Hadoop Distributed File System)针对GFS(Google File System)的开源实现。分布式文件系统是一种通过网络实现文件在多台主机上进行分布式存储的文件系统,其设计一般采用客户机/服务器(Client/Server)模式,同时搭建计算机集群,设定“主节点(Master Node)”/“名称节点(Name Node),“从节点(Slave Node)/数据节点(Data Node)”来管理文件。

HDFS的优点

· 兼容廉价的硬件设备

· 流数据读写

· 大数据集

· 简单的文件模型

· 强大的跨平台兼容性

HDFS的缺点

· 不适合低延迟的数据访问

· 无法高效存储大量小文件

· 不支持多用户写入及修改文件

HDFS的数据读写过程

读数据

(1)打开文件:客户端通过FileSystem.open()(在HDFS中DistributedFileSystem具体实现了FileSystem,创建了输入流FSDataInputStream)向NameNode请求打开文件。

(2)查找数据:NameNode通过查询元数据,找到文件块所在的DataNode地址,并返回地址给客户端。

(3)读取数据:客户端调用read()方法挑选一台DataNode(就近原则,然后随机)服务器,建立连接并读取数据。DataNode开始传输数据给客户端(从磁盘里面读取数据输入流,以packet为单位校验)。

(4)接收数据:客户端以packet为单位接收,先在本地缓存,然后写入目标文件;该数据块读取完毕后FSDataInputStream关闭和该数据节点的连接

(5)重复步骤3~4:输入流通过getBlockLocations()方法查找下一个数据块所在的最佳数据节点并读取数据。

(6)关闭输入流:调用FSDataInputStream的close()方法,关闭输入流。

写数据

(1)创建文件:客户端通过FileSystem.create()创建文件(在HDFS中DistributedFileSystem具体实现了FileSystem,创建了输出流FSDataOutputStream)。

(2)写入前的准备:DistributedFileSystem通过 RPC 与 NameNode 建立通讯,NameNode 检查目标文件是否已存在,父目录是否存在,返回客户是否有权创建文件。通过检查后NameNode进行计算,选择副本存储节点,第一个选择的是本地节点,第二个选择的是相同机架的另一个节点,第三个是其他机架的一个节点(默认三个副本存储节点)。并把这三个节点返回给客户端(dn1、dn2、dn3)。
(3)写入数据:在dn1、dn2、dn3建立数据流管道(pipeline)后,客户端调用输出流的write()方法向HDFS中对应的文件写入数据。
(4)传输数据:写入的数据文件被分割成一个个block(128MB)放入FSDataOutputStream的对象的内部队列,单个block以packet为单位(默认64KB)从dn1开始依次传给pipeline上的节点。

(5)响应传输成功:DataNode收到数据后在 pipeline 反方向上,逐个向节点发送 ack packet(ack 应答机制),最终由pipeline中第一个 DataNode节点dn1将 ack 发送给客户端;
(6)重复步骤3~5:当一个 block 传输完成之后,客户端再次请求 NameNode 上传第二个 block 到服务器。

(7)关闭输入流:客户端调用close()方法关闭输入流。


YARN概述

YARN是资源管理框架,将资源管理与计算任务解耦。对于任何的计算框架,不论是mapreduce或者spark,只需要实现YARN的接口,即可完成资源管理。所有的计算框架只需专注于自身的计算逻辑,无需关心资源的使用,统一交由YARN管理,这样不会发生资源争抢。此处所说的资源不仅仅指的hdfs存储的数据资源,也包括启动计算进程所需要的各种资源(如cpu,内存等),YARN会统一管理这些资源,实现“一个集群多个框架”的目标。

YARN的体系结构

YARN体系结构中包含了三个组件:ResourceManager、ApplicationMaster、NodeManager。

ResourceManager

​ · 处理客户端请求

​ · 启动/监控ApplicationMaster。

​ · 监控NodeManager

​ · 资源分配与调度

ApplicationMaster

​ · 为应用程序资源,将资源二次分配给内部的各个任务

​ · 与NodeManager保持交互通信,任务调度、监控与容错。

NodeManager

​ · 单个节点上的资源管理

​ · 处理来自ResourceManager的命令

​ · 处理来自ApplicationMaster的命令

在这里插入图片描述

YARN的工作流程

(1)用户申请:用户编写客户端应用程序,向YARN提交应用程序,提交的内容包括ApplicationMaster程序、启动ApplicationMaster的命令、用户程序等。

(2)分配容器:YARN中的ResourceManager负责接收和处理来自客户端的请求。接到请求后ResourceManager里的调度器会为应用程序分配一个容器,同时ResourceManager里的应用管理器会和容器所在的NodeManager通信,为应用程序在容器中创建一个ApplicationMaster。

(3)注册状态:ApplicationMaster被创建后会先向ResourceManager注册,使得用户可以通过ResourceManager直接查看应用程序的运行状态。

(4)申请资源:ApplicationMaster采用轮询的方式通过RPC协议向ResourceManager申请资源。

(5)分配资源:ResourceManager以容器的形式分配资源,一旦ApplicationMaster申请到资源就会与该容器所在的NodeManager通信,要求它启动任务。

(6)启动任务:当ApplicationMaster要求容器启动任务时,它会为任务设置好运行环境(包括环境变量、JAR包、二进制程序等),然后将任务启动命令写到一个脚本中,最后通过在容器中运行该脚本来启动任务。

(7)监测状态:各个任务通过某个RPC协议向ApplicationMaster汇报自己的状态和进度,让ApplicationMaster可以随时掌握各个任务的运行状态,从而可以在任务失败时重新启动任务。

(8)关闭任务:应用程序完成后,ApplicationMaster向ResourceManager的应用程序管理器注销并关闭自己。若ApplicationMaster因故失败应用程序管理器会监测到失败的情形,然后将其重新启动,直到所有任务执行完毕。

文章来自平时学习的整理,侵删

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值