1、四大机制
1.1、心跳机制(集群节点之间时间同步)
namenode是集群的老大,负责集群上任务的分工,如果要进行分工,则必须知道各个从节点的存活状态(主要通过DataNode定期(默认每隔3s秒dfs.heartbeat.interval参数设置)的向NameNode发送心跳报告(10次))。
namenode什么时候回判定datanode死了?
当namenode连续10次没有收到datanode的心跳报告就任务datanode可能死了,这个时候namenode会主动向datanode发送一次检查,发送时间5min(两次)。也就是说namenode最终判断datanode死亡需要630s,630秒钟没有得到datanode的信息才认为当前datanode宕机。
1.2、安全模式
集群启动的时候namenode需要做哪些事情
1.2.1、元数据:1、抽象目录树;2、数据和块的映射关系hadoop.tar.gz blk_1 blk_2;3、数据块存储的位置信息;
1.2.2、元数据存储的位置:
内存:读写快,但是一旦关机会造成数据丢失,所以元数据既在内存中又在磁盘中存储元数据;1,2,3
磁盘:元数据如果存储在磁盘,那么每次进行文件读写的时候操作的时候,都会进行磁盘读写,必然会造成读写的性能比较低,很显然集群在正常启动之后,文件的读写的元数据应该不在磁盘;1,2
当集群第一次启动的时候,首先会将磁盘元数据加载到内存中,如果磁盘元数据过大会造成加载到内存的时间过长,所以磁盘中的元数据值存储了1,2两部分。namenode的内存元数据的3是什么时候获取的,是通过心跳报告的,集群在启动的时候NameNode会接收到datanode的心跳报告,这个心跳报告中还包含数据块的存储位置信息,这个时候namenode就可获取datanode的数据块的存储状况
集群启动的时候后:
1、namenode启动的时候,namenode将元数据加载内存中
2、datanode启动,namenode接收datanode的心跳报告;1)获取datanode的存活状况;2)获取块的存储信息;99%机器的心态哦报告接收到
3、启动secondaryNamenode
集群在执行这个过程的时候不允许外界对结群进行操作的,这个时候集群处于安全模式。
也就是说集群处于安全模式的时候在加载元数据和获取datanode的心跳报告。
如果集群处于维护或升级时候也可以手动将集群设置安全模式状态。
hdfs dfsadmin -safemode enter 进入安全模式
hdfs dfsadmin -safemode leave 退出安全模式
hdfs dfsadmin -safemode get 获取安全模式的状态、安全模式是否开启ON OFF
hdfs dfsadmin -safemode wait 等待自行退出安全模式
安全模式下用户可以进行的操作(不修改原数据的操作): ls查询、cat查看文件内容、get下载
安全模式下用户不可以进行的操作(修改了元数据的操作):创建目录、上传、修改文件名、文件追加
secondaryNamenode(主要作用减轻namenode压力,将edit是编辑日志文件和fsimage镜像文件进行合并)执行流程:
1、周期性发送请求给NN,获取fsimage和edits;
2、NN收到请求后,生成一个空的edits.new文件
3、NM给SNN发送fsimage和edits
4、SNN将fsimage文件加载到内存,合并edits文件
5、snm生成新的镜像文件fsimage.ckpt
6、SNN发送fsimage.ckpt给NN
7、NN将fsimage.ckpt替换fsimage文件,将edits.new重命名为edits文件
1.3、机架策略
副本存放机制,默认三个副本。
第一个副本默认存放在客户端所在节点上,第二个副本存储在和第一个不同机架上的任意节点上(防止同一个机架断电,数据访问不到),第三个副本存储在和第一个副本相同的机架上的不同节点上(在风险度相同的情况下,优先选择网络传输少的)。
真实生存中需要手动配置机架策略。
真实生存中我们可以自定义机架策略:不同节点,不同机架,不同数据中心..................................
1.1、负载均衡(每个节点上面存储的数据占比相差不大,能力越大责任越大)
在进行文件上传的时候回优先选择客户端所在节点,如果习惯性使用同一个客户端回造成客户端所在节点存储的数据比较多。集群会有一个自动的负责均衡的操作,只不过这个负载均衡的操作比较慢。
dfs.datanode.balance.bandwidthPerSec=10485760 (10M/s)这个参数是限制负载均衡的带宽。在集群空闲的情况下集群自动的负载均衡对于小规模是可以的,如果集群规模特别大的时候,会花费的时间比较过长,等不及,这个时候需要手动负载均衡start-balancer.sh但是这个命令不会立即执行,等待hadoop集群空闲的时候。
负责均衡也不会存在绝对的负责均衡。在手动进行负载均衡的时候开业指定一个参数start-balancer.sh -t 10%
指定两个节点的存储占比不超过10%则认为已经达到了负载均衡。负责均衡主要发生在添加新节点的时候。
2、两大核心