一、日志问题
1、发现问题:
看运行日志(框架目录的logs文件夹,/var/log/框架名称)
2、分析原因:
日志是一行一行的,每行都有日志级别
INFO、WARN、ERROR、FATAL
命令行:tail -n 1000日志文件名
3、解决:根据原因解决问题
①、搭建完集群,格式化成功,启动失败,重新格式化,
启动又失败,关闭集群,三台机器都要删除数据;
②、xsync同步,启动集群,host unreachable,can’t resovle hostname,unknown host exception ,一般是/etc/hosts文件配置有问题
③、Permission denied,权限拒绝,操作的时候,权限不足
1)在不属于你的文件夹进行操作(在该地没有写权限)
2)进行系统级别操作
以上的两种操作加sudo是正常的
如果module文件夹出了权限问题,解决方案如下:
sudo chown 用户名:用户组 /opt/module
如果日志内容太多不好看怎么办?加个过滤就可以显示错误,如下图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-t9rU9B2t-1609056001647)(C:\Users\xiaoyoupei\AppData\Roaming\Typora\typora-user-images\image-20201226100636212.png)]
④、用xsync发送过整个hadoop目录,会导致datanodes页面只看到一个节点,处理方法:同①
二、常用命令
ps -ef 查看父进程子进程id
netstat -nltp 查看端口
free -t 查看剩余内存
df -h 查看分区大小
du -h /usr/local/soft/hadoop-2.6.0/ 查看整个文件占了多少磁盘空间
三、HDFS组织架构
1、NameNode(nn):
就是Master,他就是一个主管、管理者。
1)、管理HDFS的命名空间----------文件系统的分区(比如windows分C、D盘这样)
2)、配置副本策略-----------配置副本的存放位置,但是存几份是由客户端(client)负责,如果有一份副本挂掉,也是nn负责备份
3)、管理数据块的(Block)映射信息----------拆分数据,将1块块的数据存在datanode里面,datanode里面存的不是文件,而是一个个的数据块,而这些数据块分配在那些datanode上是由nn管的,文件到块的映射信息也是由nn管的(我们在读取文件的时候,文件由很多数据块组成,但我们并看不出,这就有一个文件到块的映射关系)
4)、处理客户端的读写请求---------读写请求要经过nn
2、DataNode(dn):
就是slave。NameNode下达命令,DataNode执行实际的操作
1)、存储实际的数据块
2)、执行数据块的读/写操作
3、Client:客户端
1)、文件切分:文件上传HDFS的时候,client将文件切分成一个个的Block,然后进行上传
2)、与NameNode交互,获取文件的位置信息
3)、与Datanode交互,读取或者写入数据(注意client直连dn)
4)、Client提供一些命令来管理HDFS,比如:NameNode格式化
5)、Client可以通过一些命令来访问HDFS,比如对HDFS增删查改操作
4、Secondary NameNode(NN助手):
并非NameNode的热备。当NameNode的热备。当NameNode挂掉的时候,它并不能马上替换NameNode并提供服务
1)、辅助NameNode,分担其工作量,比如定期合并Fsimage和Edits,并推送给NameNode
2)、在紧急情况下,可辅助换恢复NameNode
四、Hadoop fs 命令分类
1、HDFS—>HDFS:
cp、mv、chown(改用户名和组)、chgrp(改组)、chmod、du、df、cat、rm
2、本地—>HDFS:
put:上传文件
copyFromLocal(copy):相当于复制上传文件到HDFS
moveFromLocal(move):上传的HDFS时候本地文件就删除了
appendToFile:追加文件的内容
setrep:设置HDFS中文件的副本数量(举例:hadoop fs -setrep 10 /sanguo/shuguo/kongming.txt(修改副本数目为10个))
注意!!!:HDFS内部副本数量不能超过节点数量
3、HDFS—>本地:
get:下载文件
copyToLocal:同get
getmerge:合并下载,(举例:hadoop fs -getmerge /*.txt /home/xiaoyoupei/jdk/hadoop-2.6.0/test/demo1.txt(将hdfs根目录下txt文件下载到指定的文件内,会在这个文件里按照顺序排列))
错误笔记:
1、端口号写错:
hadoop2.x的客户端访问集群端口是9000、访问HDFS端口是50070;hadoop3.x的客户端访问集群端口是8020、访问HDFS端口是9870;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-37dcT57m-1609056001652)(C:\Users\xiaoyoupei\AppData\Roaming\Typora\typora-user-images\image-20201227093609407.png)]
2、控制台输出错误
1)、Class path contains multiple SLF4J bindings.:大概意思就是冲突,解决方案如下所示:之后我们项目引入的第三方的工具包中都需要加入这个排除错误;
代码为:
<!--排除这个slf4j-log4j12-->
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
2)、由于log4j日志信息打印模块的配置信息没有给出造成的,简单的说,就是人家要有个地方来存放日志的打印信息,可是没有,所以就报错了。解决方案:
将该方法插入到main函数中,可以自行打印日志信息了
BasicConfigurator.configure(); //自动快速地使用缺省Log4j环境。
五、API书写的基本套路:
//1、新建HDFS对象
FileSystem fileSystem = FileSystem.get(URI.create("hdfs://192.168.18.128:9000"), new Configuration(), "root");
//2、操作集群
fileSystem.copyFromLocalFile(new Path("D:\\DATA\\尚硅谷\\04.Hadoop\\Day02\\12_HDFS API.mp4"),new Path("/"));
//3、关闭资源
fileSystem.close();
六、HDFS的写数据流程
1)客户端通过Distributed FileSystem模块向NameNode请求上传文件,NameNode检查目标文件是否已存在,父目录是否存在。
2)NameNode返回是否可以上传。
3)客户端请求第一个 Block上传到哪几个DataNode服务器上。
4)NameNode返回3个DataNode节点,分别为dn1、dn2、dn3。
5)客户端通过FSDataOutputStream模块请求dn1上传数据,dn1收到请求会继续调用dn2,然后dn2调用dn3,将这个通信管道建立完成。
6)dn1、dn2、dn3逐级应答客户端。
7)客户端开始往dn1上传第一个Block(先从磁盘读取数据放到一个本地内存缓存),以Packet为单位,dn1收到一个Packet就会传给dn2,dn2传给dn3;dn1每传一个packet会放入一个应答队列等待应答。
8)当一个Block传输完成之后,客户端再次请求NameNode上传第二个Block的服务器。(重复执行3-7步)。
七、网络拓扑-节点距离计算
提问:在HDFS写数据的过程中,NameNode会选择距离待上传数据最近距离的DataNode接收数据。那么这个最近距离怎么计算呢?
先看一下官网的解释:
大致意思就是说:
对于常见情况,当复制因子为 3 时,HDFS的放置策略是将一个副本放在本地机架中的一个节点上,另一个副本放在本地机架中的不同节点上,最后一个副本放在不同机架中的不同节点上。
例如下图,如果选择了R1机架下的N1作为发送的节点,那将有可能会选择R1下的N2作为第二个节点,R2下的N1作为第三个节点
八、HDFS的读数据流程
1)客户端通过Distributed FileSystem向NameNode请求下载文件,NameNode通过查询元数据,找到文件块所在的DataNode地址。
2)挑选一台DataNode(就近原则,然后随机)服务器,请求读取数据。
3)DataNode开始传输数据给客户端(从磁盘里面读取数据输入流,以Packet为单位来做校验)。
4)客户端以Packet为单位接收,先在本地缓存,然后写入目标文件。
注意:本人使用的是Hadoop2.6.0,但是看的视频是Hadoop3.1.6,有些地方有点出入