标签搜索

目 录CONTENT

文章目录

HDFS基本操作

陈铭
2023-01-17 / 0 评论 / 1 点赞 / 187 阅读 / 1,778 字 / 正在检测是否收录...

Shell命令

hadoop fs xxxhadoop dfs xxx是完全一样的命令,这里用hadoop fs 举例

查看帮助

# 查看某个命令的帮助
hadoop fs -help rm

上传

# 在HDFS根目录下创建文件夹myDir
hadoop fs -mkdir /myDir

# -moveFromLocal:从本地剪切粘贴到HDFS
hadoop fs  -moveFromLocal  word.txt  /myDir

# -copyFromLocal:从本地文件系统中拷贝文件到HDFS路径去
hadoop fs -copyFromLocal word.txt /myDir

# -put:等同于copyFromLocal,生产环境更习惯用put
hadoop fs -put word.txt /myDir

# -appendToFile:追加一个文件到已经存在的文件末尾
# HDFS是不允许对已上传的文件进行修改,只能追加
hadoop fs -appendToFile newWord.txt /myDir/word.txt

下载

# -copyToLocal:从HDFS拷贝到本地
hadoop fs -copyToLocal /myDir/word.txt ./

# -get:等同于copyToLocal,生产环境更习惯用get
hadoop fs -get /myDir/word.txt ./word.txt

HDFS直接操作

# -ls: 显示目录信息
hadoop fs -ls /myDir

# -cat:显示文件内容
hadoop fs -cat /myDir/word.txt

# -chgrp、-chmod、-chown:Linux文件系统中的用法一样,修改文件所属权限
hadoop fs  -chmod 666  /myDir/word.txt
hadoop fs  -chown  cm:cm  /myDir/word.txt

# -mkdir:创建路径
hadoop fs -mkdir /myDirNew

# -cp:从HDFS的一个路径拷贝到HDFS的另一个路径
hadoop fs -cp /myDir/word.txt /myDirNew

# -mv:在HDFS目录中移动文件
hadoop fs -mv /myDir/word.txt /myDirNew

# -tail:显示一个文件的末尾1kb的数据
hadoop fs -tail /myDir/word.txt

# -rm:删除文件或文件夹
hadoop fs -rm /myDir/word.txt

# -rm -r:递归删除目录及目录里面内容
hadoop fs -rm -r /myDir

# -du统计文件夹的大小信息
# -s:仅显示当前文件夹信息,不包括内部文件
hadoop fs -du -s -h /myDir
hadoop fs -du  -h /myDir

# -setrep:设置HDFS中文件的副本数量
hadoop fs -setrep 10 /myDir/word.txt

API操作

这里使用Java直接操作HDFS

环境准备

本地安装Hadoop

因为Java操作HDFS使用本地的Hadoop客户端去连接的,所以在Win11上装一个Hadoop依赖,让win环境模拟出一个Hadoop去连接虚机的HDFS
依赖下载,当然也可以去Gitee下载winutils,github上的版本可能不高。下载下来是个bin目录,主要使用的是bin目录下的winutils.exe,所以为其要添加上环境变量。

添加系统变量,bin目录我放在了D:\Develop\Hadoop_Dependency下
image

添加Path,即D:\Develop\Hadoop_Dependency\bin
image

image

重启电脑,使之生效

Java程序准备

Maven依赖

<dependencies>
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-client</artifactId>
        <version>3.3.4</version>
    </dependency>
</dependencies>

源码展示

NodeInfo

NodeInfo展示了集群各个节点的URI连接信息,因为我的win环境配置了hadoop100 - hadoop102的host映射,所以uri直接用了主机名

package ltd.cmjava.data;

/**
 * @ClassName UserInfo
 * @Description TODO
 * @Author 懂坚持的男人
 * @Date 0:21 2023/1/17
 * @Version 1.0
 **/
public class NodeInfo {
    public static final String PROTOCOL="hdfs://";

    public static final String NAME_NODE="hadoop100";
    public static final String NAME_NODE_PORT="8020";
    public static final String NAME_NODE_URI=PROTOCOL+NAME_NODE+":"+NAME_NODE_PORT;

    public static final String RESOURCE_MANAGER="hadoop101";

    public static final String SECONDE_NAME_NODE="hadoop102";
    
}

UserInfo

主要指定了HDFS的用户,即cm,HDFS需要有个明确的用户才能访问

package ltd.cmjava.data;

/**
 * @ClassName UserInfo
 * @Description TODO
 * @Author 懂坚持的男人
 * @Date 0:21 2023/1/17
 * @Version 1.0
 **/
public class UserInfo {
    public static final String USER="cm";
}

HdfsUtil

这个工具类展示了主要的文件操作:上传、下载、重命名和移动、删除文件和文件夹、查看文件详情、判断文件和文件夹

package ltd.cmjava.utils;

import ltd.cmjava.data.NodeInfo;
import ltd.cmjava.data.UserInfo;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.checkerframework.checker.units.qual.C;

import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;

/**
 * @ClassName HdfsUtil
 * @Description TODO
 * @Author 懂坚持的男人
 * @Date 0:30 2023/1/17
 * @Version 1.0
 **/
@SuppressWarnings("all")
public class HdfsUtil {

    // 配置HDFS
    public static Configuration getConfiguration(Map<String, String> paras) {
        Configuration configuration = new Configuration();
        if (paras == null)
            return configuration;
        for (String key : paras.keySet()) {
            configuration.set(key, paras.get(key));
        }
        return configuration;
    }

    // 获取文件系统
    public static FileSystem getFileSystem(Map<String, String> paras) {
        try {
            Configuration configuration = getConfiguration(paras);
            FileSystem fs = FileSystem.get(new URI(NodeInfo.NAME_NODE_URI), configuration, UserInfo.USER);
            return fs;
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (URISyntaxException e) {
            e.printStackTrace();
        }
        return null;
    }

    // 创建文件夹
    public static void mkdirs(String dir) {
        // 配置文件系统
        FileSystem fileSystem = HdfsUtil.getFileSystem(null);
        // 创建目录
        try {
            fileSystem.mkdirs(new Path(dir));
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (Objects.nonNull(fileSystem)) {
                try {
                    fileSystem.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    }

    // 上传文件
    public static void upload(String from, String to, int replicationNum) {
        HashMap<String, String> paras = new HashMap<>();
        paras.put("dfs.replication", replicationNum + "");
        FileSystem fs = getFileSystem(paras);


        try {
            // 上传文件
            // 参数一:删除本地文件
            // 参数二:覆盖HDFS文件
            fs.copyFromLocalFile(false, true,new Path(from), new Path(to));
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (fs != null) {
                try {
                    fs.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

        }
    }

    // 下载文件
    public static void download(String from, String to) {
        FileSystem fs = getFileSystem(null);

        // 执行下载操作
        // boolean delSrc 指是否将原文件删除
        // Path src 指要下载的文件路径
        // Path dst 指将文件下载到的路径
        // boolean useRawLocalFileSystem 是否开启文件校验
        try {
            fs.copyToLocalFile(false, new Path(from), new Path(to), true);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (fs != null) {
                try {
                    fs.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    // 移动文件
    public static void move(String from, String to) {
        FileSystem fs = getFileSystem(null);

        try {
            fs.rename(new Path(from), new Path(to));
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (fs != null) {
                try {
                    fs.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    // 删除文件
    public static void delete(String file) {

        FileSystem fs = getFileSystem(null);

        try {
            // 参数二:是否递归
            fs.delete(new Path(file), true);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (fs != null) {
                try {
                    fs.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    // 查看文件详情
    public static void showFileDetail(String path) {
        FileSystem fs = getFileSystem(null);

        // 获取文件详情
        RemoteIterator<LocatedFileStatus> listFiles = null;
        try {
            listFiles = fs.listFiles(new Path(path), true);

            while (listFiles.hasNext()) {
                LocatedFileStatus fileStatus = listFiles.next();

                System.out.println("========" + fileStatus.getPath() + "=========");
                System.out.println(fileStatus.getPermission());
                System.out.println(fileStatus.getOwner());
                System.out.println(fileStatus.getGroup());
                System.out.println(fileStatus.getLen());
                System.out.println(fileStatus.getModificationTime());
                System.out.println(fileStatus.getReplication());
                System.out.println(fileStatus.getBlockSize());
                System.out.println(fileStatus.getPath().getName());

                // 获取块信息
                BlockLocation[] blockLocations = fileStatus.getBlockLocations();
                System.out.println(Arrays.toString(blockLocations));
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (fs != null) {
                try {
                    fs.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    // 判断文件或者文件夹
    public static void showFileOrDir(String path) {
        FileSystem fs = getFileSystem(null);

        try {
            FileStatus[] listStatus = fs.listStatus(new Path(path));
            for (FileStatus fileStatus : listStatus) {

                // 如果是文件
                if (fileStatus.isFile()) {
                    System.out.println("file:" + fileStatus.getPath().getName());
                } else {
                    System.out.println("directory:" + fileStatus.getPath().getName());
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (fs != null) {
                try {
                    fs.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

HdfsClient

HdfsClient就是测试类,调用HdfsUtil测试各类API操作

package ltd.cmjava;

import java.io.IOException;
import java.net.URISyntaxException;

import static ltd.cmjava.utils.HdfsUtil.*;

/**
 * @ClassName HdfsClient
 * @Description HDFS客户端
 * @Author 懂坚持的男人
 * @Date 0:08 2023/1/17
 * @Version 1.0
 **/
@SuppressWarnings("all")
public class HdfsClient {
    public static void main(String[] args) throws IOException, URISyntaxException, InterruptedException {
        String uploadDir="/test111";
        String localDir="D:/Develop/workspace/Hadoop/src/main/resources";
        String downDir=localDir+"/down";

        String fileName="log4j.properties";
        String fileName0="log4j0.properties";

        String uploadFile=uploadDir+"/"+fileName;
        String uploadFile0=uploadDir+"/"+fileName0;
        String localFile=localDir+"/"+fileName;
        String downFile=downDir+"/"+fileName;

        mkdirs(uploadDir);
        upload(localFile,uploadDir,2);
        download(uploadFile,downFile);
        move(uploadFile,uploadFile0);

        delete(uploadFile0);

        showFileDetail("/");
        showFileOrDir("/");
    }
}
1

评论区