HDFS--Java--API

HDFS--Java--API

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

1、打开IDEA创建一个Hadoop项目
2、在Mpom.mxl中添加Hadoop2.7.6的依赖
<dependencies>
    <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-client -->
      <dependency>
          <groupId>org.apache.hadoop</groupId>
          <artifactId>hadoop-client</artifactId>
          <version>2.7.6</version>
      </dependency>
  </dependencies>
3、在src-main-java创建一个包com.shujia.HDFS
4、在包com.shujia.HDFS新建一个类HDFSJavaAPI

示例,测试一下连接是否通的

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

import java.io.IOException;
public class HDFSJavaAPI {
    public static void main(String[] args) throws IOException {	
//创建连接
//(1)新建Configuration对象,Configuration表示HDFS的配置
	Configuration conf = new Configuration();
	conf.set("fs.defaultFS","hdfs://master:9000");
//set()内的参数在 /usr/local/soft/hadoop-2.7.6/etc/hadoop中的core-site.xml文件中

//(2)FileSystem是使用java代码操作hdfs的api接口
   //conf作为FileSystem的参数
     FileSystem fs = FileSystem.get(conf);
   //创建一个目录,参数需要传入路径path,new一个path,Path参数为目录名称
     fs.mkdirs(new Path("/testHDFSAPI"));

     fs.close();
   }
} 
运行之后,访问master:50070

image

程序示例

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);  //需要抛出异常
    }

    //创建目录(mkdirs这个方法可以递归创建目录)
    @Test
    public void mkdirs() throws IOException {
        fs.mkdirs(new Path("/e/f/g"));   //创建Path对象,Path对象参数为目录名称;需要抛出异常
    }
    //删除目录
    @Test
    public void deleteDir() throws IOException {
        //true表示递归地删除(相当于rm -f),如果是false,则不是递归删除
        fs.delete(new Path("/e"),true);
    }
    //移动文件(用的是rename方法)
    @Test
    public void moveFile() throws IOException {
        //将HDFS中的testHDFSAPI文件移动到tmp目录中
        fs.rename(new Path("/testHDFSAPI"),new Path("/tmp"));
    }

    //上传文件put(将本地data中的文件上传到HDFS,相当于剪切,上传之后,本地就没了)
    @Test
    public void putFile() throws IOException {
        fs.moveFromLocalFile(new Path("data/HelloWorld.java"),new Path("/tmp/HelloWorld.java"));
    }
    //下载文件get(将HDFS的文件下载到本地的data目录中,下载之后,HDFS的文件还会存在)
    @Test
    public void getFile() throws IOException {
        fs.copyFromLocalFile(new Path("/tmp/HelloWorld.java"),new Path("data/"));
    }
    //读文件(读取HDFS内的文件)
    @Test
    public void readFromHDFS() throws IOException {
        FSDataInputStream open = fs.open(new Path("/tmp/HelloWorld.java"));
        //返回的类FSDataInputStream是一个输入流
        //需要利用BufferedReader来读取返回的输入流
        BufferedReader br = new BufferedReader(new InputStreamReader(open));
        //定义变量,然后遍历每一行数据
        String line = null;
        while ((line = br.readLine()) != null){
            System.out.println(line);
        }
        br.close();
        open.close();
    }
    //写文件(通过Java在HDFS编写文件)
    @Test
    public void writeFile() throws IOException {
        //先创建一个文件
        FSDataOutputStream fsO = fs.create(new Path("/newFile.txt"));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(fsO));

        bw.write("hello world");//写入第一行数据
        bw.newLine();//换行
        bw.write("hadoop hive hbase");//写入第二行数据
        bw.newLine();//换行
        bw.flush();//刷新

        bw.close();
        fsO.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 显示文件存储位置
posted @   阿伟宝座  阅读(73)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
点击右上角即可分享
微信分享提示