回顾一下上一节的准备工作:
已经理解了HDFS的基础,搭建好了Hadoop集群 三台机器正常启动:
shell命令
HDFS的常用shell命令 网上有完备的资料直接搜即可 这里记录一些常用的。 hadoop或者hdfs的这些命令和linux很相似 所以学习成本很低。
1:首先我们一次性启动三台机器的Hadoop(注意 这里是群起群停 而不是单独启动某一台机器(当然这样是允许的) 所以哪台机器上有主节点NN 就在哪台机器上输入,不要跑到从节点机器上去启动):
start-all.sh
(这里已经配置好了免密登录和workers文件 所以可以直接使用这个命令 不需要前缀)
2:
先看一下根目录下有哪些文件
hadoop fs -ls /
这里又要强调一下细节,这里和linux很像 所有文件都是从根目录开始的,但是这个树形结构是一个抽象目录,是hdfs方便我们看才这样搞的,实际文件是分布式分块存储的。
我们可以创建一个文件夹 csdn 在/根目录下
hadoop fs -mkdir /csdn
这里可能会遇到一个问题: hdfs处于安全模式 safe mode.
这时候hdfs为了保护文件数据 不允许新增 删除 更改。
(安全模式的原因很多 具体原因查询hadoop/logs 具体分析(新手一定要养成遇到问题多查日志的好习惯))
手动查看安全模式状态/打开/关闭
hdfs dfsadmin -safemode get/enter/leave
比如创建一个txt 文件 把它从linux本地上传到hdfs:
这里的上传文件命令 也可以简写
hadoop fs -put /sc.txt /
同理 竟然有上传的put 就会有下载的get 跟上面同理 路径换一下就好了
还有一个常用的命令
追加数据到文件中
这里比较有趣的是 可以加多个文件
hadoop fs -appendToFile 1.txt 2.txt 3.txt /0.txt
这里随便举几个例子 都是经常写的 关于hadoop的其他命令 网上非常容易查 学习成本也很低因为和linux相似,新手不用刻意的死记,实际遇到的时候查询即可。
HDFS工作流程
一个文件系统最核心的无非两点 把数据装进去/把数据取出来 读数据很简单 这里主要说一下写数据
写数据流程
管道 :
什么是管道 pipline, 简要理解 管道就是HDFS上传文件写数据时采用的一种数据传输方式。
(之前说了dd里面的数据都是三个副本(连自己主副本也算上)。所以上传数据的时候hdfs会依次上传 比如客户端上传一个txt 给hdfs 到了hdfs的1机器 1机器再到2机器 2机器再传给3机器。 这种依次传 而不是客户端同时发三个情况 给三台机器。)
ack 应答响应:
所谓的ack 就是acknowledge character 确认字符。在文件数据上传的时候 你怎么保证收件人收到了 且收全了? ack就是一种反方向的校验 告诉收件方我收到了
理解了这两个概念 我们就可以理解工作流程了:
看上面这张流程图:
——>首先客户端要把一个文件上传到hdfs上面,那么它先发起一个上传的请求(具体到代码里面就是一个create方法)——> HDFS 创建一个对象实例distributed fs (不理解什么是对象实例的可以去java基础里面先学一下) 这个对象里面封装了hdfs文件系统的很多方法,它调用create()方法 通过RPC请求NN创建文件 ——> NN作为元数据的管理方 这时候当然就要各种检查了 检查目录存不存在 父文件夹存不存在 是不是有权限 。。。等等———> 检查通过之后 NN会记下一条记录 返回一个 FSoutputsteam输出流对象 给客户端 用于写数据 ——> 写数据的时候怎么写呢 HDFS将数据 划分成一个一个packet(默认64k) 这样一个一个像水流一样 写到hdfs里面。 写完之后 ack会机制校验确保数据没没问题。
这里注意一个问题 我们刚才说了 默认三副本 那么上传的时候万一客户端上传到机器1 成功 但是机器1上传到机器2 失败 这算不算成功?怎么给客户端回应?
这里涉及到hdfs配置里面的参数 dfs.namenode.replication.min 默认是1 就是说 第一个副本上传成功了就算成功了 当然你可以改。 就跟默认三副本 你嫌少 你可以默认4567副本
这里放一篇网友写的 hive的常用shell 例子:https://blog.csdn.net/weixin_39647186/article/details/110338351