【HDFS】HDFS中JAVA API的使用

HDFS中JAVA API的使用

HDFS是一个分布式文件系统,既然是文件系统,就可以对其文件进行操作,比如说新建文件、删除文件、读取文件内容等操作。下面记录一下使用JAVA API对HDFS中的文件进行操作的过程。

Configuration类:该类的对象封转了客户端或者服务器的配置。

FileSystem类:该类的对象是一个文件系统对象,可以用该对象的一些方法来对文件进行操作。FileSystem fs = FileSystem.get(conf);通过FileSystem的静态方法get获得该对象。

FSDataInputStream和FSDataOutputStream:这两个类是HDFS中的输入输出流。分别通过FileSystem的open方法和create方法获得。

HDFS API URL 方式操作


import java.io.InputStream;
import java.net.URL;

import org.apache.hadoop.fs.FsUrlStreamHandlerFactory;
import org.apache.hadoop.io.IOUtils;
import org.junit.Test;



/*
 * HDFS API URL 方式操作
 */
public class HDFSUrlTest {

    //让JAVA 程序识别HDFS的Url
    static{
        URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory());
    }

    //查看文件内容
    @Test
    public void testRead(){
        InputStream in = null;

        //文件路径
        String fileUrl = "hdfs://192.168.99.110:9000/user/hadoop/input/test2.txt";

        try {
            //获取文件输入流
            in = new URL(fileUrl).openStream();

            //将文件内容打出来输入到控制台
            IOUtils.copyBytes(in, System.out, 4096, false);
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            IOUtils.closeStream(in);
        }
    }
}

HDFS FileSystem API 方式操作

注:要想成功运行需导入以下两个配置文件到自己工程下

core-site.xml
hdfs-site.xml

HDFS工具类,用来获取配置信息及文件系统


import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
/*
 * HDFS 工具类 
 */
public class HDFSUtils {

    public static FileSystem getFileSystem(){

        FileSystem hdfs = null;


        try {
            //获取配置文件信息
            Configuration conf = new Configuration();
//          conf.addResource(new Path("/conf/core-site.xml")); 
            //获取文件系统
            hdfs = FileSystem.get(conf);
        } catch (IOException e) {
            e.printStackTrace();
        }

        return hdfs;
    }
}

具体操作示例


import java.io.IOException;

import org.apache.hadoop.fs.BlockLocation;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.hdfs.DistributedFileSystem;
import org.apache.hadoop.hdfs.protocol.DatanodeInfo;
import org.apache.hadoop.io.IOUtils;
import org.junit.Test;

public class HDFSFsTest {

    //读取文件内容
    @Test
    public void testRead() throws IOException{

        //获取文件系统
        FileSystem hdfs = HDFSUtils.getFileSystem();

        //文件名称
        Path path = new Path("/user/hadoop/input/test2.txt");

        //打开文件输入流-----open
        FSDataInputStream inStream = hdfs.open(path);

        //读取文件内容到控制台显示-----read
        IOUtils.copyBytes(inStream, System.out, 4096, false);

        //关闭流------close
        IOUtils.closeStream(inStream);
    }

    //查看目录
    @Test
    public void testList() throws IOException{

        //获取文件系统
        FileSystem hdfs = HDFSUtils.getFileSystem();

        //目录
        Path path = new Path("/user/hadoop/");

        FileStatus[] fileStatus = hdfs.listStatus(path);

            for(FileStatus fs : fileStatus){
                Path p = fs.getPath();
                String info = fs.isDir() ? "目录" : "文件" ;
                System.out.println(info + ":" + p);
            }
    }

    //创建目录
    @Test
    public void testDirectory() throws Exception{

        //获取文件系统
        FileSystem hdfs = HDFSUtils.getFileSystem();

        //目录
        Path path = new Path("/usr/hadoop/dir");

        //创建目录
        boolean bool = hdfs.mkdirs(path);

        //返回结果为true创建成功
        System.out.println(bool);
    }

    //上传文件
    @Test
    public void testPut() throws Exception{

        //获取文件系统
        FileSystem hdfs = HDFSUtils.getFileSystem();

        //本地路径 目录 + 文件名称
        Path srcPath = new Path("c:/jdk-8u92-linux-x64.gz");

        //目标路径
        Path dstPath = new Path("/usr/hadoop/test/");

        hdfs.copyFromLocalFile(srcPath, dstPath);

    }

    //创建HDFS文件并写入内容
    @Test
    public void testCreat() throws Exception{

        //获取文件系统
        FileSystem hdfs = HDFSUtils.getFileSystem();

        //HDFS上传文件路径
        Path path = new Path("/usr/hadoop/dir/toich.data");

        //获取文件并上传输出流
        FSDataOutputStream fs = hdfs.create(path);

        //通过输出流写内容
        fs.writeUTF("Hello Hadoop!!!");

        fs.close();
    }

    //对HDFS上文件进行重命名
    @Test
    public void testRename() throws Exception{

        //获取文件系统
        FileSystem hdfs = HDFSUtils.getFileSystem();

        //源文件名称
        Path srcPath = new Path("/usr/hadoop/dir/toich.data");

        //目标文件名称
        Path dstPath = new Path("/usr/hadoop/dir/touch.data");

        //重命名
        boolean bool = hdfs.rename(srcPath, dstPath);

        System.out.println(bool);
    }

    //删除文件
    @Test
    public void testDelete() throws Exception{

        //获取文件系统
        FileSystem hdfs = HDFSUtils.getFileSystem();

        //HDFS 文件路径
        Path path = new Path("/usr/hadoop/dir/touch.data");

        //删除
//      boolean bool = hdfs.delete(path);

        boolean bool = hdfs.deleteOnExit(path);

        System.out.println(bool);
    }

    //删除目录
    @Test
    public void testDeleteDir() throws Exception{

        //获取文件系统
        FileSystem hdfs = HDFSUtils.getFileSystem();

        //HDFS 文件路径
        Path path = new Path("/usr/hadoop/dir/");

        //删除
        boolean bool = hdfs.delete(path, true);

        System.out.println(bool);
    }

    //查找某个文件在集群的位置
    @Test
    public void testLocation() throws Exception{

        //获取文件系统
        FileSystem hdfs = HDFSUtils.getFileSystem();

        //HDFS 文件上传路径
        Path path = new Path("/usr/hadoop/test/jdk-8u92-linux-x64.gz");

        FileStatus fs = hdfs.getFileStatus(path);

        BlockLocation[] blockLocations =  hdfs.getFileBlockLocations(fs, 0, fs.getLen());

        for(BlockLocation blockLocation : blockLocations){

            String[] hosts = blockLocation.getHosts();

            for(String host : hosts){
                System.out.print(host + "  ");
            }
            System.out.println();
        }
    }

    //获取HDFS集群上所有节点名称信息
        @Test
        public void testCluster() throws Exception{

            //获取文件系统
            FileSystem hdfs = HDFSUtils.getFileSystem();

            DistributedFileSystem distributeFileSyatem = (DistributedFileSystem) hdfs;

            DatanodeInfo[] datanodeInfos =  distributeFileSyatem.getDataNodeStats();

            for(DatanodeInfo datanodeInfo : datanodeInfos){

                String datanode = datanodeInfo.getHostName();

                System.out.println(datanode);
            }

        }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值