HDFS:hadoop实现的一个分布式文件存储系统,是主/从(Mater/Slave)体系结构,是基于流
数据模式访问和处理超大文件的需求而开发的。它所具有的高容错、高可靠性、高可扩展性、高吞吐率等特征为海量数据提供了,是主从架构,分为namenode,datanode,secondaryNamenode。
Namenode:是master
1、管理 HDFS 的名命空间(
a.文件名称
b.文件目录结构
c.文件属性(权限 创建时间 副本数)
d.文件对应的哪些块(副本块)–>块对应在哪些DN节点上,这些都是在内存中动态维护的,不会持久化到存储这个map映射关系,一般是集群启动和运行时,dn定期(6小时)的发送blockreport(块报告)给nn,那么nn就在内存中动态维护这种映射关系)2、管理数据块(Block)映射信息
3、配置副本策略
4、处理客户端读写请求。
DataNode:就是Slave。NameNode 下达命令,DataNode 执行实际的操作。
1、存储实际的数据块。
2、执行数据块的读/写操作。
与NN通信:通过RPC协议
a.默认每隔3秒向nn发送一个心跳包 配置参数 dfs.heartbeat.interval ,该参数不要调)
b.每隔6小时发送一次blockreport 块报告,配置参数 dfs.blockreport.intervalMsec
SecondaryNamenode:
定期合并NN节点的fsimage+editlog为新的fsimage,推送给NN,简称checkpoint检查点,配置参数为 dfs.namenode.checkpoint.period默认为3600s和dfs.namenode.checkpoint.txns 默认为1000000条事务,这两个参数都可以,意思就是说当时间到1小时了或者是事务到了100万条也会进行一次合并
HDFS特点:
1.能够运行在廉价机器上,硬件出错常态,需要具备高容错性
2.流式数据访问,而不是随机读写
3.面向大规模数据集,能够进行批处理、能够横向扩展
4.简单一致性模型,假定文件是一次写入、多次读取
HDFS缺点:
1.不支持低延迟数据访问
2.不适合大量小文件存储(因为nn维护一个小文件大概需要250byte的内存,如果小文件过多首先nn就会承受不住,其次也不利于我们的计算任务)
3.不支持并发写入,一个文件只能有一个写入者
4.不支持文件随机修改,仅支持追加写入
HDFS读流程:
1.Client通过DistributedFileSystem对象的open方法,传入一个path路径,然后与nn节点进行RPC协议通信,校验是否有权限以及要读取的文件是否存在,如果都满足,则返回一个FSDataInputStream对象,里面包括要读取文件的部分或者全部的block的位置信息
2.Client调用FSDataInputStream对象的read方法,找与Client网络最近的一个Datanode进行读取,读取完成后会以packet为单位来check校验,如果没问题会关闭与当前DN的通信,如果读取失败,则会记录该信息然后去该数据块的另一个副本进行读取
3.当第一个Datanode读取完成后,开始读取第二个Datanode,重复以上
4.假如block列表读取完毕后该文件还未读取结束,则FileSystem会从NN获取下一批次的block列表,继续读取
5.当该文件读取完成后,Client会调用FSDataInputStream对象的close方法关闭输入流
HDFS写流程:
1.Client调用DistributedFileSystem对象的create方法,传入一个path路径,然后通过RPC协议与NN通信,检查是否有权限创建文件以及该路径是否可存,如果都满足,则创建一个新文件,并返回一个FSDatanodeStream对象,如果不满足,则直接返回一个错误
2.Client将文件进行切分,然后调用FSDataOutputStream对象的write方法开始向第一个Datanode的第一个副本写数据,当第一个副本写完后,由DN完成副本的复制,然后开始向第二个Datanode写
3.当所有数据块都写入完成并收到所有Datanode的packet包校验没问题后,表示写入完成
4.Client调用DistributedFileSystem对象的close方法,关闭输出流
5.Client调用DistributedFileSystem对象的complete方法,告知NN写入成功