1、hadoop安全模式
NameNode存放的是元数据信息(包括块(block)在哪个位置,所有者,大小等等),元数据信息放到内存中,而内存一断电就会丢失数据,于是产生了映像文件(fsimage)和edits(编辑日志),fsimage会定期合并edits,这时候edits被fsimage合并后,再重新创建一个edits继续写用户的操作日志,避免edits过大,再被fsimage合并时执行时间过长。
当集群重启的时候,先读取fsimage的数据,再执行edits的操作,此时处于安全模式,都是只读的,增删重命名都不行,此时namenode收集datanode的心跳(3s一次,10分钟收不到默认dn挂掉),心跳向namenode汇报我起来了有那些块等,当数据块达到最小副本,再过一段时间,安全模式结束。系统中块位置不由namenode维护,由datanode向namenode发送心跳,如果有没起来的datanode,块会被复制到其他节点。
为什么不把位置信息直接存放到fsimage中?如果集群中某台datanode没起来,那就完蛋了
如果数据量过大,重启集群30分钟+退出安全模式 。
2、hadoop为什么不支持修改
hadoop由块存储,记录了块,块里记录了对于整个文件的偏移量offset,如果对某一个块修改了导致偏移量的改变(例如超出了128m,数据后移),那么这个块后面的所有偏移量都会错乱,如果更改元数据信息弊大于利,hadoop就去掉了修改。
3、hadoop读写
客户端向nn申请写文件,申请第一个块(128m),nn找到3台机器(按照和客户端距离排序,减少网络io),用户和距离他最近的一台机器进行写,这128m会分成很多小块4k或者多少,向第一台dn传输,然后第一台dn再向第二台dn传输,第二台dn再向第三台传输,管道传输,缩短时间,也可以称之为并行,假如传输过程中一台dn挂掉,继续传输到完成,然后nn收到dn的心跳,有一台挂掉,找一台dn复制数据到另一台dn,最后nn告诉客户端上传成功。
块在存到磁盘会进行md5加密,在读取的时候再加密一次,对比两次的字符串,不同即为被破坏
客户端读取的时候,距离优先,可以随机读取哪个块,偏移量多少
零散
副本越多,越冗余,支持的并行计算越高,副本不能超过节点数
同时hadoop集群就有负载均衡的能力,多个副本,多人访问,访问不同的机器上的副本,负载均衡。
块,位置信息,偏移量
有的服务器2亿,是一个套餐,定制的关系型内存数据库HANA,2T内存
思科:接入层(交换机),汇聚层,核心层,树形架构。谷歌:全是汇聚层,很多,复杂。
机架
塔式机,机架,刀片机
机架上有电源,交换机等,hadoop存数据时,第一个块在本地,加入客户端在集群中,副本一定是其他机架上的一个主机。