Hadoop
Posted 卡尼慕
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hadoop相关的知识,希望对你有一定的参考价值。
这是Hadoop的第2篇文章
基础概念
分布式概念
分开的分散的部署或布置具有多个不同功能或组件组成一个完整的系统,不同功能和组建搭建或部署到不同的节点。
如下图,10TB的文件不能在一个机器上运行,因此可以将这10TB的文件分成用十个机器处理这10TB,平均下来每台机器分到1TB 的文件,大幅度减小机器的压力以及对文件处理的效率。
Hadoop三种运行方式
1.独立(本地)运行模式:无需任何守护进程,所有的程序都运行在同一个JVM上执行。在独立模式下调试MR程序非常高效方便。所以一般该模式主要是在学习或者开发阶段调试使用 。
2.伪分布式模式: Hadoop守护进程运行在本地机器上,模拟一个小规模的集群,换句话说,可以配置一台机器的Hadoop集群,伪分布式是完全分布式的一个特例。
3.完全分布式模式:Hadoop守护进程运行在一个集群上。
HDFS
Hadoop分布式文件系统(Hadoop Distributed File System)被设计成适合运行在通用硬件上的分布式文件系统。
HDFS是一个高度容错性的系统,适合部署在廉价的机器上。HDFS能提供高吞吐量的数据访问,非常适合大规模数据集上的应用。HDFS放宽了一部分POSIX约束,来实现流式读取文件系统数据的目的。
HDFS是一个主从结构,一个HDFS集群是由一个名字节点,它是一个管理文件命名空间和调节客户端访问文件的主服务器,当然还有一些数据节点,通常是一个节点一个机器,它来管理对应节点的存储。HDFS对外开放文件命名空间并允许用户数据以文件形式存储。
内部机制是将一个文件分割成一个或多个块,这些块被存储在一组数据节点中。名字节点用来操作文件命名空间的文件或目录操作,如打开,关闭,重命名等等。它同时确定块与数据节点的映射。数据节点负责来自文件系统客户的读写请求。数据节点同时还要执行块的创建,删除,和来自名字节点的块复制指令。
NameNode
主节点,存储文件的元数据如文件名,文件目录结构,文件属性(生成时间,副本数,文本权限),及每个文件的块列表和块所在的DataNode的位置。
DataNode
从节点,在本地文件系统存储文件块数据,及数据的校验和。
SecondaryNamenode
用于监控HDFS状态的辅助后台程序,每隔一段时间获取HDFS元数据的快照。
Client
文件切分。文件上传 HDFS 的时候,Client 将文件切分成 一个一个的Block,然后进行存储。
与 NameNode 交互,获取文件的位置信息。
与 DataNode 交互,读取或者写入数据。
Client 提供一些命令来管理 HDFS,比如启动或者关闭HDFS。
Client 可以通过一些命令来访问 HDFS。
HDFS写数据流程
1)客户端向namenode请求上传文件,namenode检查目标文件是否已存在,父目录是否存在。
2)namenode返回是否可以上传。
3)客户端请求第一个 block上传到哪几个datanode服务器上。
4)namenode返回3个datanode节点,分别为dn1、dn2、dn3。
5)客户端请求dn1上传数据,dn1收到请求会继续调用dn2,然后dn2调用dn3,将这个通信管道建立完成
6)dn1、dn2、dn3逐级应答客户端
7)客户端开始往dn1上传第一个block(先从磁盘读取数据放到一个本地内存缓存),以packet为单位,dn1收到一个packet就会传给dn2,dn2传给dn3;dn1每传一个packet会放入一个应答队列等待应答
8)当一个block传输完成之后,客户端再次请求namenode上传第二个block的服务器。(重复执行3-7步)
NameNode
namenode又称为名称节点,是负责管理分布式文件系统的命名空间(Namespace),保存了两个核心的数据结构,即FsImage和EditLog。 你可以把它理解成大管家,它不负责存储具体的数据。
Fslmage:用于维护文件系统树以及文件树中所有的文件和文件夹的元数据。
EditLog:操作日志文件,记录了所有针对文件的创建、删除、重命名操作。
这里的fsimage可以理解为“快照”,每隔一段时间就会对当前的状态进行自动存储,但是往往系统是不能进行实时快照的,因此需要edits来进行辅助。
如上图,即可理解为:fsimage+edits=当前状态。
namenode在启动时候会自动读取加载fsimage文件和edits文件来还原之前的系统状态。
DataNode
datanode数据节点,用来具体的存储文件,维护了blockId 与 datanode本地文件的映射。 需要不断的与namenode节点通信,来告知其自己的信息,方便nameode来管控整个系统。
块
在HDFS中,文件是以块(block)的形式存储的,而HDFS的设计初衷也是用来处理大文件的,使用抽象块正好可以满足这一需求。具体来说,比如一个很大的文件,在单一的节点上存储是不可能的,HDFS使用逻辑块的方式将这个很大的文件分成很多块,分别存储在各个节点机器上,从而实现了大文件的存储。
使用抽象块作为操作的单元,方便了存储系统的管理,具体来说,就是把文件块放在DataNode上存储,把文件的元数据信息放到NameNode上管理。
一般块默认的大小为128M,而一个block块,会开启一个map来处理。
那么就有下面两个问题了:
Question:129M数据需要开几个map?
Answer:1个!
为什么不是两个呢?这里就有一个机制:假如最后一个文件的输入小于128*1.1M(也就是多百分之10),那么只会启动一个map来执行这个job。
Question:522M数据需要开几个map?
Answer:4个!
第一个:128M
第二个:128M
第三个:128M
第四个:138M(138 < 128*1.1)
所以最后一个map处理138M。
机架感知(副本节点选择)
第一个副本在client所处的节点上。如果客户端在集群外,随机选一个。
第二个副本和第一个副本位于相同机架,随机节点。
第三个副本位于不同机架,随机节点。
HDFS的优点
1、上传的数据保存在多个副本,通过增加副本的额数来增加容错率。
2、如果HDFS某个副本丢失,全复制其他机器上的副本,拷贝到自己的磁盘。
3、处理超大文件
4、运行于廉价计算机集群。
5、流式访问数据
HDFS的缺点
1、不适合大量小文件(淘宝开源了文件系统TFS)。
2、不适合处理低延迟数据的访问。
3、不支持用户的写入及任意地修改文件。即一个文件只能由一个线程来写,不能多个同时写,支持文件追加,但不支持随意修改。
向左滑动
程序猿
改变世界
以上是关于Hadoop的主要内容,如果未能解决你的问题,请参考以下文章