HDFS--Java--API


HDFS--Java--API

导入依赖--Maven仓库的官网(mvnrepository.com)

1、打开IDEA创建一个Hadoop项目
2、在Mpom.mxl中添加Hadoop2.7.6的依赖

    
      
          org.apache.hadoop
          hadoop-client
          2.7.6
      
  
3、在src-main-java创建一个包com.shujia.HDFS
4、在包com.shujia.HDFS新建一个类HDFSJavaAPI

操作流程

//1、创建连接
// fs.defaultFS 和 hdfs://master:9000 是配置Hadoop时设置的HDFS的服务端口
//这个端口在配置文件和HDFS的web界面中可以找到
Configuration conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://master:9000");
FileSystem fs = FileSystem.get(conf);

//2、通过创建的连接对象fs对HDFS进行操作
通过 fs.方法 进行操作

//3、关闭连接
fs.close();

程序示例

package com.shujia.HDFS;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.io.*;

public class HDFSJavaAPI {
    FileSystem fs;

    @Before
    public void init() throws IOException {
        // 1、创建连接
        Configuration conf = new Configuration();
        conf.set("fs.defaultFS", "hdfs://master:9000");
        fs = FileSystem.get(conf);
    }

    // 创建目录(默认可以递归地创建目录)
    @Test
    public void mkdirs() throws IOException {
        fs.mkdirs(new Path("/e/f/g"));
    }

    // 删除目录
    @Test
    public void deleteDir() throws IOException {
        // 非递归的删除,相当于直接rm
//        fs.delete(new Path("/e"), false);
        // 递归地删除,相当于rm -r
        fs.delete(new Path("/e"), true);
    }

    // 移动文件
    @Test
    public void moveFile() throws IOException {
        fs.rename(new Path("/CentOS-7-x86_64-DVD-2009.iso"), new Path("/a/CentOS-7-x86_64-DVD-2009.iso"));
    }

    // 上传文件 put (move上传文件时会删除本地文件)
    @Test
    public void putFile() throws IOException {
        fs.moveFromLocalFile(new Path("data/students.txt"), new Path("/a/students.txt"));
    }

    // 下载文件 get (copy不会)
    @Test
    public void getFile() throws IOException {
        fs.copyToLocalFile(new Path("/a/students.txt"), new Path("data/"));
    }

    // 读文件
    @Test
    public void readFromHDFS() throws IOException {
        FSDataInputStream fsDataInputStream = fs.open(new Path("/a/students.txt"));

        BufferedReader br = new BufferedReader(new InputStreamReader(fsDataInputStream));

        String line = null;
        while ((line = br.readLine()) != null) {
            System.out.println(line);
        }

        //用完之后要关闭流通道
        br.close();
        fsDataInputStream.close();

    }

    // 写文件
    @Test
    public void writeFile() throws IOException {
        Path path = new Path("/newFile1.txt");
        FSDataOutputStream fsDataOutputStream;
        // 判断文件是否存在
        if(fs.exists(path)){
            // 直接追加有问题 不常用
            fsDataOutputStream = fs.append(path);
        }else{
            fsDataOutputStream= fs.create(path);
        }

        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(fsDataOutputStream));

        bw.write("hello world");
        bw.newLine();
        bw.write("hadoop hadoop hive hbase");
        bw.newLine();
        bw.flush();
        bw.close();
        fsDataOutputStream.close();

    }

    @After
    public void closed() throws IOException {
        fs.close();
    }
}

FileSystem

(1)fileSysterm是使用java代码操作hdfs的api接口
(2)文件操作
create 写文件
open 读取文件
delete 删除文件
(3)目录操作
mkdirs 创建目录
delete 删除文件或目录
listStatus 列出目录的内容
getFileStatus 显示文件系统的目录和文件的元数据信息
getFileBlockLocations 显示文件存储位置