java读写HDFS

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

  对分HDFS中的文件操作主要涉及一下几个类:

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

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

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

在eclipse中通过java api操作HDFS时,需要引用一些jar包,日下:

package hadoop;

import java.io.IOException;
import java.io.InputStream;

import org.apache.hadoop.conf.Configuration;
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.io.IOUtils;

public class OperaHDFS {
    /***
     * 加载配置文件
     * **/
    private static Configuration conf = new Configuration();

    private static FileSystem fs = null;

    static {
        try {
            conf.set("fs.defaultFS", "hdfs://host:port");
            conf.setInt("dfs.replication", 2);
            // 加载配置项
            fs = FileSystem.get(conf);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /***
     * 上传本地文件到 HDFS上
     *
     * **/
    public static void uploadFile(String src, String dst) throws Exception {
        // 本地文件路径
        Path srcPath = new Path(src);
        // HDFS文件路径
        Path dstPath = new Path(dst);
        try {
            // 调用文件系统的文件复制函数,前面参数是指是否删除原文件,true为删除,默认为false
            fs.copyFromLocalFile(false, srcPath, dstPath);
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println("上传成功!");
        fs.close();// 释放资源
    }

    /**
     * 在HDFS上创建一个文件夹
     *
     * **/
    public static void createDirOnHDFS(String path) throws Exception {
        Path p = new Path(path);
        boolean done = fs.mkdirs(p);
        if (done) {
            System.out.println("创建文件夹成功!");
        } else {
            System.out.println("创建文件夹成功!");
        }
        fs.close();// 释放资源
    }

    /**
     * 在HDFS上创建一个文件
     *
     * **/
    public static void createFileOnHDFS(String dst, String content) throws Exception {
        Path dstPath = new Path(dst);
        // 打开一个输出流
        FSDataOutputStream outputStream = fs.create(dstPath);
        outputStream.write(content.getBytes());
        outputStream.close();
        fs.close();// 释放资源
        System.out.println("创建文件成功!");

    }

    /**
     * 在HDFS上删除一个文件或文件夹
     *
     * **/
    public static void deleteFileOrDirOnHDFS(String path) throws Exception {
        Path p = new Path(path);
        boolean done = fs.deleteOnExit(p);
        if (done) {
            System.out.println("删除成功!");
        } else {
            System.out.println("删除失败!");
        }
        fs.close();// 释放资源

    }

    /**
     * 重名名一个文件夹或者文件
     *
     * **/
    public static void renameFileOrDirOnHDFS(String oldName, String newName) throws Exception {
        Path oldPath = new Path(oldName);
        Path newPath = new Path(newName);
        boolean done = fs.rename(oldPath, newPath);
        if (done) {
            System.out.println("重命名文件夹或文件成功!");
        } else {
            System.out.println("重命名文件夹或文件失败!");
        }
        fs.close();// 释放资源
    }

    /***
     *
     * 读取HDFS中某个文件
     *
     * **/
    public static void readFile(String filePath) throws IOException {
        Path srcPath = new Path(filePath);
        InputStream in = null;
        try {
            in = fs.open(srcPath);
            IOUtils.copyBytes(in, System.out, 4096, false); // 复制到标准输出流
        } finally {
            IOUtils.closeStream(in);
        }
    }

    /***
     *
     * 读取HDFS某个文件夹的所有 文件,并打印
     *
     * **/
    public static void readAllFile(String path) {
        // 打印文件路径下的所有文件名
        Path dstPath = new Path(path);
        FileStatus[] fileStatus = null;
        try {
            fileStatus = fs.listStatus(dstPath);
        } catch (IOException e) {
            e.printStackTrace();
        }
        for (FileStatus status : fileStatus) {
            if (status.isDirectory()) {
                readAllFile(status.getPath().toString());
            } else {
                System.out.println("文件: " + status.getPath());
                try {
                    readFile(status.getPath().toString());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    /**
     * 从HDFS上下载文件或文件夹到本地
     *
     * **/
    public static void downloadFileorDirectoryOnHDFS(String src, String dst) throws Exception {
        Path srcPath = new Path(src);
        Path dstPath = new Path(dst);
        fs.copyToLocalFile(false, srcPath, dstPath);
        fs.close();// 释放资源
        System.out.println("下载文件夹或文件成功!");
    }

    public static void main(String[] args) throws Exception {
        uploadFile("D:\\text.txt", "/path/file");
        deleteFileOrDirOnHDFS("/path/file");
        createDirOnHDFS("/path");
        createFileOnHDFS("/path/file", "context");
        renameFileOrDirOnHDFS("/path", "/path");
        readFile("/path/file");
        readAllFile("/path/file");
        downloadFileorDirectoryOnHDFS("/path/file", "D:\\text2.txt");
    }
}
时间: 2024-08-24 13:49:46

java读写HDFS的相关文章

Java读写hdfs上的avro文件

1.通过Java往hdfs写avro文件 1 import java.io.File; 2 import java.io.IOException; 3 import java.io.OutputStream; 4 import java.nio.ByteBuffer; 5 6 import org.apache.avro.Schema; 7 import org.apache.avro.file.CodecFactory; 8 import org.apache.avro.file.DataFi

java读写hdfs简单demo

环境:eclipse + eclipse hadoop插件, hadoop + rhel6.4 package test; import java.io.IOException; import java.net.URI; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.apache.ha

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

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

Spark学习笔记——读写HDFS

使用Spark读写HDFS中的parquet文件 文件夹中的parquet文件 build.sbt文件 name := "spark-hbase" version := "1.0" scalaVersion := "2.11.8" libraryDependencies ++= Seq( "org.apache.spark" %% "spark-core" % "2.1.0", &quo

第三课:java开发hdfs

(1)关于hdfs小结 hadoop由hdfs + yarn + map/reduce组成, hdfs是数据库存储模块,主要由1台namenode和n台datanode组成的一个集群系统, datanode可以动态扩展,文件根据固定大小分块(默认为128M), 每一块数据默认存储到3台datanode,故意冗余存储,防止某一台datanode挂掉,数据不会丢失. HDFS = NameNode + SecondaryNameNode + journalNode + DataNode hdfs的典

hadoop集群配置和在windows系统上运用java操作hdfs

安装 配置 概念 hadoop常用shell命令 使用java操作hadoop 本文介绍hadoop集群配置和在windows系统上运用java操作hdfs 安装 http://mirror.bit.edu.cn/apache/hadoop/common/hadoop-3.1.1/ sudo apt-get install ssh sudo apt-get install rsync mkdir /usr/local/hadoop tar -zxvf hadoop-3.1.1.tar.gz -C

java读写文件

读文件 package tool; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileOutputStream; import java.io.FileReader; import java.io.IOException; import java.io.OutputStreamWriter; public class ReadFile { pu

Java 读写Properties配置文件

Java 读写Properties配置文件 1.Properties类与Properties配置文件 Properties类继承自Hashtable类并且实现了Map接口,也是使用一种键值对的形式来保存属性集.不过Properties有特殊的地方,就是它的键和值都是字符串类型. 2.Properties中的主要方法 (1)load(InputStream inStream)   这个方法可以从.properties属性文件对应的文件输入流中,加载属性列表到Properties类对象.如下面的代码

Java读写Windows共享文件夹 .

版权声明:本文为博主原创文章,未经博主允许不得转载. 项目常常需要有访问共享文件夹的需求,例如共享文件夹存储照片.文件等.那么如何使用Java读写Windows共享文件夹呢? Java可以使用JCIFS框架对Windows共享文件夹进行读写,就这个框架可以让我们像访问本地文件夹一下访问远程文件夹. JCIFS的网址: http://jcifs.samba.org/ JCIFS是使用纯Java开发的一个开源框架,通过smb协议访问远程文件夹.该框架同时支持Windows共享文件夹和Linux共享文