今天主要回顾一下hadoop学习时候的重要知识点,以及mr提交作业时候的流程、数据块副本放置策略等等
NameNode管理文件系统的命名空间
以两种方式在NameNode本地进行持久化:
命名空间镜像文件(fsimage)和编辑日志(edits log)
fsimage很大,GB级别;edits log只追加的文件
fsimage文件不记录每个block所在的DataNode信息,这些信息在每次系统启动的时候从DataNode重建。之后DataNode会周期性地通过心跳包向NameNode报告block信息。DataNode向NameNode注册的时候NameNode请求DataNode发送block列表信息。
存储结构
in_use.lock文件用于NameNode锁定存储目录。这样就防止其他同时运行的NameNode实例使用相同的存储目录。
edits表示edits log日志文件
fsimage表示文件系统元数据镜像文件
NameNode在checkpoint之前首先要切换新的edits log文件,在切换时更新seen_txid的值。
当文件系统客户端进行了写操作(例如创建或移动了文件),这个事务首先在edits log中记录下来。NameNode在内存中有文件系统的元数据,当edits log记录结束后,就更新内存中的元数据。内存中的元数据用于响应客户端的读请求。
用户的操作是一个事务,每个操作NN都要先将操作记录到edits log中,如果给NN指定了多个目录,则在多个目录中都存在edits log文件,用户的操作要在多个目录中都写完成,才让NN同步数据到内存中。当NN在内存中也同步了数据,就返回客户端success。
edits log会随着对文件系统的操作而无限制地增长,这对正在运行的NameNode而言没有任何影响,如果NameNode重启,则需要很长的时间执行edits log的记录以更新fsimage(元数据镜像文件)。在此期间,整个系统不可用。
在系统启动期间,NameNode合并fsimage+edits log
SecondaryNameNode就是为NameNode内存中的文件系统元数据生成检查点(checkpoint),定期合并fsimage和edits log。
工作流程如图所示
1、Secondarynamenode请求namenode生成新的edits log文件并向其中写日志。NameNode会在所有的存储目录中更新seen_txid文件
2、SecondaryNameNode通过HTTP GET的方式从NameNode下载fsimage和edits文件到本地。
3、SecondaryNameNode将fsimage加载到自己的内存,并根据edits log更新内存中的fsimage信息,然后将更新完毕之后的fsimage写到磁盘上。
4、SecondaryNameNode通过HTTP PUT将新的fsimage文件发送到NameNode,NameNode将该文件保存为.ckpt的临时文件备用。
5、NameNode重命名该临时文件并准备使用。此时NameNode拥有一个新的fsimage文件和一个新的很小的edits log文件(可能不是空的,因为在SecondaryNameNode合并期间可能对元数据进行了读写操作)。管理员也可以将NameNode置于safemode,通过hdfs dfsadmin -saveNamespace命令来进行edits log和fsimage的合并。
Secondarynamenode就是通过HTTP GET/PUT的方法,将namenode中的镜像文件和编辑日志更新到fsimage上,然后namenode再进行操作。
1、SecondaryNameNode中checkpoint目录布局(dfs.namenode.checkpoint.dir)和NameNode中的一样。
2、如果NameNode完全坏掉(没有备用机,也没有NFS),可以快速地从SecondaryNameNode恢复。有可能丢数据
1、HDFS块数据存储于blk_前缀的文件中,包含了被存储文件原始字节数据的一部分。
2、每个block文件都有一个.meta后缀的元数据文件关联。该文件包含了一个版本和类型信息的头部,后接该block中每个部分的校验和。
1、文件线性切割成块(Block)(按字节切割)
2、Block分散存储在集群节点中
3、单一文件Block大小一致,文件与文件可以不一致
4、Block可以设置副本数,副本分散在不同节点中
a) 副本数不要超过节点数量
b) 承担计算
c) 容错
5、文件上传可以设置Block大小和副本数
6、已上传的文件Block副本数可以调整,大小不变
7、只支持一次写入多次读取,同一时刻只有一个写入者
对同一个文件,一个时刻只有一个写入者
8、可以append追加数据
第一个副本:放置在上传文件的DN;如果是集群外提交,则随机挑选一台磁盘不太满,CPU不太忙的节点。
第二个副本:放置在于第一个副本不同的 机架的节点上。
第三个副本:与第二个副本相同机架的节点。
1、每个文件和目录都和一个拥有者和组相关联。
2、文件或者目录对与拥有者、同组用户和其他用户拥有独立的权限。
3、对于一个文件,r表示读取的权限,w表示写或者追加的权限。对于目录而言,r表示列出目录内容的权限,w表示创建或者删除文件和目录的权限,x表示访问该目录子项目的权限。
4、默认情况下hadoop运行时安全措施处于停用模式。一个客户端可以在远程系统上通过创建和任意一个合法用户同名的账号来进行访问。 hadoop root
5、安全措施可以防止用户或自动工具及程序意外修改或删除文件系统的重要部分。(dfs.permissions.enabled属性)。防止好人做错事。
6、超级用户是namenode进程的标识。对于超级用户,系统不会执行任何权限检查。
在NameNode安全模式(safemode)
通过命令查看namenode是否处于安全模式:
$ hdfs dfsadmin -safemode get
Safe mode is ON
*此处搭建方式不会再一一举例,仅陈述下所搭建方式的作用区别。
再节点上安装运行 Hadoop
单台服务器放不下,切块,将块打散放在各个datanode中
hadoop官网地址:http://hadoop.apache.org
中文文档:http://hadoop.apache.org/docs/r1.0.4/cn
node01 | node02 | node03 | node04 |
---|---|---|---|
Namenode | SecondaryNameNode | ||
- | DataNode-1 | DataNode-2 | DataNode-3 |
需要四台服务器来搭建
解决HDFS 1.0中单点故障和内存受限问题,HDFS2.x中Federation和HA分离,HA只能有两个NameNode
手动HA
自动HA
基于zookeeper实现
解决内存受限问题
HDFS Federation(联邦);水平扩展,支持多个NameNode;
(1)所有NameNode共享所有DataNode存储资源
(2)每个NameNode分管一部分目录;
个人总结:hdfs客户端创建请求给FileSystem,FileSystem发起对namenode的一个RFC连接,请求创建文件;检查通过之后返回给FSDataOutputStream来进行封装并且给datanode来写数据,封装好的对象发送给第一个datanode,第一个datanode将接收到的数据发送给第二个datanode,第二个发送给第三个…;当客户端传输完数据后,调用close方法,该方法将数据队列中的剩余数据包写到datanode的管线并等待管线的确认;8. 客户端收到管线中所有正常datanode的确认消息后,通知namenode文件写完了。
个人总结:客户端通过open方法打开希望读取的文件,DistributedFileSystem通过RFC调用namenode,来确定block的地址;FSDataInputStream调用read方法,连接距离最近的datanode,通过反复调用read方法,将数据传输到客户端,到达block的末端时,关闭该datanode,寻找下个新的block;一旦客户端完成读取,调用close方法。
相同”key的键值对为一组调用一次reduce方法,方法内迭代这一组数据进行计算分组比较器
1、根据业务需求处理数据并映射为KV模型
2、并行分布式
3、计算向数据移动
Reduce:
1、数据全量/分量加工
2、Reducer中可以包含不同的key 分区的范围大于分组
3、相同分区的Key汇聚到一个Reducer中
4、“相同”的Key调用一次reduce方法
5、排序和比较实现key的汇聚