大数据——操作HDFS

一、Web Console网页工具

1、NameNode:端口50070

1)HDFS启动过程

在这里插入图片描述

2)HDFS概要

在这里插入图片描述

2、SecondaryNameNode:端口50090

二、命令行方式操作HDFS

# 查询所有的hdfs操作命令
hdfs dfs
# 在hdfs中创建目录
hdfs dfs -mkdir /aaa
# 如果父级目录不存在就要使用-p
hdfs dfs -mkdir -p /bbb/ccc
# 查询HDFS的某个目录
hdfs dfs -ls /bbb
# 查询HDFS的某个目录,包含子目录,也可以简写为-lsr
hdfs dfs -ls -R /bbb
# 上传数据,将服务器上的某个文件上传到HDFS的aaa下
hdfs dfs -put ./README.txt /aaa
# 上传数据
hdfs dfs -copyFromLocal ./README.txt /aaa
# 剪切数据到hdfs中,相当于ctrl + x
hdfs dfs -moveFromLocal ./data.txt /aaa
# 下载数据
hdfs dfs -get /aaa/data.txt ./
hdfs dfs -copyToLocal /aaa/data.txt ./
# 删除文件,不能删除目录
hdfs dfs -rm /bbb 
# 删除目录,包含子目录
hdfs dfs -rm -r /bbb
# 先把某个目录下的文件合并,再下载
hdfs dfs -getmerge /students ./allstudents.txt
# 拷贝
hdfs dfs -cp /aaa/data.txt /bbb/data.txt
# 移动
hdfs dfs -mv /aaa/data.txt /bbb/data.txt
# 显示目录信息
hdfs dfs -count /students
# 显示目录详细信息
hdfs dfs -du /students
# 查看文本文件内容
hdfs dfs -text ./students/a.txt
hdfs dfs -cat ./students/a.txt
# 平衡操作,如果出现数据不是平均分配在DataNode上时,可使用balanceer平衡
hdfs balancer


# 查询所有的hdfs管理命令
hdfs dfsadmin
# 查看hdfs运行的一些参数
hdfs dfsadmin -report
# 安全模式,get:获取当前的安全模式|enter:进入安全模式|leave:离开安全模式|wait:等待安全模式自动退出
hdfs dfsadmin -safemode get

三、Java Api方式操作

package org.gykalc;


import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.apache.hadoop.hdfs.DistributedFileSystem;
import org.apache.hadoop.hdfs.protocol.DatanodeInfo;
import org.apache.hadoop.io.IOUtils;
import org.apache.hadoop.ipc.Client;
import org.junit.Test;

import java.io.*;
import java.util.Arrays;

public class TestApi {


    /**
     * 创建目录
     */
    @Test
    public void mkdir() throws IOException {
        // 如果遇到权限问题有四种解决方案,下面是方案一,使用代码,添加一个环境变量,表示当前操作的是root用户
        System.setProperty("DHADOOP_USER_NAME", "root");
        // 配置NameNode地址
        Configuration configuration = new Configuration();
        configuration.set("fs.defaultFS", "hdfs://192.168.36.10:9000");
        // 获取hadoop客户端
        FileSystem client = FileSystem.get(configuration);
        // 创建目录
        client.mkdirs(new Path("/gyk"));
        // 关闭客户端
        client.close();
    }

    /**
     * 删除目录
     */
    @Test
    public void removeDir() throws IOException {
        // 如果遇到权限问题有四种解决方案,下面是方案一,使用代码,添加一个环境变量,表示当前操作的是root用户
        System.setProperty("DHADOOP_USER_NAME", "root");
        // 配置NameNode地址
        Configuration configuration = new Configuration();
        configuration.set("fs.defaultFS", "hdfs://192.168.36.10:9000");
        // 获取hadoop客户端
        FileSystem client = FileSystem.get(configuration);
        // 移除目录,第二个参数表示是否递归删除,一般删除文件夹后面才为true
        client.delete(new Path("/gyk"), true);
        // 关闭客户端
        client.close();
    }

    /**
     * 上传方法1
     */
    @Test
    public void uploadFileOne() throws IOException {
        // 如果遇到权限问题有四种解决方案,下面是方案一,使用代码,添加一个环境变量,表示当前操作的是root用户
        System.setProperty("DHADOOP_USER_NAME", "root");
        // 初始化一个输入流
        InputStream ins = new FileInputStream("D:\\学习\\hadoop\\a.txt");
        // 配置NameNode地址
        Configuration configuration = new Configuration();
        configuration.set("fs.defaultFS", "hdfs://172.18.0.2:9000");
        // 获取hadoop客户端
        FileSystem client = FileSystem.get(configuration);
        FSDataOutputStream output = client.create(new Path("/gyk/a.txt"));
        // 定义一个字节缓存数组
        byte[] bytes = new byte[1024];
        int len = 0;
        // 循环读取和写入
        while ((len = ins.read(bytes)) > 0) {
            output.write(bytes, 0, len);
        }
        // 关闭流
        output.flush();
        output.close();
        ins.close();
        client.close();
    }

    /**
     * 上传方法2
     */
    @Test
    public void uploadFileTwo() throws IOException {
        // 如果遇到权限问题有四种解决方案,下面是方案一,使用代码,添加一个环境变量,表示当前操作的是root用户
        System.setProperty("DHADOOP_USER_NAME", "root");
        // 初始化一个输入流
        InputStream ins = new FileInputStream("D:\\学习\\hadoop\\a.txt");
        // 配置NameNode地址
        Configuration configuration = new Configuration();
        configuration.set("fs.defaultFS", "hdfs://172.18.0.2:9000");
        // 获取hadoop客户端
        FileSystem client = FileSystem.get(configuration);
        FSDataOutputStream output = client.create(new Path("/gyk/b.txt"));
        IOUtils.copyBytes(ins, output, 1024);

        output.flush();
        output.close();
        ins.close();
        client.close();
    }

    /**
     * 下载文件1
     *
     * @throws IOException
     */
    @Test
    public void downloadFileOne() throws IOException {
        // 如果遇到权限问题有四种解决方案,下面是方案一,使用代码,添加一个环境变量,表示当前操作的是root用户
        System.setProperty("DHADOOP_USER_NAME", "root");
        // 初始化一个输出流
        OutputStream outputStream = new FileOutputStream("D:\\学习\\hadoop\\c.txt");
        // 配置NameNode地址
        Configuration configuration = new Configuration();
        configuration.set("fs.defaultFS", "hdfs://172.18.0.2:9000");
        // 获取hadoop客户端
        FileSystem client = FileSystem.get(configuration);
        FSDataInputStream inputStream = client.open(new Path("/aaa/README.txt"));
        // 定义一个字节缓存数组
        byte[] bytes = new byte[1024];
        int len = 0;
        // 循环读取和写入
        while ((len = inputStream.read(bytes)) > 0) {
            outputStream.write(bytes, 0, len);
        }
        // 关闭流
        outputStream.flush();
        outputStream.close();
        inputStream.close();
        client.close();
    }

    /**
     * 下载文件2
     *
     * @throws IOException
     */
    @Test
    public void downloadFileTwo() throws IOException {
        // 如果遇到权限问题有四种解决方案,下面是方案一,使用代码,添加一个环境变量,表示当前操作的是root用户
        System.setProperty("DHADOOP_USER_NAME", "root");
        // 初始化一个输出流
        OutputStream outputStream = new FileOutputStream("D:\\学习\\hadoop\\d.txt");
        // 配置NameNode地址
        Configuration configuration = new Configuration();
        configuration.set("fs.defaultFS", "hdfs://172.18.0.2:9000");
        // 获取hadoop客户端
        FileSystem client = FileSystem.get(configuration);
        FSDataInputStream inputStream = client.open(new Path("/aaa/README.txt"));
        IOUtils.copyBytes(inputStream, outputStream, 1024);
        // 关闭流
        outputStream.flush();
        outputStream.close();
        inputStream.close();
        client.close();
    }

    /**
     * 查找某个文件的数据块在HDFS的dataNode的位置
     */
    @Test
    public void getBlockOnDataNode() throws IOException {
        Configuration conf = new Configuration();
        conf.set("fs.defaultFS", "hdfs://172.18.0.2:9000");
        FileSystem client = FileSystem.get(conf);
        // 得到该文件的状态
        FileStatus status = client.getFileStatus(new Path("/aaa/README.txt"));
        // 获取文件的数据块信息
        BlockLocation[] fileBlockLocations = client.getFileBlockLocations(status, 0, status.getLen());
        for (BlockLocation blk : fileBlockLocations) {
            System.out.println("数据块:主机:" + Arrays.toString(blk.getHosts()));
        }
        client.close();
    }

    /**
     * 获取数据节点
     */
    @Test
    public void getDataNode() throws IOException {
        Configuration conf = new Configuration();
        conf.set("fs.defaultFS", "hdfs://172.18.0.2:9000");
        // 这里就需要获取到FileSystem的子类
        DistributedFileSystem distributedFileSystem = (DistributedFileSystem) FileSystem.get(conf);
        // 获取所有的数据节点
        DatanodeInfo[] list = distributedFileSystem.getDataNodeStats();
        for (DatanodeInfo datanodeInfo: list) {
            System.out.println(datanodeInfo);
        }
        distributedFileSystem.close();
    }
}

如果报错了,说明没有权限操作HDFS,可以添加一个HADOOP_USER_NAME这个环境变量
在这里插入图片描述
方式一:添加如下代码在这里插入图片描述
方式二:在命令行使用-DHADOOP_USER_NAME=root

方式三:chmod命令,改变权限

hdfs dfs -chmod 777 ...

方式四:修改配置hdfs-site.xml文件
在这里插入图片描述

四、HDFS文件上传的原理

在这里插入图片描述

五、HDFS文件下载的原理

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值