hadoop之hdfs的API测试

4.2.2 从hadoop URL读取数据

package com.lcf.hdfs;

import org.apache.hadoop.fs.FsUrlStreamHandlerFactory;
import org.apache.hadoop.io.IOUtils;
import java.io.IOException;
import java.io.InputStream;
import java.net.URISyntaxException;
import java.net.URL;


// 4.2.2 从hadoop URL读取数据
public class URLCat {

    // 设置URL能够识别hdfs协议的应用程序FsUrlStreamHandlerFactory工厂实例对象
    static {
        URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory());
    }

    public static void main(String[] args) throws IOException, URISyntaxException {
        // 定义标准的javaio输入流变量
        InputStream in = null;

        // 定义HDFS的URL以main函数参数的形式赋值给url变量,假如args[0]的值为hdfs://master:9000/data/data
        String url = args[0];

        try {
            // 创建URL对象,并获取URL对象所打开的HDFS文件系统中的文件的输入流对象
            in = new URL(url).openStream();

            // 通过Hadoop源码包提供的 IOUtils.copyBytes方法,将in中的数据源源不断地写入System.out对象中,最后在控制台打印输出
            IOUtils.copyBytes(in,System.out,4096,false);

        } finally {
            IOUtils.closeStream(in);
        }

    }
}

测试URL-1.0.0.jar包

4.2.3 使用FileSystem读取文件

package com.lcf.hdfs;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;

import java.io.IOException;
import java.io.InputStream;
import java.net.URI;

// 4.2.3 使用FileSystem读取文件
// 使用FileSystem读取sogou.500w.utf8文件数据
public class FileSystemCat {
    public static void main(String[] args) throws IOException {

        // 读取文件的URI地址 hdfs://master:9000/data/data
        String uri = args[0];

        // 获取HDFS文件系统的配置信息实例对象
        Configuration configuration = new Configuration();

        // 通过FileSystem自身的静态方法get()来获取HDFS文件系统实例对象
        FileSystem fs = FileSystem.get(URI.create(uri), configuration);

        // 定义标准的IO输入流对象
        InputStream in = null;

        try {
            // 通过调用HDFS实例对象的open()方法打开HDFS文件输入流对象
            in = fs.open(new Path(uri));

            IOUtils.copyBytes(in,System.out,4096,false);

        } finally {

            // 关闭资源
            IOUtils.closeStream(in);
        }

    }
}

测试Read-1.0.0.jar

4.2.4 使用FSDataOutputStream对象随机读取

package com.lcf.hdfs;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;

import java.io.IOException;

public class FileSystemCat1 {

    public static void main(String[] args) throws IOException {
        String uri = args[0];

        Configuration configuration = new Configuration();
        FileSystem fs = FileSystem.get(configuration);

        //  定义支持随机读取数据的输入流
        FSDataInputStream in = null; 
        
        try {
            in = fs.open(new Path(uri));

            // 定义随机取的字节偏移量(字节数),该值可以随意调整
            byte[] buffer = new byte[256];

            int bytesRead = 0;
            while ((bytesRead = in.read(buffer)) > 0){
                System.out.write(buffer,0,bytesRead);
            }
        } finally {

            IOUtils.closeStream(in);
        }

    }
}

测试RandomRead-1.0.0.jar

实现文件的随意读取

4.2.5 使用FileSystem写入数据

package com.lcf.hdfs;


import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
import java.io.*;
import java.net.URI;

// 4.2.5 使用FileSystem写入数据
public class FileCopy {

    public static void main(String[] args) throws IOException {
        // 本地Linux文件系统中文件路径 /home/ydh/a.txt
        String localStr = args[0];

        // 目标HDFS文件系统路径 hdfs://master:9000/a.txt
        // 注意:HDFS中的a.txt不能事先存在
        String dfs = args[1];

        // 通过标准的java.io流读取本地Linux文件系统中的文件数据
        InputStream in = new BufferedInputStream(new FileInputStream(localStr));

        // 连接HDFS文件系统
        URI uri = URI.create(dfs);
        Configuration configuration = new Configuration();

        // 指定将要存储从Linux文件系统中读取过来的文件,在HDFS上的存储路径
        FileSystem fs = FileSystem.get(uri, configuration);

        // 返回输出到HDFS文件系统的输出流FSDataOutputStream实例对象
        FSDataOutputStream out = fs.create(new Path(dfs));

        // 调用IOUtils工具类将Linux本地文件系统产生的输入流写入到HDFS的输出流中
        IOUtils.copyBytes(in,out,4096,true);
    }
}

测试WriteData-1.0.0.jar

4.2.5.1 append()方法写入数据

package com.lcf.hdfs;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URI;

// append()方法写入数据
public class CopyFileAppend {
    public static void main(String[] args) throws IOException {
        String localSrc = args[0];
        String dist = args[1];

        BufferedInputStream in = null;
        try {
            in = new BufferedInputStream(new FileInputStream(localSrc));

            URI uri = URI.create(dist);
            Configuration configuration = new Configuration();

            // 设置配置信息
            configuration.setBoolean("dfs.support.append",true);
            configuration.set("dfs.client.block.write.replace-datanode-on-failure.policy","NEVER");
            configuration.set("dfs.client.block.write.replace-datanode-on-failure.enable","true");

            FileSystem fs = FileSystem.get(uri, configuration);

            FSDataOutputStream out = fs.append(new Path(dist));

            IOUtils.copyBytes(in,out,4096,false);
        } finally {

            IOUtils.closeStream(in);
        }

    }
}

浏览器中的效果

测试AppendData-1.0.0.jar

浏览器中的效果

追加数据之后

4.2.6 FSDataOutputStream对象批量写入

package com.lcf.hdfs;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.apache.hadoop.util.Progressable;
import java.io.IOException;

// 4.2.6 FSDataOutputStream对象批量写入
public class HdfsWriteTest {
    public static void main(String[] args) throws IOException {

        Configuration configuration = new Configuration();

        // 获取Linux本地文件系统FileSystem实例
        LocalFileSystem local = FileSystem.getLocal(configuration);

        // 获取HDFS文件系统FileSystem实例
        FileSystem hdfs = FileSystem.get(configuration);

        // Linux本地某一文件夹路径,该文件夹下有多个文件,例如 /home/ydh/files
        Path localDir = new Path(args[0]);

        // 上传到HDFS的路径设置,例如 hdfs://master:9000/sum.txt,其中sum.txt不能事先存在,
        // 它是未来要生成到HDFS文件系统的新文件
        Path hdfsFile = new Path(args[1]);

        try {
            // 获取Linux本地文件下某一文件路径下面的所有文件的状态元信息
            FileStatus[] inputFiles = local.listStatus(localDir);

            // 调用FileSystem实例对象的create()返回一个输出流对象,准备写入HDFS
            // create实参中有一个匿名对象,当create()方法执行完毕后进行回调
            FSDataOutputStream out = hdfs.create(hdfsFile, new Progressable() {
                @Override
                public void progress() {
                    System.out.println("......");
                }
            });

            // 遍历Linux本地文件下的所有文件
            for (int i = 0; i < inputFiles.length; i++) {
                // 打印Linux本地文件夹下的某一文件的名字
                System.out.println(inputFiles[i].getPath().getName());

                // 创建Linux本地文件夹下某一文件的输入流对象,读取文件内容
                FSDataInputStream in = local.open(inputFiles[i].getPath());

                // 自定义随机一次性读取文件的字节数
                byte[] buffer = new byte[512];
                int bytesRead = 0;

                // 循环写入到HDFS文件系统中
                while ((bytesRead = in.read(buffer)) > 0){
                    out.write(buffer,0,bytesRead);
                }
                in.close();
            }
            out.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

测试BatchWrite-1.0.0.jar

浏览器中的效果

4.2.7查询文件状态FileStatus

package com.lcf.hdfs;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.FileUtil;
import org.apache.hadoop.fs.Path;
import java.io.IOException;

// 4.2.7 查询文件状态FileStatus
public class FileStatusTest {

    /**
     * FileStatus类封装了文件系统中文件和目录的元数据,
     * 包括文件的长度,块大小,备份,修改时间,所有者以及文件的权限等信息
     * FileSystem.getFileStatus()方法可用于获取文件和目录的元数据FileStatus对象,
     * 从而获取该文件的状态元信息
     * @param args
     * @throws IOException
     */
    public static void main(String[] args) throws IOException {

        // 获取Configuration实例对象
        Configuration configuration = new Configuration();

        // 获取FileSystem实例对象
        FileSystem fs = FileSystem.get(configuration);

        // 判断文件是否存在
        boolean isExists = fs.exists(new Path(args[0]));

        if (isExists){
            // 获取文件的状态元信息FileStatus对象
            FileStatus status = fs.getFileStatus(new Path(args[0]));

            // 将FileStatus对象封装成数组
            FileStatus[] status2 = {status};

            // 通过Hadoop提供的文件工具类FileUtil将数组内容转化为paths数组
            Path[] paths = FileUtil.stat2Paths(status2);

            // 遍历paths数组,获取文件路径和文件的名字等信息
            for (int i = 0; i < paths.length; i++) {
                System.out.println(paths[i]);
                System.out.println(paths[i].getName());
            }
        }
    }
}

测试SingleFileStatus-1.0.0.jar

查看HDFS文件系统中某个文件的状态信息内容

4.2.7.1查看某个目录下所有文件

package com.lcf.hdfs;


import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.FileUtil;
import org.apache.hadoop.fs.Path;
import java.io.IOException;
import java.net.URI;

// 查看HDFS文件系统中某个目录下所有文件的状态信息内容
public class ListStatus {

    /**
     * public abstract FileStatus[] listStatus(Path f) throws FileNotFoundException,IOException;
     * @param args
     * @throws IOException
     */
    public static void main(String[] args) throws IOException {
        // HDFS文件系统某一路径,args数组可以包含一组文件的路径
        String uri = args[0];

        Configuration configuration = new Configuration();

        // 获取FileSystem实例对象
        FileSystem fs = FileSystem.get(URI.create(uri),configuration);

        // 初始化Path数组

        Path[] paths = new Path[args.length];

        // 为Path数组中的元素进行赋值
        for (int i = 0; i < paths.length; i++) {
            paths[i] = new Path(args[i]);
        }

        // 调用FileSystem实例对象中的listStatus()获取一组文件的所有元数据对象
        FileStatus[] status = fs.listStatus(paths);
        Path[] listPaths = FileUtil.stat2Paths(status);

        // 遍历输出每个文件的路径信息
        for (Path path : listPaths) {
            System.out.println(path);
        }

    }
}

测试ListFileStatus-1.0.0.jar

查看HDFS文件系统中某个目录下所有文件的状态信息内容

4.2.8 创建目录

package com.lcf.hdfs;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import java.io.IOException;
import java.net.URI;

// 4.2.8 创建目录
public class MkdirTest {

    /**
     * public boolean mkdirs(Path f) throws IOException {
     *     return mkdirs(f, FsPermission.getDirDefault());
     * }
     * mkdirs()方法可以一次性新建所有必要但还没有的父目录,
     * 如果其目录都已经创建成功,则会返回true,
     * 但通常不需要显示地创建一个目录,因为调用create()方法写入文件时,会自动创建父目录
     * @param args
     * @throws IOException
     */
    public static void main(String[] args) throws IOException {

        Configuration configuration = new Configuration();

        FileSystem fs = FileSystem.get(URI.create(args[0]),configuration);

        // FileSystem实例调用创建目录的方法
        fs.mkdirs(new Path(args[0]));  // 例如:hdfs://master:9000/admin
    }
}

测试Make-1.0.0.jar

4.2.9 删除文件与目录

package com.lcf.hdfs;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import java.io.IOException;
import java.net.URI;


// 4.2.9 删除文件与目录
public class DeleteTest {

    /**
     * 使用FileSystem实例的delete()方法,可以永久性删除文件目录
     * public abstract boolean delete(Path f, boolean recursive) throws IOException;
     *
     * 注意: 如果Path指向的是一个文件或者空目录,此时 recursive 递归参数就会被忽略,
     * 只有在递归参数 recursive 的值为 true 时,非空目录及其内容才会被删除,否则抛异常
     * @param args
     * @throws IOException
     */
    public static void main(String[] args) throws IOException {

        Configuration configuration = new Configuration();
        FileSystem fs = FileSystem.get(URI.create(args[0]),configuration);

        fs.delete(new Path(args[0])); // 例如:hdfs://master:9000/admin
    }
}

测试Delete-1.0.0.jar

posted @ 2021-04-25 17:50  lcf&qzd  阅读(388)  评论(0)    收藏  举报