关于hadoop的写入(存入)
nn里面维护了一份元数据。
客户端在存入的数据的时候先经过nn,查要存入的数据是否存在(通过元数据查询),如果存在就返回拒绝写入,若不存在,就开始返回可以往集群里面写入,而且还分配存入那些dn。客户端程序就开始找相应的nn,将相应的block块存进去(切分是由客户端切分的)。
关于副本
客户端在存入数据的时候只是将数据块block0存入相应的机器,然后由被存入的机器(nn)开始复制副本1,副本1复制给副本2,block0是这一连串的复制的发起者,block0必须收到副本1的正确的响应才能算成功,同理,副本1要收到副本2的正确响应才算复制成功。
成功的响应流程,副本2复制成功,响应副本1节点,副本1节点收到响应然后响应block0节点,然后整个写入数据成功。
关于元数据的存储
nn存放元数据,磁盘肯定是由一份数据,是由sn处理合并edits 和fsimage
元数据存储位置
/home/hadoop/tmp/dfs/data/current
元数据的存储格式:
/test/a.log, 3 ,{blk_1,blk_2},[{blk_1:[h0,h1,h3]},{blk_2:[h0,h2,h4]}]
解释:a.log这个文件有3个副本,两个文件块blk_1,blk_2,每个文件块的副本在h0,h1,h3和h0,h2,h4这几台机器上的datanode上
DN
配置文件块的大小,在hdfs-site.xml的dfs.block.size的数据项,副本数量dfs.replication
文件块的存储位置:
/home/hadoop/tmp/dfs/data/current/BP-1492359729-192.168.2.100-1528065072236/current/finalized
奇异组合:
拿到block的文件位置,取出文件块,将其追加组合,解压后就可编程原来的文件,说明hadoop并没有对文件进行重新编码,单纯的将文件进行了切割。
关于hadoop启动时,报ssh: Could not resolve hostname xxx: Name or service not known
很恶心,解决方法:
在/etc/profile文件中添加:
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_OPTS=-Djava.library.path=$HADOOP_HOME/lib
1.
2. 注意:是export HADOOP_OPTS=-Djava.library.path=$HADOOP_HOME/lib,而不是export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib"
关于nn的工作特点:
1、Namenode始终在内存中保存metedata,用于处理“读请求”
2、到有“写请求”到来时,namenode会首先写editlog到磁盘,即向edits文件中写日志,成功返回后,才会修改内存,并且向客户端返回
3、Hadoop会维护一个fsimage文件,也就是namenode中metedata的镜像,但是fsimage不会随时与namenode内存中的metedata保持一致,而是每隔一段时间通过合并edits文件来更新内容。Secondarynamenode就是用来合并fsimage和edits文件来更新NameNode的metedata的。
secondary namenode的工作流程
secondary通知namenode切换edits文件
secondary从namenode获得fsimage和edits(通过http)
secondary将fsimage载入内存,然后开始合并edits
secondary将新的fsimage发回给namenode
namenode用新的fsimage替换旧的fsimage
什么时候checkpiont
fs.checkpoint.period 指定两次checkpoint的最大时间间隔,默认3600秒。
fs.checkpoint.size 规定edits文件的最大值,一旦超过这个值则强制checkpoint,不管是否到达最大时间间隔。默认大小是64M。