客户端读取写流程
HDFS读写流程
写流程
1、客户端向NameNode发起请求,需要存储数据Data
2、因为NameNode中是记录了所有DataNode的相关信息的,而数据最终要保存的地方就是DataNode,所以NameNode会返回可用的DataNode的信息给客户端
3、将Data分为1和2这两个数据块
4、客户端会将数据块存储到NameNode返回给他的DataNode1中去
5、因为数据块需要存储多份,所以DataNode之间会相互传输来进行存储
6、DataNode存储完数据后,会反馈给NameNode,NameNode会将对应的DataNode的相关信息进行更新
总结:客户端向NameNode发起写数据请求分块写入DataNode节点,DataNode自动完成副本备份,DataNode向NameNode汇报存储完成,NameNode通知客户端
2、读流程
HDFS读流程
1、客户端向NameNode发起请求,需要获取名字为1的数据块
2、NameNode中保存了该数据块存储的位置,将DataNode的信息返回给客户端
3、客户端就近的方式去从DataNode获取数据
4、如果某个DataNode无法访问
5、从另一个DataNode中去获取数据
总结: 客户端向NameNode发起读数据请求, NameNode找出距离最近的DataNode节点信息, 客户端从NameNode分块下载文件
3、垃圾回收时间
以分钟为单位的垃圾回收时间,垃圾站中数据超过此时间,会被删除。如果是0,垃圾回收机制关闭。
Fs.trash.interval=1天
将其修改为
Fs.trash.interval=7天(该配置解决数据误删)
4、检查点垃圾回收时间
以分钟为单位的垃圾回收检查间隔。应该小于或等于fs.trash.interval。如果是0,值等同于fs.trash.interval。每次检查器运行,会创建新的检查点。
fs.trash.checkpoint.interval则是指垃圾回收的检查间隔,应该是小于或者等于fs.trash.interval, 如果是0,值等同于fs.trash.interval。每次检查器运行,会创建新的检查点。
5、NameNode 处理程序计数
dfs.namenode.handler.count namenode, dfs.datanode.handler.count中用于处理RPC的线程数,默认是32,如果该值设的太小,明显的状况就是DataNode在连接NameNode的时候总是超时或者连接被拒绝, 需要注意的是,每添加一个线程,需要的内存增加。
6、最大传输线程数
dfs.datanode.max.xcievers, dfs.datanode.max.transfer.threads对于datanode来说,就如同linux上的文件句柄的限制,当datanode 上面的连接数超过配置中的设置时,datanode就会拒绝连接,一般都会将此参数调大,8192左右
7、NameNode的java堆栈
NameNode内存详解
NameNode管理着整个HDFS文件系统的元数据。
NameNode内存的组成
NameNode内存主要由Namespace、BlocksMap、NetworkTopology及其它部分组成
Namespace:维护整个文件系统的目录树结构及目录树上的状态变化;
BlockManager:维护整个文件系统中与数据块相关的信息及数据块的状态变化;
NetworkTopology:维护机架拓扑及DataNode信息,机架感知的基础;
备注:NameNode常驻内存主要被Namespace和BlockManager使用,二者使用占比分别接近50%。其它部分内存开销较小且相对固定,与Namespace和BlockManager相比基本可以忽略。
8、元数据占用内存空间说明
估计总大小(bytes)
文件名长度:128
目录名长度:128
块X3(副本数):128X3=384
9、NameNode元数据内存估算举例
文件数量:10 600 000
目录数量:310 000
块数量:13 300 000
计算元数据需要内存: 128x 10600000+128x310000 +384x13300000 = 6503680000(bytes)≈ 7G 实际测算:在该NameNode实际使用内存8G。 实际计算中内存更大是因为内存中除了元数据还有其他信息。
10、影响namenode节点消耗内存
1.block个数
2.文件名称的长度
3.系统目录的个数
secondary namenode需要的内存与namenode需要的内存大概一样。
1GB内存可以管理百万个block文件,建议将其调整为8GB
11、JournalNode放在管理服务器
两个NameNode为了数据同步,会通过一组称作JournalNodes的独立进程进行相互通信。Cloudera 建议将JournalNode放在主要服务器,或NameNode, Standby NameNode, JobTracker这类的,JournalNodes的本地目录就比较可靠。
12、 ipc.client.connect.max.retries
客户端连接重试次数,一般建议调整为10次
13、fs.permissions.umask-mode优化
fs.permissions.umask-mode=22在创建文件和目录时使用此umask值(用户掩码)。类linux上的文件权限掩码。可以使用8进制数字也可以使用符号,例如:"022" (8进制,等同于以符号表示的u=rwx,g=r-x,o=r-x),或者"u=rwx,g=rwx,o="(符号法,等同于8进制的007)。注意,8进制的掩码,和实际权限设置值正好相反,建议使用符号表示法,描述更清晰
14、dfs.datanode.handler.count
dfs.datanode.handler.count DataNode参数datanode节点RPC的处理线程数
dfs.datanode.handler.count=32
希望本文对你有帮助!