集群简单维护
查看日志
上篇我们搭建了集群,并且完成了hdfs的搭建,但在我的linux02和linux03上,发现一个问题,我启动了datanode之后,开始进程还在,一会就自己消失了,这是为什么呢?(如下图)
查看页面显示,也只有一个datanode节点(linux01)上的。
为了查看哪里出现了问题,我们可以查看一下机器上datanode的启动日志,日志的位置在hadoop下的logs里面,里面存放着日志相关的内容,我们以linux02上的为例:
查看一下datanode的日志 tail -100 xxxxxxx-datanode-linux02.log
快速浏览一下,留心异常关键词 err、error、exception、not defined、not exists 、not 之类的
可以看到,如上图:确实出现了问题,通过问题处,我又发现了关键词:clusterID、UUID等,很明显是我们的注册环节出现了问题
这里简单的阐述一下 datanode和namenode的通信机制吧,这样更好理解,而且其中也涉及到了clusterID和UUID
如上图:
1)当有进的节点需要加入到集群当中时(比如HDFS的存储空间不够,需要加入新的机器,新的dn),首先会向nn注册,主动向nn汇报自己机器上的资源情况
2)nn接收汇报,看一下你够不够格,你要是还剩下100M的容量,我要你何用?还浪费我nn的管理资源;如果可以,将返回给dn 我们集群的ID :clusterID 和存储数据块池ID block-id(如下图)
在/opt/hdpdata/name/current/VERSION 存储着namenode的核心数据 可以看到 集群id和数据块池id (linux01)机器
接着我们再看看data下的数据 /opt/hdpdata/data/current/VERSION
可以看到集群id和数据块池id ,还有一个uuid 是其唯一标识
接着去查看linux02 机器上datanode相关标识
可以看到uuid确实不一样,但是BPid和集群id怎么也不一样呢,很明显都不是一个集群的了
所以删掉data文件,在linux02上重新开启生成注册
这下子发现果真好了,去页面上查看一下:
同理,linux03上采用同样的方法:
最终查看页面:
成功解决问题!真嗨森~
接着讲通信机制
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/sbinsource /etc/profile
可以查看hdfs下所有的文件
hdfs dfs /
在hdfs根目录下创建一个tom的文件夹
hdfs dfs -mkdir tom /
在页面上查看
其他一些命令:
一键启停
在 etc/hadoop/workers 配置 需要启动DataNode的机器名
在启停脚本中声明用户 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
一键启动 在sbin 下 ./start-dfs.sh
一键关闭 在sbin 下 ./stop-dfs.sh
JAVA客户端操作HDFS
java客户端操作集群HDFS 分四步走战略
1)创建配置文件的对象
2)获取HDFS文件系统的对象
3)操作文件系统
4)关闭流资源
上传文件代码:
package cn.doit19.hadoop.hdfs;import org.apache.hadoop.conf.Configuration;import org.apache.hadoop.fs.FileSystem;import org.apache.hadoop.fs.Path;import java.net.URI;public class Demo01 { public static void main(String[] args) throws Exception { //获取配置文件的对象 不设置则为默认值 Configuration conf = new Configuration(); //获取HDFS文件系统的对象 FileSystem fs = FileSystem.newInstance(new URI("hdfs://linux01:8020"), conf, "root"); //操作文件系统 fs.copyFromLocalFile(new Path("E://count.txt"), new Path("/")); //关闭流资源 fs.close(); }}
查看网页上文件
读取文件代码:
测试类:
package cn.doit19.hadoop.hdfs;import cn.doit19.hadoop.util.Util;import org.apache.hadoop.fs.FSDataInputStream;import org.apache.hadoop.fs.FileSystem;import org.apache.hadoop.fs.Path;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;public class TestHDFS { public static void main(String[] args) throws Exception { FileSystem fs = Util.getFs(); readFile(fs); } private static void readFile(FileSystem fs) throws IOException { FSDataInputStream open = fs.open(new Path("/count.txt")); BufferedReader br = new BufferedReader(new InputStreamReader(open)); String line = null; while ((line = br.readLine()) != null) { System.out.println(line); } }}
工具类:
package cn.doit19.hadoop.util;import org.apache.hadoop.conf.Configuration;import org.apache.hadoop.fs.FileSystem;import java.net.URI;public class Util { public static FileSystem getFs() throws Exception { Configuration conf = new Configuration(); return FileSystem.newInstance( new URI("hdfs://linux01:8020"), conf, "root" ); }}
测试结果:
代码解析:
1)创建配置文件的对象
这个是配置对象,配置一些文件的属性,比如上传文件时备份的数量,还有切块的大小等。【默认备份数量为3,切块大小为128M】下篇内容会讲
有三种配置方式 1.默认配置 (就是什么都不写,什么都不做) 2.读取配置文件 3.代码中直接设置 从左到右 优先级依次增高
配置文件写在resources中,xml格式 严格的配置文件
代码中设置如下:
2)获取HDFS文件系统对象
FileSystem fs = FileSystem.newInstance(new URI("hdfs://linux01:8020"), conf, "root");
3)操作方法
copyFromLocalFile 从 本地 复制文件到 HDFS 即上传文件
copyToLocalFile 复制文件到本地 即从HDFS上下载文件
open(Path path) 打开一个流 用以读取 HDFS 上的指定路径的文件
等等等等。。。
更多学习、面试资料尽在微信公众号:Hadoop大数据开发