namenode:管理整个文件系统的元数据,维护目录结构、响应客户端请求
datanode:复制管理用户的文件数据块,管理用户提交的数据 心跳机制 块报告
secondarynamenode:namenode的助理,帮助加载元数据,紧急情况下(例如namenode宕机),可以帮助恢复数据 [2]

客户端向NameNode发起读数据请求;
NameNode响应请求并告诉客户端要读的文件的数据块位置(存在哪个DataNode上);
客户端到对应DataNode读取数据,当数据读取到达末端,关闭与这个DataNode的连接,并查找下一个数据块,直到文件数据全部读完;
最后关闭输出流。
客户端向NameNode发起写数据请求;
NameNode相应请求(NameNode会检查要创建的文件是否已经存在,创建者是否有权限,成功会创建一个记录,失败会报异常);
客户端将文件进行切片(分成数据块),然后上传数据块,按照一个一个的形式进行发送,每个数据块都要写到三个DataNode上;
成功后DataNode会返回一个确认队列给客户端,客户端进行效验,然后客户端上传下一个数据块到DataNode,直到所有数据块写入完成;
当所有数据块全部写入成功后,客户端会向NameNode发送一个反馈并关闭数据流。[3]
HDFS的Shell操作
HDFS提供了多种数据访问方式,其中命令行的方式是最简单的,调用文件系统(FS)Shell命令应使用 bin/hadoop fs <args>的形式。大多数FS Shell命令的行为和对应的Unix Shell命令类似。(以下内容参考[4])
$ hadoop fs -help
$ hadoop fs -ls / # 显示HDFS根目录信息
$ hadoop fs -mkdir -p /a/b/cc/dd # 递归创建 /aaa/bbb/cc/dd 目录
$ hadoop fs -cat hello.txt # 查看HDFS上 hello.txt 文件内容
$ hadoop fs -tail /weblog/access_log.1
$ hadoop fs -text /weblog/access_log.1
$ hadoop fs -chmod 666 /hello.txt$ hadoop fs -chown someuser:somegrp /hello.txt
$ hadoop fs -cp /a/jdk.tar.gz /b/ # 将 a/jdk.tar.gz 文件拷贝到 b/ 路径下
$ hadoop fs -mv /a/jdk.tar.gz / # 将 /a/jdk.tar.gz 文件移动到 / 下
$ hadoop fs -get /a/jdk.tar.gz /home/hadoop/storage/ # 将HDFS上的 /a/jdk.tar.gz 文件下载到本地 /home/hadoop/storage/ 路径下
$ hadoop fs -put /home/hadoop/software/jdk.tar.gz /a/jdk.tar.gz # 将本地 home/hadoop/software/jdk.tar.gz 文件上传到HDFS的 a/ 路径下
$ hadoop fs -rm -r /aaa/bbb/ # 递归删除 /aaa/bbb/ 目录
$ hadoop fs -rmdir /aaa/bbb/ccc
$ hadoop fs -df -h /
$ hadoop fs -du -s -h /aaa/* # 统计HDFS上 aaa/ 路径下所有文件大小(包括文件夹)
$ hadoop fs -count /aaa/

参考:
[1] https://baike.baidu.com/item/hdfs/4836121?fr=aladdin
[2] https://blog.csdn.net/qq_43755771/article/details/90725393
[3] https://www.cnblogs.com/ken-kqj/p/10180408.html
[4] https://cloud.tencent.com/developer/article/1717875
1.本文为 @caimeng99526 的原创文章,转载请附上原文出处链接。
2.本文中所转载文章及部分图片均来自公开网络,仅供学习交流使用,不会用于任何商业用途。
3.如果出处标注有误或侵犯到原著作者权益,请联系 @caimeng99526 删除,谢谢。
4.转载本公众号中的文章请注明原文链接和作者,否则产生的任何版权纠纷均与本公众号无关。





