HDFS文件系统基操--Java实现

Java实现对HDFS文件系统的基本操作

1.准备好jar包

2.创建一个类

1. 测试连接

    @Test   //测试是否连接成功
public void test() {
    //添加配置 ==> core-site.xml
    Configuration conf = new Configuration();
    //配置默认地址端口
    conf.set("fs.defaultFS", "hdfs://192.168.1.105:9000");
    try {
        //加载配置
        FileSystem fs = FileSystem.get(conf);
        //获取目标状态   注意:要用绝对路径,且路径都要用Path包起来
        FileStatus fst = fs.getFileStatus(new Path("/hello"));
        System.out.println(fst.isDirectory());  //是否是文件夹
        System.out.println(fst.isFile());  // 是否是文件
        System.out.println(fst.getLen());  // 获取长度
        System.out.println(fst.getPath()); // 获取路径
                    fs.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

2. 在文件系统下创建文件夹

    @Test   //hdfs文件系统中创建文件夹
public void mkdirsFile() {
    //添加配置 ==> core-site.xml
    Configuration conf = new Configuration();
    //配置默认地址端口
    conf.set("fs.defaultFS", "hdfs://192.168.1.105:9000");
    try {
        //加载配置
        FileSystem fs = FileSystem.get(conf);
        //创建文件夹   注意:要用绝对路径,且路径都要用Path包起来
        boolean mkdirs = fs.mkdirs(new Path("/other/test/jdk"));
        System.out.print(mkdirs);
                    fs.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

测试时,发现出错了,用户Administator在hadoop上执行写操作时被权限系统拒绝,百度(https://blog.csdn.net/xiaoshunzi111/article/details/52062640)发现,解决有三个办法:
1、在hdfs的配置文件中,将dfs.permissions修改为False
2、执行这样的操作 hadoop fs -chmod 777 /user/hadoop
3、在系统的环境变量里面添加HADOOP_USER_NAME=root(HDFS上的有权限的用户,具体看自己的情况),插入代码实现 System.setProperty("HADOOP_USER_NAME", "root");
前两个不太安全,我选用第三个,重启就可以。

3.递归查看文件夹

    @Test   //hdfs文件系统中遍历文件夹
public void ls() {
    Configuration conf = new Configuration();
    conf.set("fs.defaultFS", "hdfs://192.168.1.105:9000");
    try {
        FileSystem fs = FileSystem.get(conf);
        FileStatus[] fls = fs.listStatus(new Path("/"));
        for(FileStatus fst:fls) {
            judge(fs,fst);
        }
        fs.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

public void judge(FileSystem fs,FileStatus fst) {
    String name = fst.getPath().toString().split("hdfs://192.168.1.105:9000/")[1];
    if(fst.isDirectory()) {
        System.out.println("d: "+name);
        try {
            FileStatus[] fls = fs.listStatus(new Path("/"+name));
            for(FileStatus fst2:fls) {
                judge(fs,fst2);
            }
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }else {
        System.out.println("f: "+name);
    }
}

4.上传

    @Test   //上传文件到hdfs文件系统    通过io流
public void rz() {
            System.setProperty("HADOOP_USER_NAME", "root");
    Configuration conf = new Configuration();
    conf.set("fs.defaultFS", "hdfs://192.168.1.105:9000");
    try {
        FileSystem fs = FileSystem.get(conf);
        //输出流
        FSDataOutputStream create = fs.create(new Path("/other/hadoop-2.7.7.tar.gz"));
        //输入流
        FileInputStream fis = new FileInputStream(new File("F:\\Linux\\hadoop-2.7.7.tar.gz"));
        int len = 0;
        //定义一个byte类型的数组,数组的大小表示每次从文件中读取出来的数据量
                    byte[] b = new  byte[1024];
                    //循环读取数据,如果fis.read没有读到就数据返回-1
                    while((len = fis.read(b))!=-1) {
                        //输入到输出
                        create.write(b, 0, len);
                    }
                    fis.close();
                    create.close();
        fs.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

@Test   //上传文件到hdfs文件系统    通过核心类FileSystem提供的方法
public void rz1() {
            System.setProperty("HADOOP_USER_NAME", "root");
    Configuration conf = new Configuration();
    conf.set("fs.defaultFS", "hdfs://192.168.1.105:9000");
    try {
        FileSystem fs = FileSystem.get(conf);
                    //前为需要上传的文件地址,后为hdfs存放地址
        fs.copyFromLocalFile(new Path("F:\\Linux\\hadoop-2.7.7.tar.gz"), new Path("/other/hadoop-2.7.7.tar.gz"));
        fs.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

5.下载

    @Test   //下载到本地    通过io流
public void sz() {
    Configuration conf = new Configuration();
    conf.set("fs.defaultFS", "hdfs://192.168.1.105:9000");
    try {
        FileSystem fs = FileSystem.get(conf);
        FSDataInputStream create = fs.open(new Path("/other/hadoop-2.7.7.tar.gz"));
        FileOutputStream fis = new FileOutputStream(new File("F:\\hadoop-2.7.7.tar.gz"));
        int len = 0;
                    byte[] b = new  byte[1024];
                    while((len = create.read(b))!=-1) {
                        fis.write(b, 0, len);
                    }
                    fis.close();
                    create.close();
            fs.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

@Test   //下载到本地    通过核心类FileSystem提供的方法
public void sz1() {
    Configuration conf = new Configuration();
    conf.set("fs.defaultFS", "hdfs://192.168.1.105:9000");
    try {
        FileSystem fs = FileSystem.get(conf);
                    //前为hdfs中的文件,后为存放地址
        fs.copyToLocalFile(new Path("/other/hadoop-2.7.7.tar.gz"),new Path("F:\\hadoop-2.7.7.tar.gz"));
        fs.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

6.重命名

    @Test   //重命名
public void rename() {
    System.setProperty("HADOOP_USER_NAME", "root");
    Configuration conf = new Configuration();
    conf.set("fs.defaultFS", "hdfs://192.168.1.105:9000");
    try {
        FileSystem fs = FileSystem.get(conf);
        //前为原名,后为修改名
        boolean rename = fs.rename(new Path("hello"), new Path("hello01"));
        System.out.println(rename);
        fs.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

原文地址:https://www.cnblogs.com/cjq10029/p/12347179.html

时间: 2024-08-24 13:49:44

HDFS文件系统基操--Java实现的相关文章

HDFS文件系统的使用--java

一.准备jar包 lib下所有jar包和图上所示 二.测试 @Test public void test() { //做一个配置 Configuration conf=new Configuration(); //服务器的地址 端口号 conf.set("fs.defaultFS","hdfs://192.168.1.63:9000"); try { //连接到服务器上去 FileSystem fileSystem = FileSystem.get(conf); /

hadoop系列二:HDFS文件系统的命令及JAVA客户端API

转载请在页首明显处注明作者与出处 http://www.cnblogs.com/zhuxiaojie/p/6391518.html 一:说明 此为大数据系列的一些博文,有空的话会陆续更新,包含大数据的一些内容,如hadoop,spark,storm,机器学习等. 当前使用的hadoop版本为2.6.4 上一篇:hadoop系列一:hadoop集群安装 二:HDFS的shell命令 上一章说完了安装HADOOP集群部分,这一张讲HDFS. 其实基本上操作都是通过JAVA API来操作,所以这里的s

HDFS的java接口——简化HDFS文件系统操作

今天闲来无事,于是把HDFS的基本操作用java写出简化程序出来给大家一些小小帮助! package com.quanttech; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; /** * @topic HDFS文件操作工具类 * @author ZhouJ * */ public class HdfsUt

利用开源日志收集软件fluentd收集日志到HDFS文件系统中

说明:本来研究开源日志的系统是flume,后来发现配置比较麻烦,网上搜索到fluentd也是开源的日志收集系统,配置简单多了,性能不错,所以就改研究这个东东了!官方主页,大家可以看看:fluentd.org,支持300+的plugins,应该是不错的! fluentd是通过hadoop中的webHDFS与HDFS进行通信的,所以在配置fluentd时,一定要保证webHDFS能正常通信,和通过webHDFS写数据到hdfs中! 原理图如下: webHDFS的相关配置与测试,请看这篇文章:http

读《Hadoop权威指南》点滴-HDFS文件系统

1.HDFS中,目录作为元数据,保存在namenode中,而非datanode中 2.HDFS的文件权限模型与POSIX的权限模式非常相似,使用  r  w  x 3.HDFS的文件执行权限(X)可以忽略,因为你不能在hdfs中执行文件 Hadoop有一个抽象系统的概念,而HDFS只是其中的一个实现,支持的文件系统有: 文件系统 URI方案 Java实现(都在org.apache.hadoop包中) 描述 Loca file fs.LocalFileSystem 使用客户端校验和  的本地文件系

浅谈Hadoop下HDFS文件系统

Hadoop下HDFS文件系统 在这里我们对Hadoop的基本概念,历史功能就不做过多的阐述,重点在对于他的文件系统做一些了解和阐述. HDFS(Hadoop distributed file system)是一个分布式文件系统.具有高容错性(fault-tolerant),使得他能够部署在低廉的硬件上.他可以提供高吞吐率来访问应用程序的数据.HDFS放宽了可移植操作系统接口的要求.这样就可以实现以流式的形式来访问文件系统的数据. HDFS的设计目标: 检测和快速回复硬件故障 流式的数据访问 简

Hadoop Shell命令(基于linux操作系统上传下载文件到hdfs文件系统基本命令学习)

Apache-->hadoop的官网文档命令学习:http://hadoop.apache.org/docs/r1.0.4/cn/hdfs_shell.html FS Shell 调用文件系统(FS)Shell命令应使用 bin/hadoop fs <args>的形式. 所有的的FS shell命令使用URI路径作为参数.URI格式是scheme://authority/path.对HDFS文件系统,scheme是hdfs,对本地文件系统,scheme是file.其中scheme和aut

在Spark shell中基于HDFS文件系统进行wordcount交互式分析

Spark是一个分布式内存计算框架,可部署在YARN或者MESOS管理的分布式系统中(Fully Distributed),也可以以Pseudo Distributed方式部署在单个机器上面,还可以以Standalone方式部署在单个机器上面.运行Spark的方式有interactive和submit方式.本文中所有的操作都是以interactive方式操作以Standalone方式部署的Spark.具体的部署方式,请参考Hadoop Ecosystem. HDFS是一个分布式的文件管理系统,其

外网无法访问hdfs文件系统

由于本地测试和服务器不在一个局域网,安装的hadoop配置文件是以内网ip作为机器间通信的ip. 在这种情况下,我们能够访问到namenode机器, namenode会给我们数据所在机器的ip地址供我们访问数据传输服务, 但是返回的的是datanode内网的ip,我们无法根据该IP访问datanode服务器. 报错如下 2018-06-06 17:01:44,555 [main] WARN [org.apache.hadoop.hdfs.BlockReaderFactory] - I/O err