Hadoop 学习笔记(六)HDFS 客户端操作(上)

一、环境准备

将事先准备好的 Hadoop jar 文件安装到非中文无空格的路径下:

 配置 环境变量

 

 eclipse 创建 maven 项目,

pom.xml 引入一下依赖

<dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.8.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-common</artifactId>
            <version>2.7.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-client</artifactId>
            <version>2.7.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-hdfs</artifactId>
            <version>2.7.2</version>
        </dependency>
        <dependency>
            <groupId>jdk.tools</groupId>
            <artifactId>jdk.tools</artifactId>
            <version>1.8</version>
            <scope>system</scope>
            <systemPath>${JAVA_HOME}/lib/tools.jar</systemPath>
        </dependency>
    </dependencies>

scr/main/resourses 下创建 log4j.properties 文件,黏贴一下内容并保存

log4j.rootLogger=INFO, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
log4j.appender.logfile=org.apache.log4j.FileAppender
log4j.appender.logfile.File=target/spring.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n

二、测试环境是否可用

编写 HdfsTest 类;

public static Configuration conf = new Configuration();

    @Test
    public void testMkdir() throws IOException, InterruptedException, URISyntaxException {
        // conf.set("fs.defaultFS", "hdfs://hadoop103:9000");
        // 1、获取 HDFS 客户端对象
        FileSystem fs = FileSystem.get(new URI("hdfs://hadoop103:9000"), conf, "hui");

        // 2、创建路径
        fs.mkdirs(new Path("/yttlj/emp"));
        fs.close();
        System.out.println(" ok ");
    }

运行查看 HDFS 

[hui@hadoop103 ~]$ hadoop fs -ls -R /
drwxr-xr-x   - hui supergroup          0 2020-09-09 13:17 /user
drwxr-xr-x   - hui supergroup          0 2020-09-09 13:20 /yttlj
drwxr-xr-x   - hui supergroup          0 2020-09-09 13:20 /yttlj/emp

至此:客户端环境搭建完毕。

 三、HDFS 常用 API 操作

文件上传

    // 2、文件上传
    @Test
    public void putFileTest() throws IOException, InterruptedException, URISyntaxException {
        // 1、获取 fs 对象
        FileSystem fs = FileSystem.get(new URI("hdfs://hadoop103:9000"), conf, "hui");
        // 2、上传文件
        // fs.copyFromLocalFile(new Path("E:/workspaced/data/zhouzhiruo.txt"), new
        // Path("/yttlj/emp"));
        // conf 个性化设置
        // conf.set("dfs.replication", "2");
        fs.copyFromLocalFile(new Path("E:/workspaced/data/zhouzhiruo.txt"), new Path("/yttlj/gmd/yangxiao.txt"));
        // 3、关闭资源
        fs.close();
    }

将hdfs-site.xml拷贝到项目的根目录下

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>
    <property>
        <!-- 设置副本数 为 1 -->
        <name>dfs.replication</name>
        <value>1</value>
    </property>
</configuration>

参数优先级排序:(1)客户端代码中设置的值 >(2)ClassPath下的用户自定义配置文件 >(3)然后是服务器的默认配置。

HDFS 文件下载

// 3、文件下载
    @Test
    public void gettFileTest() throws Exception {
        // 1、获取 fs 对象
        FileSystem fs = FileSystem.get(new URI("hdfs://hadoop103:9000"), conf, "hui");
        // 2、下载文件
        // fs.copyFromLocalFile(new Path("E:/workspaced/data/zhouzhiruo.txt"), new
        // Path("/yttlj/emp"));
        // 直接从 HDFS 文件系统抓取数据到本地
        // fs.copyToLocalFile(new Path("/yttlj/emp/zhouggl.txt"), new
        // Path("E:/workspaced/data/zhouggl.txt"));
        // false 是否删除 HDFS 文件系统文件,若删除相当于剪切,true 是否校验
        fs.copyToLocalFile(false, new Path("/yttlj/emp/zhouggl.txt"), new Path("E:/workspaced/data/zhougg111l.txt"),
                true);

        fs.close();
    }

HDFS 文件删除

// 3、文件删除
    @Test
    public void deletetFileTest() throws Exception {
        // 1、获取 fs 对象
        FileSystem fs = FileSystem.get(new URI("hdfs://hadoop103:9000"), conf, "hui");
        // 2、删除文件 如果 删除的目录,true 则递归删除
        fs.delete(new Path("/yttlj/emp"), true);
        fs.close();
    }

HDFS 文件更新名称

    // 4、文件更名
    @Test
    public void updatFileTest() throws Exception {
        // 1、获取 fs 对象
        FileSystem fs = FileSystem.get(new URI("hdfs://hadoop103:9000"), conf, "hui");
        // 2、修改名称
        fs.rename(new Path("/yttlj/gmd/yangxiao.txt"), new Path("/yttlj/gmd/yangxiao_buhui.txt"));
        fs.close();
    }

HDFS 文件详情

// 5、查看文件详细信息
    @Test
    public void lookFileInfoTest() throws Exception {
        // 1、获取 fs 对象
        FileSystem fs = FileSystem.get(new URI("hdfs://hadoop103:9000"), conf, "hui");
        // 2、查看文件详细信息
        RemoteIterator<LocatedFileStatus> listFilesIterator = fs.listFiles(new Path("/"), true);
        while (listFilesIterator.hasNext()) {
            LocatedFileStatus fileStatus = listFilesIterator.next();
            // 查看文件 名称 长度 权限 块信息
            System.out.println(fileStatus.getPath().getName());
            System.out.println(fileStatus.getPermission());
            System.out.println(fileStatus.getLen());
            System.out.println(fileStatus.getBlockSize());
            BlockLocation[] blockLocations = fileStatus.getBlockLocations();
            for (BlockLocation blockLocation : blockLocations) {
                String[] hosts = blockLocation.getHosts();
                for (String host : hosts) {
                    System.out.println(host);
                }
            }
            System.out.println("-------------------------------");
        }
        fs.close();
    }

HDFS 文件OR文件夹

//6、文件OR文件夹
    @Test
    public void FileTest() throws Exception {
        // 1、获取 fs 对象
        FileSystem fs = FileSystem.get(new URI("hdfs://hadoop103:9000"), conf, "hui");
        // 2、获取文件信息
        FileStatus[] fileStatus = fs.listStatus(new Path("/"));
        for (FileStatus fileStatu : fileStatus) {
            if(fileStatu.isFile()) {
                //文件
                System.out.println(fileStatu.getPath().getName() +" isFile ");
            }else{
                //文件夹
                System.out.println(fileStatu.getPath().getName() +" isDir ");
            }
        }
        fs.close();
    }
原文地址:https://www.cnblogs.com/wdh01/p/13798805.html