五、通过API操作hdfs

一、基本api操作

1、获取HDFS对象的两种方式:

方式1:

public static FileSystem initFileSystem1() throws IOException {
        //获取配置对象
        Configuration conf = new Configuration();
        //指定namenode地址
        conf.set("fs.defaultFS", "hdfs://bigdata121:9000");
        //获取hdfs文件系统访问对象
        FileSystem client = FileSystem.get(conf);
        return client;
    }

方式2:

public static FileSystem initFileSystem2() throws IOException, URISyntaxException {
        Configuration conf = new Configuration();
        //直接通过uri的方式获取hdfs文件系统访问对象
        FileSystem client = FileSystem.get(new URI("hdfs://bigdata121:9000"), conf);
        return client;
    }

后面都是通过client这个文件系统对象调用各个方法操作hdfs的。

2、configuration对象的参数值配置

//通过conf.set(key, value)的方式即可设置参数值,如
conf.set("fs.defaultFS", "hdfs://bigdata121:9000");

3、创建目录

Path p = new Path(HDFS路径);
client.mkdirs(p);

4、上传文件

```;
Path dest = new Path(HDFS路径);
Path src = new Path(本地路径);
client.copyFromLocalFile(src, dest);

//还可以设置是否删除本地文件,以及是否覆盖hdfs中的原有同名文件


5、下载文件

//用法:
client.copyToLocalFile(srcPath,destPath,)

//例子:
Path downloadFile = new Path("/king/edit_new.xml");
Path destPath = new Path("G:\edits.xml");
client.copyToLocalFile(downloadFile, destPath);
client.close();

//还可以设置是否删除hdfs中的源文件


6、删除文件或者目录

```java
/*方式1: client.delete(Path HDFS路径,boolean 是否递归删除)
         如果不是递归删除,那么在删除的目录的时候,如果目录非空,那么就会报错
*/
Path deletePath = new Path("/linux2.txt");
client.delete(deletePath, true);
client.close();

/*方式2: client.deleteOnExit(Path HDFS路径)*/
Path deletePath = new Path("/linux2.txt");
client.deleteOnExit(deletePath);       //存在裁删除
client.close();

7、查看文件属性(只能查看文件,不能查看目录)

//返回的是一个LocatedFileStatus迭代器,用法:
RemoteIterator<LocatedFileStatus> pathList = client.listFiles(HDFS路径, recursive);
recursive表示是否递归显示子目录下的内容

//例子:
public void listFileMetaData() throws Exception{
        FileSystem client = initFileSystem2();
        Path listPath = new Path("/");
        //获取指定路径下列表,不递归显示,返回一个迭代器
        RemoteIterator<LocatedFileStatus> pathList = client.listFiles(listPath, false);
        while (pathList.hasNext()) {
            LocatedFileStatus i = pathList.next();
            //获取文件名
            System.out.println(i.getPath().getName());
            //文件权限
            System.out.println(i.getPermission());
            //文件属主
            System.out.println(i.getOwner());
            //文件数组
            System.out.println(i.getGroup());
            //文件大小,单位Byte
            System.out.println(i.getLen());
            //文件的block的大小
            System.out.println("blocksize:" + i.getBlockSize());

            //获取文件的block地址
            BlockLocation[] bl = i.getBlockLocations();
            for (BlockLocation b:bl) {
                //获取每个block 的偏移地址
                System.out.println("offset:" + b.getOffset());
                //获取当前副本的block所在的所有datanode的主机名
                String[] hosts = b.getHosts();
                for (String h:hosts) {
                    System.out.println(h);
                }
            }
            System.out.println("===========================");
        }

8、查看文件和目录的属性

//返回的是一个FileStatus数组,无法递归显示子目录下的内容,但是能查看子目录本身的属性,用法
FileStatus[] f = client.listStatus(Path);

public void judgeFile() throws Exception{
        FileSystem client = initFileSystem2();
        Path path = new Path("/");
        //获取FileSstatus对象
        FileStatus[] fileStatuses = client.listStatus(path);
        //通过Filestatus对象获取文件或者目录的属性
        for (FileStatus f:fileStatuses) {
            System.out.println("文件名:" + f.getPath().getName());
            System.out.println("权限:" + f.getPermission());
            System.out.println("大小:" + f.getLen());
            System.out.println("==========================");
        }
        client.close();
    }

9、文件类型判断

//通过上面的FileStatus和LocatedFileStatus 都可以调用内部的方法判断当前是文件还是目录
FileStatus对象.isFile()
LocatedFileStatus对象.isFile()

FileStatus对象.isDirectory()
LocatedFileStatus对象.isDirectory()

二、以IO流操作hdfs

1、以IO流方式上传文件
主要用到的是下面两个方法:

//这是HDFS专用的数据流输出流
FSDataOutputStream fos = client.create(Path)

//create方法还有以下参数:
boolean overwrite:如果文件文件已存在,是否覆盖,默认是true
short replication:可以指定副本数,不指定就以hdfs的配置为准
int bufferSize:缓冲区大小
long blockSize:指定自己使用的块大小
FsPermission var2:指定权限
ChecksumOpt checksumOpt:指定校验值

//下面是对接输入流和输出流的工具
IOutils.copyBytes(inputstream,outputstream,buffsize,close)

inputstream   输入流
outputstream  输出流
buffsize      缓冲区
close         是否关闭流

例子:

 @Test
    public void putFileFromIO() throws Exception {
        FileSystem client = initFileSystem2();

        //创建本地文件字节输入流
        InputStream fis = new FileInputStream("E:\\file\\big data\\java se\\第十八章 Java文件与IO流.md");

        //创建hdfs文件字节输出流,注意,创建输出流文件的时候,一定要指定文件名,否则会报错
        Path uploadPath = new Path("/第十八章 Java文件与IO流.md");
        FSDataOutputStream fos = client.create(uploadPath);

        //输入流和输出流对接
        try {
            //输入流和输出流拷贝,后面false表示不关闭流
            IOUtils.copyBytes(fis, fos, 1024,false);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //关闭输入流和输出流
            IOUtils.closeStream(fis);
            IOUtils.closeStream(fos);
        }
    }

2、以IO流方式下载文件

Path getPath = new Path("/dog.txt");
FSDataInputStream fis = client.open(getPath);

例子:


/*
    * 写入有两种方式:
    * 1、使用流的read/write方法
    * 2、使用IOUtils.copyBytes(instream,outstream,buffize)这个工具
    * */
    @Test
    public void getFileFromIO() throws Exception{
        FileSystem client = initFileSystem2();

        //创建本地输出流,保存内容
        OutputStream fos = new FileOutputStream("F:\\edit_new.xml");

        //创建hdfs输入流
        Path getPath = new Path("/dog.txt");
        FSDataInputStream fis = client.open(getPath);

        try {
            IOUtils.copyBytes(fis, System.out, 1024);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            IOUtils.closeStream(fis);
            IOUtils.closeStream(fos);
        }

    }

原文地址:https://blog.51cto.com/kinglab/2442389

时间: 2024-10-29 06:14:17

五、通过API操作hdfs的相关文章

Java API操作HDFS

HDFS是存储数据的分布式文件系统,对HDFS的操作,就是对文件系统的操作,除了用HDFS的shell命令对文件系统进行操作,我们也可以利用Java API对文件系统进行操作,比如文件的创建.删除.修改权限等等,还有文件夹的创建.删除.重命名等等. 使用Java API对文件系统进行操作主要涉及以下几个类: 1.Configuration类:该类的对象封装了客户端或者服务端的配置. 2.FileSystem类:该类的对象是一个文件系统对象,可以利用该对象的一些方法来对文件进行操作,FileSys

Hadoop读书笔记(三)Java API操作HDFS

Hadoop读书笔记(一)Hadoop介绍:http://blog.csdn.net/caicongyang/article/details/39898629 Hadoop读书笔记(二)HDFS的shell操作:http://blog.csdn.net/caicongyang/article/details/41253927 JAVA URL 操作HDFS OperateByURL.java package hdfs; import java.io.InputStream; import jav

使用Java API操作hdfs

如题 我就是一个标题党  就是使用JavaApi操作HDFS,使用的是MAVEN,操作的环境是Linux 首先要配置好Maven环境,我使用的是已经有的仓库,如果你下载的jar包 速度慢,可以改变Maven 下载jar包的镜像站改为 阿里云. 贴一下  pom.xml 使用到的jar包 <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifa

java调用API操作HDFS

本文介绍Java调用API从hdfs读取数据 package mongodb; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.URI; import java.util.Arrays; import org.apache.commons.lang.StringUtils; import org.apache.hadoop.co

java API 操作HDFS服务器

1.准备 开发环境:eclipse 依赖包:hadoop-2.7.7.tar.gz安装包 share/hadoop/下 common.hdfs中的jar包 2.连接HDFS服务器 /** * 连接HDFS服务器 */ @Test public void connectHDFS() { //做一个配置 Configuration conf = new Configuration(); //服务器地址 端口 conf.set("fs.defaultFS", "hdfs://192

Java操作HDFS开发环境搭建以及HDFS的读写流程

Java操作HDFS开发环境搭建 在之前我们已经介绍了如何在Linux上进行HDFS伪分布式环境的搭建,也介绍了hdfs中一些常用的命令.但是要如何在代码层面进行操作呢?这是本节将要介绍的内容: 1.首先使用IDEA创建一个maven工程: maven默认是不支持cdh的仓库的,需要在pom.xml中配置cdh的仓库,如下: <repositories> <repository> <id>cloudera</id> <url>https://re

HDFS基础和java api操作

1. 概括 适合一次写入多次查询情况,不支持并发写情况 通过hadoop shell 上传的文件存放在DataNode的block中,通过linux shell只能看见block,看不见文件(HDFS将客户端的大文件存放在很多节点的数据块中,Block本质上是一个逻辑概念,它是hdfs读写数据的基本单位) HDFS中,如果一个文件小于一个数据块的大小,并不占用整个数据块存储空间 2. fs 可以使用hdfs shell操作hdfs,常用 fs命令如下: eg: hadoop fs -cat fi

HDFS API操作实践

本文提供几个简单的实例,来说明如何使用hadoop的java API针对HDFS进行文件上传.创建.重命名.删除操作 本文地址:http://www.cnblogs.com/archimedes/p/hdfs-api-operations.html,转载请注明源地址. 1.上传本地文件到HDFS 通过FileSystem.copyFromLocalFile(Path src, Path dst)可将本地文件上传到HDFS指定的位置上,其中src和dst均为文件的完整路径 在<hadoop实战--

HDFS的shell和API操作

1. HDFS的shell操作 hadoop version //查看版本 hadoop fs -appendToFile src(Linux中的文件) dest(hdfs目录下的文件) //追加 hadoop fs -cat file(hdfs目录下的文件) //查看文件内容 Hadoop fs -tail file(hdfs目录下的文件) //查看文件末尾1kb的数据 hadoop fs -checksum file(hdfs目录下的文件) //校验当前文件是否正确 hadoop fs -c