赞
踩
狭义上Hadoop指的是Apache软件基金会的一款开源软件。
用java语言实现,开源。
Hadoop核心组件:
Hadoop HDFS(分布式文件存储系统):解决海量数据存储。
Hadoop YARN(集群资源管理和任务调度框架):解决资源任务调度。
Hadoop MapReduce(分布式计算框架):解决海量数据计算。
广义上讲Hadoop指的是Hadoop大数据生态圈。
HDFS作为分布式文件存储系统,处在生态圈的底层与核心地位;
YARN作为分布式通用的集群资源管理系统和任务调度平台,支持各种计算引擎(如:spark)运算,保证了Hadoop地位;
MapReduce作为大数据生态圈第一代分布式计算引擎,由于自身设计的模型所产生的弊端,导致企业一线几乎不在直接使用MapReduce进行编程处理,但很多软件的底层已然在使用MapReduce引擎来处理数据。
高扩展性:
在集群之间分配任务数据,可方便的扩展节点。
高效率:
在MapReduce思想下,Hadoop是并行工作,以加快任务处理速度。
高可靠性:
底层维护多个数据副本,即使Hadoop某个计算元素或存储出现故障,也不会导致数据丢失。同时能够自动将失败的任务重新分配。
低成本:
Hadoop能部署在比较廉价的机器组成的集群上来处理大数据。
Hadoop1.x
HDFS(数据存储)
MapReduce(计算+资源调度)
Common(辅助工具)
Hadoop2.x
HDFS(数据存储)
MapReduce(计算)
YARN(资源调度)
Hadoop3.x
在Hadoop2.x的基础上进行性能优化。
Hadoop集群包括两个集群:HDFS集群、YARN集群
两个集群逻辑上分离,通常物理上在一起
逻辑上分离:两个集群互相之间没有依赖、互不影响
物理上在一起:某些角色进行部署在同一台物理服务器上
两个集群都是标准的主从架构集群(Master、Slaver)
主角色:NameNode
从角色:DataNode
辅助主角色:SecondaryNameNode
主角色:ResourceManger
从角色:NodeManger
启停HDFS集群:
start-dfs.sh
stop-dfs.sh
启停YARN集群:
start-yarn.sh
stop-yarn.sh
启停Hadoop集群:
start-all.sh
stop-all.sh
进程状态、日志查看
启动完毕之后可以使用jps命令查看进程是否启动成功。
Hadoop启动日志路径:/export/server/hadoop-3.3.0/logs/
HDFS集群地址:namenode_host:9870
namenode_host:namenode所在主机名
YARN集群:resourcemanger_host:8088
resourcemanger_host:resourcemanger所在主机名
文件系统定义
文件系统是一种存储和组织数据的方法,实现了数据的存储、分级组织、访问和获取等操作,使得用户对文件访问和查找变得容易。
文件系统使用树形目录的抽象逻辑概念代替了硬盘等物理设备使用数据块的概念,用户不比关心数据底层存在硬盘哪里,只需记住所在目录和文件名即可。
文件系统通常使用硬盘或光盘等存储设备,并维护文件在设备中的物理位置。
数据、元数据
数据:
指存储的内容本身,比如文件、视频、图片等,这些数据底层最终是存储在磁盘等存储介质上的,一般用户无需关心。只需要基于目录树进行增删改查即可,实际针对数据操作有文件系统组成。
元数据:metadata
记录数据的数据、描述数据的数据。
文件系统元数据一般指文件大小、最后修改时间、底层存储位置、属性、所属用户等信息。
HDFS(Hadoop Distributed File System):Hadoop分布式文件系统
是Apache Hadoop核心组件之一,作为大数据生态圈最底层的分布式存储服务而存在。大数据首要解决的问题就是海量数据的存储问题。HDFS能够很好的胜任该任务。
分布式存储系统核心属性:
分布式存储解决了什么问题?
数据量大,单机存储遇到瓶颈
与单机存储的对比:
单机纵向扩展:磁盘不够家磁盘,有上限瓶颈限制
多级横向扩展:机器不够加机器,理论上可以无限扩展
解决了什么问题?
文件分布在不同机器上不利于寻找
解决方式:
元数据记录下文件及其存储位置信息,能快速定位文件位置
在HDFS中,NameNode管理的元数据具有两种类型:
解决了什么问题?
文件过大导致单机存不下,上传下载效率低
解决方式:
文件分块存储在不同机器上,针对块并行操作提高效率
解决了什么问题?
硬件故障导致的数据丢失问题
解决方式:
不同机器设置备份,冗余存储,保障数据安全
HDFS副本存放与策略小结:
副本的存放是HDFS可靠性和性能的关键。HDFS采用一种为机架感知(rack-aware)的策略来改进数据的可靠性可用性和网络带宽的利用率。
一方面,通过一个机架感知的过程,NameNode可以确定每个DataNode所属的机架ID。目前HDFS采用的策略就是将副本存放在不同机架上。这样可以有效防止当整个机架失效时数据的丢失,并且允许读数据的时候充分利用多个机架的带宽。
这种策略设置可以将副本均匀的分布在集群中,有利于在组建失效情况下的负载均衡。
但是,因为这种策略的一个写操作需要传输到多个机架,就增加了操作的成本。
大多数情况下副本系数是3,HDFS的存放策略是一个副本存放在本地机架;另一个副本存放在不同机架的一节点上,最后一个副本存放在与第二个副本相同机架的不同节点上。
同时因为数据块只放在两个不同的机架上,所以此策略减少了读取数据时需要的网络带宽。
这一策略在不损害数据可靠性和读取性的情况下改进了写的性能。
另一方面,在读取数据时,为了减少整体的带宽消耗和降低整体的带宽延时,HDFS会尽量让程序读取离客户端最近的副本。
如果在读取程序的同一机架上有一个副本,那么就读取该副本。
如果一个HDFS集群跨越了多个数据中心,那么客户端也将首先读取本地数据中心的副本。
HDFS的应用场景:
根据上述HDFS的设计目标和简介,可以得出结论
HDFS的应用场景有:
不适合以下场景:
介绍
1、创建文件夹:
hadoop fs -mkdir [-p]
path为待创建的目录
-p会沿着路径创建父目录
2、查看指定目录下内容:
hadoop fs -ls [-h] [-R] [
path 指定目录路径
-h人性化显示文件size
-R递归查看执行目录及其子目录
3、上传文件到HDFS执行目录下:
hadoop fs -put [-f] [-p] …
-f覆盖目标文件(已存在时)
-p保留访问和修改时间,所有权和权限
localsrc本地文件系统(客户端所在机器)
dst目标文件系统(HDFS)
4、查看HDFS文件内容:
hadoop fs -cat …
读取指定文件全部内容,显示输出在控制台上。
注意:对于大文件内容读取要慎重
5、下载HDFS文件:
hadop fs -get [-f] [-p] …
下载文件到本地文件系统指定目录,localdst必须是目录
-f覆盖目标文件(已存在时)
-p保留访问和修改时间,所有权和权限
6、拷贝HDFS文件:
hadoop fs -cp [-f]…
-f覆盖目标文件(已存在时)
7、追加数据到HDFS文件中:
hadoop fs -appendToFile …
将所有给定本地文件的内容追加到给定dst文件
dst如果文件不存在,将创建该文件
如果localsrc为-,则输入为从标准输入中读取
8、HDFS数据移动操作:
hadoop fs -mv …
移动文件到指定文件夹下
可以使用该命令移动数据,重命名文件的名称
主角色:NameNode
从角色:DataNode
写数据大致流程图:
核心概念:Pipline管道
核心概念:默认3副本存储策略
默认副本策略是BlockPlacementPolicyDefault指定
整完了几个概念,加下来整体描述一下HDFS写数据的流程:
先把流程图贴出来,看图描述
读数据完成流程:
扩展:如果DFSInoutStream在于datanode通信时遇到错误,会尝试从这个块的另外一个最近datanode读取数据。它也会记住那个故障datanode,以保证以后不会重复读取该节点上后续的块。FSDataInputStream也会通过校验和确认从datanode发来的数据是否完整。如果发现有损坏的块,FSDataInputStream会视图从其他datanode读取其副本,也会将被损坏的块通知给namenode。
这个设计的好处是,客户端可以直接连接到datanode检索数据,且namenode告知客户端每个块所在的最佳datanode。由于数据流分散在集群中的所有datanode,所以这种设计能使HDFS扩展到大量的并发客户端。同时,namenode只需要相应块位置的请求,无需响应数据请求。
MapReduce核心思想是“先分再合,分而治之”
分而治之就是把一个复杂的问题,按照一定的分解方法分为等价的规模较小的若干部分,然后逐个解决,分别找出各部分的结果,然后把各部分的结果组整个问题的最终结果。
MapReduce有两个核心方法:Map、Reduce
Map表示第一阶段,负责拆分:即把负责的任务分解成若干个简单的子任务来并行处理。可以进行拆分的前提是这些小任务可以并行计算,彼此没有任何依赖关系。
Reduce表示第二阶段,负责合并:即对map阶段的结果进行全局汇总
这两个阶段合起来就是MapReduce思想的体现。
MR的抽象编程模型
MapReduce通过Map和Reduce两个函数提供了高层的秉性编程抽象模型。
map:对一组数据元素进行某种重复式处理;
reduce:对map的中间结果进行进一步结果整理。
MapReduce中定义了Map和Reduce两个抽象的编程接口,有用户去编程实现:
map:(k1;v1)->(k2,;v2)
reduce:(k2;[v2])->(k3;v3)
MapReduce处理的数据类型是**<key,value>键值对**。
阶段组成
统一架构、隐层底层细节
分布式计算概念
易于编程
MapReduce框架提供了用于二次开发的借口;简单的实现一些接口,就可以完成一个分布式程序。计算任务交给计算框架去处理,将分布式程序部署到hadoop集群上运行,集群节点可扩展到成百上千个等。
良好的扩展性
基于Mapreduce的分布式计算的特点可以随节点数目增长保持近似与线性的增长,能很容易进行节点扩充。
高容错
Hadoop集群是分布式搭建和部署的,任何单一节点宕机了,他可以把上面的计算任务转移到另一个节点上运行,不影响整个作业任务的完成,过程完全由Hadoop内部完成。
适合海量数据的离线处理
可以处理GB、TB和PB级别的数据量。
实时计算性能差
MapReduce主要用于离线作业,无法做到秒级别或者毫秒级别的数据相应。
不能进行流式计算
流式计算特点是数据时源源不断的计算,并且数据时动态的;而Mapreduce
作为一个离线计算框架,主要是针对静态数据集的,数据是不能动态变化的。
一个完整的MapReduce程序分布式运行时有三类:
词频统计(WordCount)示例
WordCount编程实现思路
map阶段的核心:把输入的数据经过切割,全部标记为1,因此输出就是 <单词,1>;
shuffle阶段核心:经过MR程序内部自带默认的排序分组等功能,把key相同的单词会作为一组数据构成新的kv键值对;
reduce阶段核心:处理shuffle完的一组数据,改组数据就是该单词所有的键值对。对所有的1进行累计求和,就是单词总次数。
Map阶段执行流程:
MapReduce整体执行流程图:
第一阶段:把输入目录下文件按照一定的标准逐个进行逻辑切片,形成切片规划。默认split size = Block size(128M),么个切片由一个MapTask处理;
第二阶段:对切片的数据按照一定的规则读取解析返回<K,V>键值对。默认是按行读取数据。key是每一行的起始偏移量,value是本行的本文内容。
第三阶段:调用Mapper类中的map方法处理数据。每读取解析出来的一个<k,v>键值对,调用一次map方法;
第四阶段:按照一定的规则对Map输出的键值对进行分区partition。默认不分区,因为只有一个reducetask。分区的数量就是reducetask运行的数量;
第五阶段:Map输出数据写入内存缓冲区,达到比例溢出到磁盘上。溢出spill的时候根据key进行排序sort。默认根据key字典序排序;
第六阶段:对所有溢出文件进行最终merge合并,成为一个文件。
Reduce阶段执行过程
第一阶段:ReduceTask主动从MapTask复制拉取属于需要自己处理的数据;
第二阶段:把拉取来的数据,全部进行合并merge,即把分散的数据合并成一个大的数据。再对合并后的数据排序;
第三阶段:对排序后的键值对调用redue方法。键相等的键值对调用一次reduce方法。最后把这些输出的键值对写入到HDFS文件中。
shuffle阶段
shuffle概念:
shuffle翻译洗牌、混洗;
而在MR中,shuffle操作指的是将map端的无规则输出按指定规则清洗成具有一定规则的数据,以便reduce端接收处理;
一般把从map产生输出开始到reduce取得数据作为输入之前的过程成为shuffle。
Map端shuflle
Collect阶段:将MapTask的结果收集输出到默认100M的环形缓冲区,保存之前会对key进行分区的计算,默认Hash分区;
Spill阶段:当内存中的数量达到一定的阈值时(80%),就会将数据溢出(spill)本地磁盘,在将数据写入磁盘之前需要对数据进行一次排序的操作,如果配置了combiner,还会将有相同分区号和key的数据进行排序(写入磁盘之前)。运行conbiner函数是的map输出结果更加紧凑,因此减少减少写到磁盘的数据和传递给reduce的数据。
在溢出写到磁盘过程中,map会输出继续写到缓冲区,但如果此期间缓冲区被填满,map会被阻塞知道写磁盘过程完成。
Merge阶段:每次内存缓冲区达到溢出阈值,就会新建一个溢出文件(spill file),把所有溢出的临时文件进行一次合并操作,合并成一个一分区且已排序的输出文件,以确保一个MapTask最终只产生一个中间数据文件。
扩展:在将压缩map输出写到磁盘的过程中对它进行压缩往往是个很好的注意,因为这样会写磁盘的速度更快,节约磁盘空间,并且减少传给reduce的数据量。在默认情况下,输出是不压缩的,但只要将mapreduce.map.output.compress设置为true就可开启此功能。
Reduce端shuffle
copy阶段:ReduceTask启动Tetcher进程到已经完成MapTask的节点上复制一份属于自己的数据;
如果map输出相当小,会被复制到reduce任务JVM的内存,否则,map输出被复制到磁盘。一旦内存缓冲区达到阈值大小(有mapreduce.reduce.shuffle.merge.percent决定)或达到map输出阈值(有mapreduce.reduce.merge.inmem.threshold控制),则合并后溢出写到磁盘中。
扩展:reduce如何知道从哪台机器取得map输出呢?
map任务完成后,他们会使用心跳机制通知它们的applicationmaster。因此对于指定作业,applicationmaster知道map输出和主机位置的映射关系。reduce中的一个线程定期询问master以便获取map输出主机的位置,知道获取所有输出位置。
由于第一个reduce可能会失败,因此主机并没有在第一个reduce检测到map输出时就立即从磁盘上删除它们。相反,主机等待机会,知道applicationmaster告知它删除map输出,这就是作业完成后执行的。
Merge、Sort阶段:在ReduceTask远程复制数据同时,在后台开启两个线程对内存到本地的数据文件进行合并操作,这个阶段将合并map输出,维持其顺序排序。并是循环进行的。比如:如果与50个map输出,而合并因子是10(10为默认设置,有mapreduce.task.io.sort.factor属性设置,与map的合并类似),合并将进行5趟。每趟将10个文件合并成一个文件,因此最后有5个中间文件。
shuffle机制弊端
shuffle过程中频繁涉及到数据在内存、磁盘之间的往复
shuffle配置调优:
总的原则是给shuffle过程尽量多提供内存空间。然而有一个平衡问题,也就是要确保map函数和reduce函数能够得到足够的内存来运行。
在map端:
在map端可以通过避免多次溢出写磁盘来获得最佳性能;一次是最佳的情况。如果能估算map输出大小,就可以合理的设置mapreduce.task.io.sort.*属性来尽可能减少溢出写的次数。
在reduce端:
在reduce端,中间数据全部驻留在内存时,就能获得最佳性能。在默认情况下这是不能发生的,因为所有内存一般都预留给reduce函数。但如果reduce函数的内存需求不大,把mapreduce.reduce.merge.inmem.threshold设置为0,把mapreduce.reduce.input.buffer.percent设置为1.0(或者更低)就可以提升性能。
Apache Hadoop YARN (Yet Another Resource
Negotiator,另一种资源协调者)是一种新的Hadoop资源管理器;
YARN是一个通用资源管理系统和调度平台,可为上层应用提供统一的资源管理和调度;
它的引入为集群再利用率、资源统一管理和数据共享等方面带来了巨大好处。
YARN相比MapReduce1的好处:
1、可扩展性:相比MR1,YARN可以在更大的集群上运行。当节点达到4000,任务数量达到400000时,MapReduce1会遇到可扩展性瓶颈,瓶颈源自于MR1中的jobtracker必须同时管理作业和任务这样一个事实(一个人干两个人的活,任务多了难免忙不过来)。YARN利用其资源管理器和applicationmaster分离的架构优点客服了这个局限性,可以扩展面向奖金10000个节点和100000个任务。
2、高可用性:当服务守护进行失败时,通过为另一个守护进程复制接管工作所需的状态以便其继续提供服务,从而可以提高可用性(HA、High Availability)
3、利用率:YARN的资源是精细化管理的,这样一个应用能够按需请求资源,而不是请求一个不可分割的、低于特定的任务而言可能会太大(浪费资源)会太小(资源不够导致任务失败)的slot;
4、多租户:YARN的最大优点在于向MapReduce以外的其他类型分布式开放了Hadoop。Mapreduce仅仅是许多YARN应用中的一个。
官方YARN架构图:
YARN三大组件:
核心交互流程
交互整体概述
首先,客户端联系资源管理器,要求它运行一个applicationmaster进程,然后资源管理器找到一个能够在容器中启动applicationmaster的节点管理器。application一旦运行起来能做什么依赖于应用本身。有可能实在所处的容器中简单运行一个运算,并将结果返回给客户端;或是向资源管理器请求更多的容器,已用于运算一个分布式计算。
注意:
YARN本身不会为应用的各部分(客户端、master和进程)彼此间通信提供任何手段。大多数重要的YARN应用使用某种形式的远程通信机制(Hadoop的RPC层)来向客户端传递状态更新和返回结果,但是这些通信机制都是专属于各应用的。
MR提交YARN交互流程
理解资源调度
YARN中的几种调度策略
Fair Schedule公平调度器
1、Fair Schedule公平调度器,提供了YARN应用程序公平地分享大型集群中资源的另一种方式。使用所有应用在平均情况下随着时间的流逝可以获得相等的资源份额;
2、设计目标是为了所有的应用分配公平的资源;
3、公平调度可以在多个队队列间工作,允许资源共享和抢占。
公平共享的理解
以上内容只是Hadoop中一部分,此后会持续填充相关知识。
未完待续~
点个赞吧~~
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。