Hadoop从入门到入土(三)------------HDFS集群简单维护及JAVA客户端连接HDFS

10 篇文章 0 订阅
6 篇文章 0 订阅

集群简单维护

查看日志

上篇我们搭建了集群,并且完成了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/sbin

source  /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大数据开发

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值