ps.惰性太大,四天没写,一定会补齐Nginx及Keepalived部分,哦还有之前的Linux的部分。一定要坚持下来!
单提Hadoop一般分为四部分(其他生态系统中的后续单独再写):
1、分布式存储系统HDFS:分布式存储系统、提供了高可靠性、高扩展性、高吞吐率的数据存储服务。
2、分布式计算框架MR(MapReduce):分布式计算框架(计算向数据移动)、易于编程 高容错 高扩展
3、分布式资源管理框架YARN:负责集群资源的管理与调度。
4、Hadoop Common :一些工具。
存储模型:
1、文件会线性切割成块(Block),偏移量至按照多大将文件切割(既Block块的大小),offset(下标)从0开始。
2、Block分散存储在集群节点之中。
3、单一Block大小一致、文件与文件可以不一直。(因为偏移量相同所以一致,因为可能不是整除所以不一致)
4、可以设置副本数,无序散列不同节点中。(副本数不能超过节点数量)
5、文件上传可以设置Block大小与副本数。
6、已上传的Block数量可以调整(场景:多个资源访问已有副本,导致无法再开启新进程),大小不变。
7、只支持一次写入多次读取(不可以修改),且同一时刻只能有一个写入者
8、可以append追加数据。
架构模型:
1、数据:数据本身及元数据
2、 NameNode(主节点)保存文件元数据:单节点。
3、DataNode(从节点)保存文件的Block数据。多节点
4、NameNode与DataNode之间保持心跳,DataNode主动向NameNode提交Block location(块的位置信息)。所以说NameNode掌握的信息分两类1、静态的:Block块的大小、ID等等 2、动态的:每个DataName提交的每个DataNode掌握的块的位置信息(Block location)。通过这两部分,NameNode掌握了所有的文件信息。如果心跳不通了(如DataNode节点挂掉),NameNode会删除该DataNode的掌握的信息。
5、HdfsClient为HDFS的客户端,HDFS文件的存与取由HdfsClient 和节点交互完成。HdfsClient与NameNode交互元数据信息,了解文件的块(Block)的位置信息,再与DataNode交互具体Block信息。
6、DataNode利用服务器的本地文件系统来存储数据块(Block).就是以文件的形式存储。
一下为Hadoop1.x的HDFS架构图,2.x,3.x后面再提
注意:SecondaryNameNode在2.X以后就没有了,这个不能与NameNode进行故障转移。他的作用:
HDFS设计思想:
各部分作用:
一、NameNode
1:基于内存存储,不会和磁盘发生交换(双向),持久化(单向)。
2、接受客户端的读写服务、收集DataNode收集的Block列表信息
3、保存的MetaData(元数据)信息:1、文件的owership和permissions(权限)。2、文件大小、时间。3、Block列表:Block偏 移量,位置信息(不会持久化)。4、Block每副本位置(由DataNode上报)。
4、NameNode持久化:
在持久化过程中会在磁盘中产生一个fsimage文件(fsimage文件是在Hadoop格式化(第一次启动Hadoop前进行的format操作,同时会产生custerid)时产生,会定时进行持久化)。Block位置信息不会存储到fsimage中。在fsimage没有进行定时持久化时通过edits.log辅助完成持久化。edits.log中记录了对MetaData的操作日志。当edits.log达到一定极限时(达到配置文件fs.checkpoint.period配置的时间间隔,默认3600S。或者fs.checkpoint.size设置的最大值,默认64M),由SecondaryNameNode节点将edits.log与fsimage进行合并成为fsimage.ckpt.然后将其返回给NameNode中替换fsimage.
所以,在项目启动时将fsimage加载到内存,展开恢复成MetaData,然后再在Edits.log中的执行,从而将上次启动的数据还原。
二、DataNode
1、DataNode是具体计算的角色,且维护自己所在的文件信息(以文件形式存储的Block数据)。
2、启动DataNode后会主动向NameNode会报Block信息。
3、同时存储Block的元数据信息(MD5验证文件,保证当前的Block文件在传输时的完整性)。在Block存入DataNode时同时有个MD5验证,在Block取出时通过验证保证文件完整性。如果不完整则向其他节点取该Block的副本。
4、发送心跳向NN(3秒一次),如果NN10分钟没有收到DN的心跳,则认为该节点的DN已经lost,并copy其上的Block到其他的DN,当然是从其他含有Block副本的节点上拷贝。
三、SecondaryNameNode
当edits.log达到一定极限时(达到配置文件fs.checkpoint.period配置的时间间隔,默认3600S。或者fs.checkpoint.size设置的最大值,默认64M),由SecondaryNameNode节点将edits.log与fsimage进行合并成为fsimage.ckpt.然后将其返回给NameNode中替换fsimage.
HDFS优点:
1、高容错:数据自动保存多个副本。副本丢失后自动恢复
2、适合批处理:移动计算而非数据。数据位置暴露给计算框架(Block偏移量)
3、适合大数据处理:GNTBPB及数据。百万规模以上的文件数量。数据大小限制>10K+节点
4、可构建在廉价的机器上:通过多副本提高可靠性,提供容错和恢复机制。
HDFS缺点:
1、低延迟数据访问(比如毫秒级,低延迟与高吞吐率)
2、小文件存取。占用NameNode大量内存。寻道时间超过读取时间。
3、不支持修改,只支持上传。且一个文件只能有一个写入者。仅支持append方式追加。
Block副本防止策略(下面与官网说法不一致,与源码内容一致):
第一个副本,如果客户端在集群内,则放置在上传文件的DataNode上,如果不在则随机挑选一台磁盘、cpu都有可用资源的DataNode.
第二个副本放置在与第一个副本不同的机架的另一台服务器上。第三个放在与第二个副本同机架的不同服务器上。
更多副本。随机节点。
HDFS文件写入流程:
切分文件Block.按Block线性和NN获取DN列表(副本数)。验证DN列表后以更小的单位流式传输数据(各节点两两通信确定可用)。Block传输结束后:1、DN向NN汇报Block信息。2、DN向Client汇报完成。3、Client向NN汇报完成。
获取下一个Block存放的DN列表。…最终Client汇报完成。NN会在写流程更新文件状态。
HDFS读文件流程:
1、和NN获取一部分Block位置列表(既block location,一部分是指会找到最近的副本)
2、线性和DN获取Block,最终合并为一个文件。
3、Block副本列表按距离择优选取
4、MD5验证数据完整性
HDFS文件权限
遵循POSIX标准(可移植操作系统接口)
1、与Linux文件权限类似。rw读写 x对于文件忽略,对于文件夹表示是否允许访问其内容
2、Linux系统用户A使用Hadoop命令创建一个文件,那么这个文件在HDFS中的ower就是A
3、HDFS权限不足:HDFS相信你告诉他是谁,他就认为你是谁。(3.x以后改变了an)
安全模式:
–namenode启动的时候,首先将映像文件(fsimage)载入内存,并执行编辑日志(edits)中的各项操作。
–一旦在内存中成功建立文件系统元数据的映射,则创建一个新的fsimage文件(这个操作不需要SecondaryNameNode)和一个空的编辑日志。
–此刻namenode运行在安全模式。即namenode的文件系统对于客服端来说是只读的。(显示目录,显示文件内容等。写、删除、重命名都会失败,尚未获取动态信息)。
–在此阶段Namenode收集各个datanode的报告,当数据块达到最小副本数以上时,会被认为是“安全”的, 在一定比例(可设置)的数据块被确定为“安全”后,再过若干时间,安全模式结束
–当检测到副本数不足的数据块时,该块会被复制直到达到最小副本数,系统中数据块的位置并不是由namenode维护的,而是以块列表形式存储在datanode中。
所有角色及内容:
搭建伪分布式Hadoop1.0:
先检查防火墙,selinux配置,hosts文件映射、hostname设置。
1、本机免秘钥登录:ssh-keygen -t dsa -P ‘’ -f ~/.ssh/id_dsa 执行后
2、将公钥追加到验证文件:cat id_dsa.pub >> authorized_keys,(可能多个秘钥)
3、本地免秘钥完成
4、解压文件:tar xf hadoop-2.6.5.tar.gz -C /opt/soft/
5、在/etc/profile中追加环境变量
注意:hadoop启动会加载hadoop项目下etc下的配置文件:
6、将这三个文件中的Java_home重新设置一下。
7、修改core-site.xml:意思为添加主节点信息。注意不要写IP,一定要用别名。
8、修改hdfs-site.xml:添加副本数。以为是伪分布式只有一个节点所以只能是1.
9、处理DataNode节点。Hadoop2.X中DataNode节点在slave中。将内容改为别名
10、core-site.xml中:添加配置此处配置的是fsimage文件、clusterid文件、DataNode数据文件的存储位置,默认在/tmp下 所以需要修改
11、hdfs-site.xml:添加SecondaryNamenode地址。
12、hdfs namenode -format 初次开启时格式化
13、start-dfs.sh启动hadoop.后正常访问。
14、客户端命令 :hdfs dfs -mkdir -p /user/root创建目录
hdfs dfs -D dfs.blocksize=1048576 -put test.txt /user/root 上传文件。
关闭Hadoop:stop-dfs.sh