集群简单维护

查看日志

上篇我们搭建了集群,并且完成了hdfs的搭建,但在我的linux02和linux03上,发现一个问题,我启动了datanode之后,开始进程还在,一会就自己消失了,这是为什么呢?(如下图)




进入不了hdfs界面 进入hdfs文件夹_hdfs复制文件夹


进入不了hdfs界面 进入hdfs文件夹_进入不了hdfs界面_02


查看页面显示,也只有一个datanode节点(linux01)上的。


进入不了hdfs界面 进入hdfs文件夹_进入不了hdfs界面_03


为了查看哪里出现了问题,我们可以查看一下机器上datanode的启动日志,日志的位置在hadoop下的logs里面,里面存放着日志相关的内容,我们以linux02上的为例:


进入不了hdfs界面 进入hdfs文件夹_hdfs复制文件夹_04


查看一下datanode的日志 tail -100 xxxxxxx-datanode-linux02.log


进入不了hdfs界面 进入hdfs文件夹_hdfs复制文件夹_05


快速浏览一下,留心异常关键词 err、error、exception、not defined、not exists 、not 之类的
可以看到,如上图:确实出现了问题,通过问题处,我又发现了关键词:clusterID、UUID等,很明显是我们的注册环节出现了问题
这里简单的阐述一下 datanode和namenode的通信机制吧,这样更好理解,而且其中也涉及到了clusterID和UUID


进入不了hdfs界面 进入hdfs文件夹_hdfs复制文件夹_06


如上图:
1)当有进的节点需要加入到集群当中时(比如HDFS的存储空间不够,需要加入新的机器,新的dn),首先会向nn注册,主动向nn汇报自己机器上的资源情况
2)nn接收汇报,看一下你够不够格,你要是还剩下100M的容量,我要你何用?还浪费我nn的管理资源;如果可以,将返回给dn 我们集群的ID :clusterID 和存储数据块池ID block-id(如下图)


进入不了hdfs界面 进入hdfs文件夹_HDFS_07


在/opt/hdpdata/name/current/VERSION 存储着namenode的核心数据 可以看到 集群id和数据块池id (linux01)机器
接着我们再看看data下的数据 /opt/hdpdata/data/current/VERSION


进入不了hdfs界面 进入hdfs文件夹_java入门简单小游戏_08


可以看到集群id和数据块池id ,还有一个uuid 是其唯一标识
接着去查看linux02 机器上datanode相关标识


进入不了hdfs界面 进入hdfs文件夹_进入不了hdfs界面_09


可以看到uuid确实不一样,但是BPid和集群id怎么也不一样呢,很明显都不是一个集群的了
所以删掉data文件,在linux02上重新开启生成注册


进入不了hdfs界面 进入hdfs文件夹_进入不了hdfs界面_10


这下子发现果真好了,去页面上查看一下:


进入不了hdfs界面 进入hdfs文件夹_HDFS_11


同理,linux03上采用同样的方法:


进入不了hdfs界面 进入hdfs文件夹_进入不了hdfs界面_12


最终查看页面:


进入不了hdfs界面 进入hdfs文件夹_hdfs复制文件夹_13


进入不了hdfs界面 进入hdfs文件夹_HDFS_14


成功解决问题!真嗨森~
接着讲通信机制
3)新注册的dn收到了nn老大派来的集群id clusterID(你以后就跟我们一起混了!)还有数据块池id BP-ID (你以后存数据 就放这个里面了,听到了吗!),然后dn屁颠屁颠很开心,并且生成自己的一个唯一标识uuid
4)dn定期会进行心跳机制,以此来证明自己还活着。。还能正常通信和工作 通常是3s发送一次心跳
5)如若有一天,某个dn不再发送心跳了;nn这个时候并不会立马把这个逆子或者叛徒给剔除掉,会在5min中之后进行尝试连接 ping 通信;如若还是没有成功,会再过5min种尝试ping,多次ping还是没有成功,这个时候,可以认定这个dn已经gg了,就把他剔除了
6)dn还会定期向nn汇报自己的工作情况
7)如若dn上某个数据块备份丢失,会在nn上任务队列中产生任务,在dn向nn发送心跳的时候,如果有任务,就会领取,比如副本复制的任务

设置一键启停任务及HDFS命令

配置环境变量

vi /etc/profile 
  
export JAVA_HOME=/opt/apps/jdk1.8.0_141   
export HADOOP_HOME=/opt/apps/hadoop-3.1.1   
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin   
source /etc/profile

进入不了hdfs界面 进入hdfs文件夹_HDFS_15


进入不了hdfs界面 进入hdfs文件夹_进入不了hdfs界面_16


可以查看hdfs下所有的文件

hdfs dfs /

在hdfs根目录下创建一个tom的文件夹

hdfs dfs -mkdir tom /


进入不了hdfs界面 进入hdfs文件夹_java集群_17


在页面上查看


进入不了hdfs界面 进入hdfs文件夹_java集群_18


其他一些命令:


进入不了hdfs界面 进入hdfs文件夹_HDFS_19


一键启停

在 etc/hadoop/workers 配置 需要启动DataNode的机器名


进入不了hdfs界面 进入hdfs文件夹_hdfs复制文件夹_20


在启停脚本中声明用户 sbin/start-dfs.sh sbin/stop-dfs.sh
#!/usr/bin/env bash
HDFS_DATANODE_USER=root
HADOOP_SECURE_DN_USER=hdfs
HDFS_NAMENODE_USER=root
HDFS_SECONDARYNAMENODE_USER=root


进入不了hdfs界面 进入hdfs文件夹_HDFS_21


进入不了hdfs界面 进入hdfs文件夹_进入不了hdfs界面_22


一键启动 在sbin 下 ./start-dfs.sh


进入不了hdfs界面 进入hdfs文件夹_java入门简单小游戏_23


进入不了hdfs界面 进入hdfs文件夹_java集群_24


进入不了hdfs界面 进入hdfs文件夹_java入门简单小游戏_25


进入不了hdfs界面 进入hdfs文件夹_进入不了hdfs界面_26


一键关闭 在sbin 下 ./stop-dfs.sh


进入不了hdfs界面 进入hdfs文件夹_java入门简单小游戏_27


进入不了hdfs界面 进入hdfs文件夹_java集群_28


进入不了hdfs界面 进入hdfs文件夹_HDFS_29


进入不了hdfs界面 进入hdfs文件夹_HDFS_30


JAVA客户端操作HDFS

java客户端操作集群HDFS 分四步走战略
1)创建配置文件的对象
2)获取HDFS文件系统的对象
3)操作文件系统
4)关闭流资源

上传文件代码:


package


查看网页上文件


进入不了hdfs界面 进入hdfs文件夹_java集群_31


读取文件代码:

测试类:


package


工具类:


package


测试结果:


进入不了hdfs界面 进入hdfs文件夹_java集群_32


代码解析:

1)创建配置文件的对象
这个是配置对象,配置一些文件的属性,比如上传文件时备份的数量,还有切块的大小等。【默认备份数量为3,切块大小为128M】下篇内容会讲
有三种配置方式 1.默认配置 (就是什么都不写,什么都不做) 2.读取配置文件 3.代码中直接设置 从左到右 优先级依次增高
配置文件写在resources中,xml格式 严格的配置文件


进入不了hdfs界面 进入hdfs文件夹_hdfs复制文件夹_33


代码中设置如下:


进入不了hdfs界面 进入hdfs文件夹_进入不了hdfs界面_34


2)获取HDFS文件系统对象
FileSystem fs = FileSystem.newInstance(new URI("hdfs://linux01:8020"), conf, "root");
3)操作方法
copyFromLocalFile 从 本地 复制文件到 HDFS 即上传文件
copyToLocalFile 复制文件到本地 即从HDFS上下载文件
open(Path path) 打开一个流 用以读取 HDFS 上的指定路径的文件
等等等等。。。