hadoop之基础篇
一、什么是hadoop
大数据(big data),IT行业术语,是指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。在维克托·迈尔-舍恩伯格及肯尼斯·库克耶编写的《大数据时代》 中大数据指不用随机分析法(抽样调查)这样捷径,而采用所有数据进行分析处理。大数据的5V特点(IBM提出):Volume(大量)、Velocity(高速)、Variety(多样)、Value(低价值密度)、Veracity(真实性)。
Hadoop是一个由Apache基金会所开发的分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。Hadoop实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS。HDFS有高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上;而且它提供高吞吐量(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。HDFS放宽了(relax)POSIX的要求,可以以流的形式访问(streaming access)文件系统中的数据。Hadoop的框架最核心的设计就是:HDFS和MapReduce。HDFS为海量的数据提供了存储,而MapReduce则为海量的数据提供了计算 。它主要有以下几个优点:高可靠性、高扩展性、高效性、高容错性、低成本。
Hadoop三大发行版本:Apache、Cloudera、Hortonworks。Apache版本最原始(最基础)的版本,对于入门学习最好。Cloudera在大型互联网企业中用的较多。Hortonworks文档较好。
二、hadoop组成结构
Hadoop 由许多元素构成。其最底部是 Hadoop Distributed File System(HDFS),它存储 Hadoop 集群中所有存储节点上的文件。HDFS的上一层是MapReduce 引擎,该引擎由 JobTrackers 和 TaskTrackers 组成。通过对Hadoop分布式计算平台最核心的分布式文件系统HDFS、MapReduce处理过程,以及数据仓库工具Hive和分布式数据库Hbase的介绍,基本涵盖了Hadoop分布式平台的所有技术核心。
在Hadoop1.x时代,Hadoop中的MapR educe同时处理业务逻辑运算和资源的调度,耦合性较大,在Hadoop2 .x时代,增加了Yarn。Yarn .只负责资源的调度,MapReduce只负责运算。
HDFS端主要构成:
1) NameNode (mn) :存储文件的元数据,如文件名,文件目录结构,文件属性(生成时间、副本数、文件权限),以及每个文件的块列表和块所在的DataNode等。
2) DataNode(dn): 在本地文件系统存储文件块数据,以及块数据的校验和。
3)Secondary NameNode(2nn):用来监控HDFS状态的辅助后台程序,每隔一段时间获取HDFS元数据的快照。
YARN主要构成:
1) ResourceManager (RM)主要作用如下
(1)处理客户端请求
(2)监控NodeManager
(3)启动或监控ApplicationMaster
(4)资源的分配与调度
2) NodeManager (NM) 主要作用如下
(1)管理单个节点上的资源
(2)处理来自ResourceManager的命令
(3)处理来自ApplicationMaster的命令
3) ApplicationMaster (AM)作用如下
(1)负责数据的切分
(2)为应用程序申请资源并分配给内部的任务
(3)任务的监控与容错
4) Container
Containe r是YARN中的资源抽象,它封装了某个节点上的多维度资源,如内存、CPU、 磁盘、网络等。
MapReduce主要构成:
1) Map阶段并行处理输入数据
2) Reduce阶段对Map结果进行汇总
三、HDFS
HDFS (Hadoop Distributed File System),它是一个文件系统,用于存储文件,通过目录树来定位文件;次,它是分布式的,由很多服务器联合起来实现其功能,集群中的服务器有各自的角色。HDFS的使用场景:适合一次写入,多次读出的场景,胚支持文件的修改。适合用来做数据分析,并不适合用来做网应用。
HDFS中的文件在物理.上是分块存储(B1ock) ,块的大小可以通过配置参数( dfs.blocksize)来规定,默认大小在Hadoop2 .x版本中是128M,老版本中是64M。如果寻址时间约为10ms ,即查找到目标block的时间为10ms。寻址时间为传输时间的1 %时,则为最佳状态。因此,传输时间=1 0ms/0.01=1000ms=1s。而目前磁盘的传输速率普遍为100MB/s。所以默认大小为128M。
HDFS的Shell操作
1.基本语法
bin/hadoop fs 具体命令 OR bin/hdfs dfs 具体命令
2.命令大全
本地文件 -> HDFS
-put 将本地数据上传至hdfs
-copyFromLocal 将本地文件数据拷贝到hdfs
-moveFromLocal 将本地文件数据移动到hdfs,成功后本地数据会删除
-appendToFile 追加一个文件到已经存在的文件末尾
HDFS与HDFS之间
-ls 查看hdfs文件目录
-mkdir 在HDFS上创建目录
-rm 删除文件或者文件夹
-rmr | -rm -r 递归删除
-cp 从一个目录拷贝文件至另一目录
-mv 在HDFS目录中移动文件
-chown 修改文件所属用户权限
-chmod 修改文件所属读写权限
-du -h 文件夹暂用的空间大小
-df -h 查看系统分区情况
-cat 查看文件
HFDS -> 本地
-get 从hdfs下载文件至本地
-getmerge 合并hdfs目录下的文件至本地
-copyToLocal 从hdfs拷贝文件至本地
其他
-setrep 设置文件副本数(注意:具体的副本数得看DataNode的数量)
-help 帮助命令
3.启动集群的相关命令
启动HDFS服务
启动namenode:sbin/hadoop-daemon.sh start|stop namenode
启动datanode:sbin/hadoop-daemon.sh start|stop datanode
启动YARN服务
启动nodemanager:sbin/yarn-daemon.sh start|stop nodemanager
开启历史服务
sbin/mr-jobhistory-daemon.sh start|stop historyserver
集群的群停和群起
群起的命令:start-dfs.sh
群停的命令:stop-dfs.sh
群起群停YARN服务进程(再resourcemanager所在的服务器上)
群起的命令:start-yarn.sh
群停的命令:stop-yarn.sh
stop-all.sh | start-all.sh
安装配置开源Hadoop
1、准备服务器修改ip和主机名(虚拟机需要)、创建用户和软件安装目录
2、安装JDK并配置环境变量(/etc/profile);
3、关闭防火墙;
4、配置hosts文件,方便hadoop通过主机名访问(/etc/hosts);
5、设置ssh免密码登录;
6、解压缩hadoop安装包,并配置环境变量;
7、修改配置文件hadoop-env.sh、yarn-env.sh、mapred-env.sh、 core-site.xml hdfs-site.xml mapred-site.xml yarn-site.xml;
8、格式化hdfs文件系统(hadoop namenode -format);
9、启动hadoop:start-def.sh、start-yarn.sh
10、使用jps查看进程。
hadoop集群可以运行的3个模式:本地运行模式、伪分布式运行模式、完全分布式运行模式。
搭建完全分布式集群需要注意:完全分布式集群通常被用于生产环境,这里我们使用N台主机组成一个Hadoop集群,Hadoop守护进程运行在每台主机之上。这里会存在Namenode运行的主机,Datanode运行的主机,secondarynamenode运行的主机,resourcemanager运行的主机等。在完全分布式环境下,主节点和从节点会分开。通常情况下我们搭建集群时,需要自定义一些参数,需要修改配置文件hadoop-env.sh、yarn-env.sh、mapred-env.sh、 core-site.xml hdfs-site.xml mapred-site.xml。
hdfs文件的读取流程
文件上传的流程
1.首先客户端通过Distributed FileSystem模块向NameNode请求上传文件,NameNode检查目标文件是否已存在,父目录是否存在。
2.NameNode返回是否可以上传。
3.如果文件大于128M则分块存储,客户端请求第一个 Block上传到哪几个DataNode服务器上。
4.NameNode根据副本储存策略返回3个DataNode节点,假如为dn1、dn2、dn3。
5.客户端通过FSDataOutputStream模块请求dn1上传数据,dn1收到请求调用dn2,dn2调用dn3,建立通信管道完成,dn1、dn2、dn3逐级应答客户端。
6.客户端以Packet为单位往dn1上传第一个Block数据,dn1收到Packet就会传给dn2,dn2传给dn3;dn1,dn2,dn3每接收packet会放入一个待写队列等待写入数据,落盘。
7.当一个Block传输完成之后,客户端再次请求NameNode上传第二个Block的服务器,重复执行3-6步。
文件的下载流程
1.客户端通过Distributed FileSystem向NameNode请求下载文件,NameNode通过查询元数据,找到文件块所在的DataNode地址。
2.挑选一台DataNode(就近原则,然后随机)服务器,请求读取数据。
3.DataNode开始传输数据给客户端(从磁盘里面读取数据输入流,以Packet为单位来做校验)。
4.客户端以Packet为单位接收,先在本地缓存,然后写入目标文件。
四、MapReduce
MapReduce是一个分布式运算程序的编程框架, 是用户开发”基于Hadoop的数据分析应用”的核心框架。
MapReduce核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序,并发运行在一个Hadoop集群 上。
MapReduce核心编程思想:
1)分布式的运算程序往往需要分成至少2个阶段。
2)第一个阶段的MapTask并发实例,完全并行运行,互不相干。
3)第二个阶段的ReduceTask并发实例互不相干,但是他们的数据依赖于上一个阶段的所有MapTask并发实例的输出。
4)MapReduce编程模型只能包含一个Map阶段和一个Reduce阶段,如果用户的业务逻辑非常复杂,那就只能多个MapReduce程序,串行运行。
一个完整的MapReduce程序在分 布式运行时有三类实例进程:
1) MrAppMaster: 负责整个程序的过程调度及状态协调。
2) Map Task:负责Map阶段的整个数据处理流程。
3) ReduceTask:负责Reduce阶段的整 个数据处理流程。
MapReduce编程规范
1. Mapper阶段
(1)用户自定义的Mapper要继承自己的父类
(2) Mapper的输入数据是KV对的形式(KV的类型可自定义)
(3) Mapper中的业务逻辑写在map0方法中.
(4) Mapper的输出数据是KV对的形式(KV的类型可自定义)
(5) map0方法(MapTask进程)对每一个<K,V>调用一次
2. Reducer阶 段
(1)用户自定义的Reducer要继承自己的父类
(2) Reducer的输入数据类型对应Mapper的输出数据类型,也是KV
(3) Reducer的业务逻辑写在reduce()方法中
(4) ReduceTask进程对每组相同k的<k,v>组调用一次reduce()方法
3. Driver阶段
相当于YARN集群的客户端,用于提交我们整个程序到YARN集群,提交的是封装了MapReduce程序相关运行参数的job对象
MapReduce工作流程
MapTask工作机制
(1)Read阶段:MapTask通过用户编写的RecordReader,从输入InputSplit中解析出一个个key/value。
(2)Map阶段:该节点主要是将解析出的key/value交给用户编写map()函数处理,并产生一系列新的key/value。
(3)Collect收集阶段:在用户编写map()函数中,当数据处理完成后,一般会调用OutputCollector.collect()输出结果。在该函数内部,它会将生成的key/value分区(调用Partitioner),并写入一个环形内存缓冲区中。
(4)Spill阶段:即“溢写”,当环形缓冲区满后,MapReduce会将数据写到本地磁盘上,生成一个临时文件。需要注意的是,将数据写入本地磁盘之前,先要对数据进行一次本地排序,并在必要时对数据进行合并、压缩等操作。
(5)Combine阶段:当所有数据处理完成后,MapTask对所有临时文件进行一次合并,以确保最终只会生成一个数据文件。
ReduceTask工作机制
(1)Copy阶段:ReduceTask从各个MapTask上远程拷贝一片数据,并针对某一片数据,如果其大小超过一定阈值,则写到磁盘上,否则直接放到内存中。
(2)Merge阶段:在远程拷贝数据的同时,ReduceTask启动了两个后台线程对内存和磁盘上的文件进行合并,以防止内存使用过多或磁盘上文件过多。
(3)Sort阶段:按照MapReduce语义,用户编写reduce()函数输入数据是按key进行聚集的一组数据。为了将key相同的数据聚在一起,Hadoop采用了基于排序的策略。由于各个MapTask已经实现对自己的处理结果进行了局部排序,因此,ReduceTask只需对所有数据进行一次归并排序即可。
(4)Reduce阶段:reduce()函数将计算结果写到HDFS上。
五、YARN
Yarn是一个资源调度平台,负责为运算程序提供服务器运算资源,相当于一个分布式的操作系统平台,而MapReduce等运算程序则相当于运行于操作系统之上的应用程序。
Yarn运行机制:
(1)MR程序提交到客户端所在的节点。
(2)YarnRunner向ResourceManager申请一个Application。
(3)RM将该应用程序的资源路径返回给YarnRunner。
(4)该程序将运行所需资源提交到HDFS上。
(5)程序资源提交完毕后,申请运行mrAppMaster。
(6)RM将用户的请求初始化成一个Task。
(7)其中一个NodeManager领取到Task任务。
(8)该NodeManager创建容器Container,并产生MRAppmaster。
(9)Container从HDFS上拷贝资源到本地。
(10)MRAppmaster向RM 申请运行MapTask资源。
(11)RM将运行MapTask任务分配给另外两个NodeManager,另两个NodeManager分别领取任务并创建容器。
(12)MR向两个接收到任务的NodeManager发送程序启动脚本,这两个NodeManager分别启动MapTask,MapTask对数据分区排序。
(13)MrAppMaster等待所有MapTask运行完毕后,向RM申请容器,运行ReduceTask。
(14)ReduceTask向MapTask获取相应分区的数据。
(15)程序运行完毕后,MR会向RM申请注销自己。
资源调度器
目前,Hadoop作业调度器主要有三种:
FIFO:只有一条任务队列,job任务按照时间顺序,先进的排在前面优先处理,一次只能处理一个任务
Capacity Scheduler:由多个FIFO队列组成,可以为队列进行资源的分配,任务在各队列中按照时间顺序排列,先进的排在前面优先处理,支持任务的并行执行。
Fair Scheduler:由多个队列组成,可以为队列进行资源的分配,任务在各队列中按照差额排列,差额越大,任务优先分配到资源优先执行,但是公平调度器会保证每个job任务都能分配到一定的资源执行任务,所以公平调度器同样支持任务的并行执行;但是要使用公平调度器集群服务器的性能一定高,不然任务分配的资源少,导致任务的执行效率低。
Hadoop2.7.2默认的资源调度器是Capacity Scheduler。
六、HDFS HA高可用
HA概述
1)所谓HA(High Available),即高可用(7*24小时不中断服务)。
2)实现高可用最关键的策略是消除单点故障。HA严格来说应该分成各个组件的HA机制:HDFS的HA和YARN的HA。
3)Hadoop2.0之前,在HDFS集群中NameNode存在单点故障(SPOF)。
4)NameNode主要在以下两个方面影响HDFS集群
NameNode机器发生意外,如宕机,集群将无法使用,直到管理员重启
NameNode机器需要升级,包括软件、硬件升级,此时集群也将无法使用
HDFS HA功能通过配置Active/Standby两个NameNodes实现在集群中对NameNode的热备来解决上述问题。如果出现故障,如机器崩溃或机器需要升级维护,这时可通过此种方式将NameNode很快的切换到另外一台机器。
HDFS-HA工作机制
通过双NameNode消除单点故障
HDFS-HA工作要点
1. 元数据管理方式需要改变
内存中各自保存一份元数据;Edits日志只有Active状态的NameNode节点可以做写操作;两个NameNode都可以读取Edits;共享的Edits放在一个共享存储中管理(qjournal和NFS两个主流实现);
2. 需要一个状态管理功能模块
实现了一个zkfailover,常驻在每一个namenode所在的节点,每一个zkfailover负责监控自己所在NameNode节点,利用zk进行状态标识,当需要进行状态切换时,由zkfailover来负责切换,切换时需要防止brain split现象的发生。
3. 必须保证两个NameNode之间能够ssh无密码登录
4. 隔离(Fence),即同一时刻仅仅有一个NameNode对外提供服务
HDFS-HA自动故障转移工作机制
HA的自动故障转移依赖于ZooKeeper的以下功能:
1)故障检测:集群中的每个NameNode在ZooKeeper中维护了一个持久会话,如果机器崩溃,ZooKeeper中的会话将终止,ZooKeeper通知另一个NameNode需要触发故障转移。
2)现役NameNode选择:ZooKeeper提供了一个简单的机制用于唯一的选择一个节点为active状态。如果目前现役NameNode崩溃,另一个节点可能从ZooKeeper获得特殊的排外锁以表明它应该成为现役NameNode。
ZKFC是自动故障转移中的另一个新组件,是ZooKeeper的客户端,也监视和管理NameNode的状态。每个运行NameNode的主机也运行了一个ZKFC进程,ZKFC负责:
1)健康监测:ZKFC使用一个健康检查命令定期地ping与之在相同主机的NameNode,只要该NameNode及时地回复健康状态,ZKFC认为该节点是健康的。如果该节点崩溃,冻结或进入不健康状态,健康监测器标识该节点为非健康的。
2)ZooKeeper会话管理:当本地NameNode是健康的,ZKFC保持一个在ZooKeeper中打开的会话。如果本地NameNode处于active状态,ZKFC也保持一个特殊的znode锁,该锁使用了ZooKeeper对短暂节点的支持,如果会话终止,锁节点将自动删除。
3)基于ZooKeeper的选择:如果本地NameNode是健康的,且ZKFC发现没有其它的节点当前持有znode锁,它将为自己获取该锁。如果成功,则它已经赢得了选择,并负责运行故障转移进程以使它的本地NameNode为Active。故障转移进程与前面描述的手动故障转移相似,首先如果必要保护之前的现役NameNode,然后本地NameNode转换为Active状态。
浙公网安备 33010602011771号