【HDFS】HDFS中JAVA API的使用

原创 2016年05月31日 09:04:18

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);
            }

        }
}

相关文章推荐

HDFS中JAVA API的使用

来自:http://www.cnblogs.com/liuling/p/2013-6-17-01.htmlHDFS是一个分布式文件系统,既然是文件系统,就可以对其文件进行操作,比如说新建文件、删除文件...

使用 FileSystem JAVA API 对 HDFS 进行读、写、删除等操作

Hadoop文件系统  基本的文件系统命令操作, 通过hadoop fs -help可以获取所有的命令的详细帮助文件。  Java抽象类org.apache.hadoop.fs.FileSys...
  • wisgood
  • wisgood
  • 2013年10月27日 21:09
  • 16528

使用 FileSystem JAVA API 对 HDFS 进行读、写、删除等操作

Hadoop文件系统  基本的文件系统命令操作, 通过hadoop fs -help可以获取所有的命令的详细帮助文件。  Java抽象类org.apache.hadoop.fs.FileSys...

HDFS中JAVA API的使用(hadoop的文件上传和下载)

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

Linux下Hadoop hdfs Java API使用

0 前言 搞了大约2天时间终于把Linux下面Java API的使用给弄清楚了。做个笔记方便以后参考。环境如下所示 Hadoop:2.5.1 Linux:Ubuntu kylin eclipse:...
  • gcangle
  • gcangle
  • 2014年12月07日 14:50
  • 5718

使用 FileSystem JAVA API 对 HDFS 进行读、写、删除等操作

Hadoop文件系统  基本的文件系统命令操作, 通过hadoop fs -help可以获取所有的命令的详细帮助文件。  Java抽象类org.apache.hadoop.fs.FileSys...

hadoop学习笔记1.使用shell和JAVA API操作HDFS

我们接着上一节来,上次我们已经把伪分布式环境搭建好了。 OK,我们先来测试一下 ,跑跑自带的例子wordcount 1.运行wordcount测试MapReduce admi...

Hadoop实践(三)---使用HDFS的Java API

HDFS进阶

HDFS 使用java api实现上传/下载/删除文件

package hadoop; import java.io.IOException; import org.apache.hadoop.conf.Configuration; import ...
  • i5secs
  • i5secs
  • 2011年12月31日 16:46
  • 5645

Hadoop学习笔记:HDFS的java API使用

简单通过一个示例来使用一下HDFS的Java接口。package cn.zhoucy.Hadoop;import java.io.File; import java.io.FileInputStrea...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【HDFS】HDFS中JAVA API的使用
举报原因:
原因补充:

(最多只允许输入30个字)