
我们知道目前Hadoop主要包括有三大组件,分别是:分布存储框架(HDFS)、分布式计算框架(MapReduce)、以及负责计算资源调度管理的平台(Yarn),那么今天我们就来解析式的深入学习了解这三大组件。
第一种:全部启动集群所有进程
启动:sbin/start-all.sh
停止:sbin/stop-all.sh
第二种:单独启动hdfs【web端口50070】和yarn【web端口8088】的相关进程
启动:sbin/start-dfs.sh sbin/start-yarn.sh
停止:sbin/stop-dfs.sh sbin/stop-yarn.sh
每次重新启动集群的时候使用
第三种:单独启动某一个进程
启动hdfs:sbin/hadoop-daemon.sh start (namenode | datanode)
停止hdfs:sbin/hadoop-daemon.sh stop (namenode | datanode)
启动yarn:sbin/yarn-daemon.sh start (resourcemanager | nodemanager)
停止yarn:sbin/yarn-daemon.sh stop(resourcemanager | nodemanager)
用于当某个进程启动失败或者异常down掉的时候,重启进程
HDFS(Hadooop Distributed File System)是Hadoop项目的核心子项目,是Hadoop主要应用的一个分布式文件管理系统;其实,在Hadoop中有一个综合性的文件系统抽象,而该抽象中提供了文件系统实现的各种接口,而,HDFS只是这个抽象文件系统的一个实例。HDFS是一种允许文件通过网络在多台主机上分享的文件系统,可让多机器上的多用户分享文件和存储空间。具有很好的通透性和容错性,注意:分布式文件管理系统很多,HDFS只是其中一种,HDFS不合适小文件。
总结HDFS的特点如下:
那么,我们可以先看一下hadoop的文件系统…
在Hadoop中整合了很多的文件系统,这些众多的文件系统中,Hadoop提供了一个高层的文件系统的抽象类org.apache.hadoop.fs.FileSystem,这个抽象类向我们展示了一个分布式文件系统,并且有一些具体的实现。在Hadoop提供的许多文件系统的接口中,用户可以使用URI方案来选取合适的文件系统来进行交互;而Hadoop中文件系统的接口是使用Java来编写的,不同文件系统之间的交互实际上是通过Java API来进行调节的。例如我们可以使用 hadoop fs -ls file:///shell命令来查看本地文件系统目录,该shell命令其实就是一个Java应用。
如下图,HDFS是采用主从式架构对文件系统进行管理,一个HDFS集群是由一个NameNode和若干个DataNode组成的。NameNode是一个中心服务器,负责管理文件系统的名字空间(Namespace)以及客户端对文件的访问。集群中的DataNode一般是一个节点运行一个DataNode进程,负责管理它所在节点上的存储。

(1)、RPC远程过程调用协议 RPC(远程过程调用协议),它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。RPC采用客户机(client)/服务器(server)模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息的到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。 Hadoop的整个体系结构就是构建在RPC之上的(见org.apache.hadoop.ipc)
(2)、HDFS的相关概念
hadoop fsck / -files -blocks来获取文件和块的信息。Block块的大小可以自己指定,但是,块太小:寻址时间占比过高。块太大:Map任务数太少,作业执行速度变慢。它是最大的一个单位。在client端向DataNode传数据的时候,HDFSOutputStream会有一个chunk buff,在写满一个chunk后,会计算校验和并写入当前的chunk。之后再把带有校验和的chunk写入packet,当一个packet写满后,packet会进入dataQueue队列,其他的DataNode就是从这个dataQueue获取client端上传的数据并存储的。同时一个DataNode成功存储一个packet后之后会返回一个ack packet,放入ack Queue中。
NameNode文件包括(小北设置的文件是在/usr/local/soft/hadoop/hadoop-2.7.6/tmp/dfs/name/current 路径下的):(元数据就是指描述数据的数据)
(上面文件的保存路径是在hadoop的配置文件中的hdfs-site.xml的dfs.namenode.name.dir属性设置的)
(3)、secondary namenode
checkpoint操作:该操作就相当于拍快照,其中的属性:
secondary namenode的工作流程:
HDFS 的Trash回收站和Linux系统(桌面环境)的回收站设计一样的,HDFS会为每一个用户创建一个回收站目录:/user/用户名/.Trash/,每一个被用户通过Shell删除的文件或者目录,(fs.trash.interval是在指在这个回收周期之内),文件实际上是被移动到trash的这个目录下面,而不是马上把数据删除掉。等到回收周期真正到了以后,HDFS才会将数据真正的删除。默认的单位是分钟,1440分钟=60*24,正好是一天。详细配置:在每个节点(不仅仅是主节点)上添加配置 core-site.xml,增加如下内容
<property>
<name>fs.trash.interval</name>
<value>1440</value>
</property>
注意:如果删除的文件过大,超过了回收站的大小的话,会提示删除失败,此时,需要指定参数 -skipTrash才能继续删除
调用文件系统(FS)Shell命令应使用 bin/hdfs dfs -xxx 的形式, hadoop fs 与 hdfs dfs 是等价使用的
常用的命令如下:
-ls
查看hdfs上目录,如 hdfs dfs -ls /
-put
将本地文件上传到hdfs,如hdfs dfs -put 本地文件路径 hdfs路径
-get
将hdfs文件下载到本地,如 hdfs dfs -get hdfs文件路径 本地文件路径
-mkdir
在hdfs 上创建文件夹,如hdfs dfs -mkdir /test
-cp
将hdfs文件或目录复制 如 hdfs dfs -cp /test.txt /a/
-cat
查看hdfs上文件内容 如hdfs dfs -cat /test.txt
详细的shell命令介绍使用
1. cat : 将路径指定文件的内容输出到stdout 。
使用方法格式:hadoop fs -cat URI [URI …]
返回值:成功返回0,失败返回-1。
使用示例:
hadoop fs -cat hdfs://host1:port1/file1 hdfs://host2:port2/file2
hadoop fs -cat file:///file3 /user/hadoop/file4
2. chgrp :改变文件所属的组。
使用方法:hadoop fs -chgrp [-R] GROUP URI [URI …]
使用-R 将使改变在目录结构下递归进行。
命令的使用者必须是,文件的所有者或者超级用户。
3.chmod :改变文件的权限。
使用方法:hadoop fs -chmod [-R] <MODE[,MODE]... | OCTALMODE> URI [URI …]
使用-R 将使改变在目录结构下递归进行。
命令的使用者必须是文件的所有者或者超级用户。
4.chown :改变文件的拥有者。
使用方法:hadoop fs -chown [-R] [OWNER][:[GROUP]] URI [URI ]
使用-R 将使改变在目录结构下递归进行。
命令的使用者必须是 超级用户。
5.copyFromLocal
使用方法:hadoop fs -copyFromLocal <localsrc> URI
除了限定源路径是一个本地文件外,其它和put 命令相似。
6.copyToLocal
使用方法:hadoop fs -copyToLocal [-ignorecrc] [-crc] URI <localdst>
除了限定目标路径是一个本地文件外,其它和get 命令类似。
7.cp:将文件从源路径复制到目标路径
使用方法:hadoop fs -cp URI [URI …] <dest>
这个命令允许有多个源路径,此时目标路径必须是一个目录。
返回值:成功返回0,失败返回-1。
使用示例:
hadoop fs -cp /user/hadoop/file1 /user/hadoop/file2
hadoop fs -cp /user/hadoop/file1 /user/hadoop/file2 /user/hadoop/dir
8. du
使用方法:hadoop fs -du URI [URI …]
返回值:成功返回0,失败返回-1。
显示目录中所有文件的大小,或者当只指定一个文件时,显示此文件的大小。
使用示例:
hadoop fs -du /user/hadoop/dir1 /user/hadoop/file1 hdfs://host:port/user/hadoop/dir1
9.dus
使用方法:hadoop fs -dus <args>
显示文件的大小。
10.expunge :清空回收站。
使用方法:hadoop fs -expunge
11.get
使用方法:hadoop fs -get [-ignorecrc] [-crc] <src> <localdst>
复制文件到本地文件系统。
可用-ignorecrc 选项复制CRC校验失败的文件。
使用-crc 选项复制文件以及CRC信息。
返回值:成功返回0,失败返回-1。
使用示例:
hadoop fs -get /user/hadoop/file localfile
hadoop fs -get hdfs://host:port/user/hadoop/file localfile
12.getmerge
使用方法:hadoop fs -getmerge <src> <localdst> [addnl]
接受一个源目录和一个目标文件作为输入,并且将源目录中所有的文件连接成本地目标文件。
addnl 是可选的,用于指定在每个文件结尾添加一个换行符。
13. ls
使用方法:hadoop fs -ls <args>
返回值:成功返回0,失败返回-1。
如果是文件,则按照如下格式返回文件信息:
文件名 <副本数> 文件大小 修改日期 修改时间 权限 用户ID 组ID
如果是目录,则返回它直接子文件的一个列表,就像在Unix中一样。
目录返回列表的信息如下:
目录名 <dir> 修改日期 修改时间 权限 用户ID 组ID
使用示例:
hadoop fs -ls /user/hadoop/file1 /user/hadoop/file2 hdfs://host:port/user/hadoop/dir1 /nonexistentfile
14. lsr
使用方法:hadoop fs -lsr <args>
ls 命令的递归版本。类似于Unix中的ls -R 。
15. mkdir
使用方法:hadoop fs -mkdir <paths>
返回值: 成功返回0,失败返回-1。
接受路径指定的uri作为参数,创建这些目录。
其行为类似于Unix的mkdir -p,它会创建路径中的各级父目录。
使用示例:
hadoop fs -mkdir /user/hadoop/dir1 /user/hadoop/dir2
hadoop fs -mkdir hdfs://host1:port1/user/hadoop/dir hdfs://host2:port2/user/hadoop/dir
16. movefromLocal
使用方法:dfs -moveFromLocal <src> <dst>
输出一个”not implemented“信息。
17. mv :将文件从源路径移动到目标路径。
使用方法:hadoop fs -mv URI [URI …] <dest>
这个命令允许有多个源路径,此时目标路径必须是一个目录。
不允许在不同的文件系统间移动文件。
返回值:成功返回0,失败返回-1。
使用示例:
hadoop fs -mv /user/hadoop/file1 /user/hadoop/file2
hadoop fs -mv hdfs://host:port/file1 hdfs://host:port/file2 hdfs://host:port/file3 hdfs://host:port/dir1
18. put
使用方法:hadoop fs -put <localsrc> ... <dst>
从本地文件系统中复制单个或多个源路径到目标文件系统。
也支持从标准输入中读取输入写入目标文件系统。
返回值:成功返回0,失败返回-1。
使用示例:
hadoop fs -put localfile /user/hadoop/hadoopfile
hadoop fs -put localfile1 localfile2 /user/hadoop/hadoopdir
hadoop fs -put localfile hdfs://host:port/hadoop/hadoopfile
hadoop fs -put - hdfs://host:port/hadoop/hadoopfile
从标准输入中读取输入。
19. rm
使用方法:hadoop fs -rm URI [URI …]
删除指定的文件。只删除非空目录和文件。
返回值:成功返回0,失败返回-1。
使用示例:
hadoop fs -rm hdfs://host:port/file /user/hadoop/emptydir
20.rmr
使用方法:hadoop fs -rmr URI [URI …]
delete的递归版本。
返回值:成功返回0,失败返回-1。
使用示例:
hadoop fs -rmr /user/hadoop/dir
hadoop fs -rmr hdfs://host:port/user/hadoop/dir
21.setrep
使用方法:hadoop fs -setrep [-R] <path>
返回值:成功返回0,失败返回-1。
改变一个文件的副本系数。
-R选项用于递归改变目录下所有文件的副本系数。
使用示例:
hadoop fs -setrep -w 3 -R /user/hadoop/dir1
22.stat
使用方法:hadoop fs -stat URI [URI …]
返回指定路径的统计信息。
返回值:成功返回0,失败返回-1。
使用示例:
hadoop fs -stat path
23. tail
使用方法:hadoop fs -tail [-f] URI
返回值:成功返回0,失败返回-1。
将文件尾部1K字节的内容输出到stdout。
支持-f选项,行为和Unix中一致。
使用示例:
hadoop fs -tail pathname
24.test
使用方法:hadoop fs -test -[ezd] URI
选项:
-e 检查文件是否存在。如果存在则返回0。
-z 检查文件是否是0字节。如果是则返回0。
-d 如果路径是个目录,则返回1,否则返回0。
使用示例:
hadoop fs -test -e filename
25.text
使用方法:hadoop fs -text <src>
将源文件输出为文本格式。
允许的格式是zip和TextRecordInputStream。
26. touchz
使用方法:hadoop fs -touchz URI [URI …]
创建一个0字节的空文件。
使用示例:
hadoop -touchz pathname
首先,client访问NameNode,查询元数据信息,获得这个文件的数据
客户端向NameNode发出写文件请求。
检查是否已存在文件、检查权限。若通过检查,直接先将操作写入EditLog,并返回输出流对象。
client端按128MB的块切分文件。
client将NameNode返回的分配的可写的DataNode列表和Data数据一同发送给最近的第一个DataNode节点,此后client端和NameNode分配的多个DataNode构成pipeline管道,client端向输出流对象中写数据。client每向第一个DataNode写入一个packet,这个packet便会直接在pipeline里传给第二个、第三个…DataNode。
每个DataNode写完一个块后,会返回确认信息。
写完数据,关闭输输出流。
发送完成信号给NameNode。注意:发送完成信号的时机取决于集群是强一致性还是最终一致性,强一致性则需要所有DataNode写完后才向NameNode汇报。最终一致性则其中任意一个DataNode写完后就能单独向NameNode汇报,HDFS一般情况下都是强调强一致性
- 1.客户端通过调用DistributedFileSystem的create方法创建新文件
离开安全模式:hdfs dfsadmin -safemode leave
进入安全模式:hdfs dfsadmin -safemode enter
查看安全模式:hdfs dfsadmin -safemode get
MapReduce是一种分布式计算模型,由Google提出,主要用于搜索领域,解决海量数据的计算问题. MapReduce是分布式运行的,由两个阶段组成:Map和Reduce,Map阶段是一个独立的程序,有很多个节点同时运行,每个节点处理一部分数据。Reduce阶段是一个独立的程序,有很多个节点同时运行,每个节点处理一部分数据(在这先把reduce理解为一个单独的聚合程序即可)。MapReduce框架都有默认实现,用户只需要覆盖map()和reduce()两个函数,即可实现分布式计算,非常简单。这两个函数的形参和返回值都是<key、value>,使用的时候一定要注意构造<k,v>。
MapReduce过程分为map阶段和reduce阶段(主要是对map任务发送来的数据进行处理),其实,还有一个shuffle阶段,maprudece过程中流通的数据格式都是key-value键值对格式的。

接下来,我们详细的了解下MapReduce的过程,在map阶段,主要任务是处理从HDFS中输入的文件,在输入时会使用InputFormat类的子类(TextInputFormat)把输入的文件(夹)划分为很多切片(InputSplit),默认HDFS的每一个block块对应着一个切片,每一个切片默认大小为128MB,每一个切片会产生一个map任务。然后当map任务处理完后(就会进入到shuffle(中文译为“洗牌”)阶段,从map端的输出到reduce端的输入这一过程称为shuffle过程,该过程主要是负责map端的数据能够完整的发送到reduce端进行处理),就会将这些数据刷写到环形缓冲区(Buffer in mermory)中,环形缓冲区的默认大小位100MB,而当这些数据刷写到80%的时候,就会开始溢写到磁盘中去,那么溢写的过程中,会对数据进行分区(partition)和排序(sort)处理,然后每个map任务可能会产生多个(小)文件(这些小文件都采用了快速排序处理过),我们知道最后reduce任务会从map任务中拉取数据,对这些(小)文件进行拉取时会需要很多的网络IO以及磁盘IO的资源,那么,为了减少网络IO和磁盘IO的次数,我们会将多个(小)文件合并为一个(大)文件,该过程就是merge操作,使用hash partitional分区原理来分区,采用归并排序对分区中的数据排序,并且会根据map端中输入的key的不同去计算hash值,再去对指定的reduce的个数进行取余,reduce的个数是指提前设定好的,几个reduce(个数)就会产生几个分区,然而,相同的key的数据会进入到同一个reduce任务中,一个reduce任务中可以处理不同key的数据,因为不同数据key的hash值对reduce个数进行取余,最后得到的结果可能一样的,所以一个reduce任务中也有可能会有不同的key,最后每一个map任务会生成一个(大)文件,而这个(大)文件是经过分区和排序得到的,之后,会通过HTTP将每一个输出文件的特定分区的数据拉取到reduce任务中,等reduce任务阶段处理完后会将最终的结果写入到磁盘(也就是HDFS)中。
在执行mapreduce之前,原始数据被分割成若干split(切片),每个split作为一个map任务的输入。但是,当Hadoop处理很多小文件时(文件大小小于hdfs block大小),此时FileInputFormat不会对小文件进行划分,那么每一个小文件都会被当做一个split并分配一个map任务,这样就会有大量的map task运行,会导致效率非常底下。例如:一个1G的文件,会被划分成8个128MB的split,并分配8个map任务处理,而10000个100kb的文件会被10000个map任务处理,效率就会很低下。
Map任务的数量:
每一个InputSplit都有一个RecordReader类,其作用是把InputSplit中的数据解析成Record,即<k1,v1>。在TextInputFormat中的RecordReader是LineRecordReader,它会将每一行解析成一个<k1,v1>。其中,k1表示偏移量,而v1则表示行文本内容
InputFormat抽象类,只是定义了两个方法。
FileInputFormat
FileInputFormat是所有以文件作为数据源的InputFormat实现的基类,FileInputFormat处理作为job输入的所有文件,并实现了对输入文件计算splits的方法。至于获得记录的方法是有不同的子类——TextInputFormat进行实现的。
TextInputFormat extInputFormat是默认的处理类,主要用来处理普通文本文件,文件中每一行作为一个记录,它将每一行在文件中的起始偏移量作为key,每一行的内容作为value默认以\n或回车键作为一行记录
序列化 (Serialization)指将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。
序列化的目的就是为了跨进程传递格式化数据: 当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把这个对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为对象。把对象转换为字节序列的过程称为对象的序列化。把字节序列恢复为对象的过程称为对象的反序列化
YARN Client提交Application到RM,它会首先创建一个Application上下文对象,并设置AM必需的资源请求信息,然后提交到RM。YARN Client也可以与RM通信,获取到一个已经提交并运行的Application的状态信息等。
RM是YARN集群的Master,负责管理整个集群的资源和资源分配。RM作为集群资源的管理和调度的角色,如果存在单点故障,则整个集群的资源都无法使用。在2.4.0版本才新增了RM HA的特性,这样就增加了RM的可用性。
NM是YARN集群的Slave,是集群中实际拥有实际资源的工作节点。我们提交Job以后,会将组成Job的多个Task调度到对应的NM上进行执行。Hadoop集群中,为了获得分布式计算中的Locality特性,会将DN和NM在同一个节点上运行,这样对应的HDFS上的Block可能就在本地,而无需在网络间进行数据的传输。
Container是YARN集群中资源的抽象,将NM上的资源进行量化,根据需要组装成一个个Container,然后服务于已授权资源的计算任务。计算任务在完成计算后,系统会回收资源,以供后续计算任务申请使用。Container包含两种资源:内存和CPU,后续Hadoop版本可能会增加硬盘、网络等资源。
AM主要管理和监控部署在YARN集群上的Application,以MapReduce为例,MapReduce Application是一个用来处理MapReduce计算的服务框架程序,为用户编写的MapReduce程序提供运行时支持。通常我们在编写的一个MapReduce程序可能包含多个Map Task或Reduce Task,而各个Task的运行管理与监控都是由这个MapReduceApplication来负责,比如运行Task的资源申请,由AM向RM申请;启动/停止NM上某Task的对应的Container,由AM向NM请求来完成。
资源获取 获取Flink面试题,Spark面试题,程序员必备软件,hive面试题,Hadoop面试题,Docker面试题,简历模板等资源请去 GitHub自行下载 https://github.com/lhh2002/Framework-Of-BigData Gitee 自行下载 https://gitee.com/li_hey_hey/dashboard/projects