主要的角色:
客户端:负责发起或提交读写请求(如果往HDFS上存储数据或获取数据,就要告诉客户端)。
namenode:HDFS的核心负责全局协调,做任何事都要向这里汇报,和把控所有的请求。
datanode:数量不定,负责数据的 存储。
把数据写到HDFS的集群的过程
1.用户向客户端请求服务
请求角色:1.hdfs shell2.JAVA API 1.要将数据分为128M的块2.以三副本的方式存储
作为客户端默认:1.大的文件要拆分为128M或64M
2.文件以多副本的方式存储(最少为3)
2.客户端拿到数据
客户端拆分为2块 客户端请求namenode(1个128的块和3个副本)
namenode工作: namenode想客户端返回信息:
1.三个副本需要是三个datanode 1.含有三个datanod,并按距离排序
2.考虑资源调度
客户端向datanode写数据,datanode1将相同的数据写到datanode2,datanode2完成统一的动作给datanode3
写数据的方式以流水线的方式完成(通俗讲就是数据进来一点写一点,直到写完)
数据写完后告诉namenode 1. namenode和客户端知道第一个块以写完
2.客户端以相同的步骤完成剩下的块
完成所有写入数据后关闭数据流 总结:客户端:拆分文件
namenode:提供块在datanode中的地址
datanode:存储数据,并以流水线的方式将数据写完
从HDFS中读取数据
用户想客户端发起读取数据的请求 客户端向namenode发起请求:告诉它文件名
namenode通过计算告诉客户端源数据信息 客户端知道信息,向块发起请求
(块在datanode中的位置,副本多少,几个块)
客户端向datanode发起请求,
datanode将数据返回客户端
HDFS的优点:
数据冗余(多副本方式存储)
处理流式的数据访问(一次写入,多次读取的操作)
适合存储大文件的方式
可构建在廉价的机器上面
HDFS的缺点:
低延迟的数据访问
不适合小文件的存储(重):不管是1M还是127M,都要存储128M,然后产生源数据,若小文件很多,则给namenode带来很多压力