IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> 使用Java操作HDFS -> 正文阅读

[大数据]使用Java操作HDFS

一、前提

1、安装好java的开发环境jdk

windows7环境下安装jdk

https://blog.csdn.net/weixin_40612128/article/details/121431327

2、安装java开发工具

下面2个开发工具随便安装一个就行,这里我使用的是IntelliJ IDEA

(1)windows7环境下安装IntelliJ IDEA

https://blog.csdn.net/weixin_40612128/article/details/121431750?spm=1001.2014.3001.5502

(2)windows7环境下安装eclpise

https://blog.csdn.net/weixin_40612128/article/details/121431523?spm=1001.2014.3001.5502

3、配置好maven

windows7环境下java开发环境之maven环境配置

https://blog.csdn.net/weixin_40612128/article/details/121432260?spm=1001.2014.3001.5502

二、创建maven项目

1、创建一个名为db_hadoop的项目

在这里插入图片描述在这里插入图片描述

2、配置好maven的信息

在这里插入图片描述

3、引入hadoop依赖

<dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-client</artifactId>
    <version>3.2.0</version>
</dependency>

注意:
(1)这里要点击右上角自动导入依赖!然后稍等一会就可以了。
(2)在pom.xml中要新建标签,在这个标签中复制上面的依赖!!
在这里插入图片描述如下红色字体变为蓝色,说明依赖就下载并导入成功了
在这里插入图片描述

4、上传文件

代码如下:

package com.imooc.hdfs;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;

import java.io.FileInputStream;
import java.net.URI;

/**
 * Java代码操作HDFS
 * 文件操作:上传文件、下载文件、删除文件
 * 
 */
public class HdfsOp {
    public static void main(String[] args) throws Exception{
        //创建一个配置对象
        Configuration conf = new Configuration();
        //指定HDFS的地址
        conf.set("fs.defaultFS","hdfs://bigdata01:9000");
        //获取操作HDFS的对象
        FileSystem fileSystem = FileSystem.get(conf);


        //获取HDFS文件系统的输出流
        FSDataOutputStream fos = fileSystem.create(new Path("/user.txt"));
        //获取本地文件的输入流
        FileInputStream fis = new FileInputStream("D:\\user.txt");

        //上传文件:通过工具类把输入流拷贝到输出流里面,实现本地文件上传到HDFS
        IOUtils.copyBytes(fis,fos,1024,true);

    }

}

在这里插入图片描述运行代码,注意,要在D盘创建一个user.txt的文件!!
在这里插入图片描述点击运行,发现如下报错,通过关键字发现是权限的问题!!
在这里插入图片描述解决办法有两个

第一种:去掉hdfs的用户权限检验机制,通过在hdfs-site.xml中配置dfs.permissions.enabled为false即可

第二种:把代码打包到linux中执行

在这里为了在本地测试方便,我们先使用第一种方式

停止hadoop

stop-all.sh

在这里插入图片描述
修改配置文件,添加如下内容

<property>
    <name>dfs.permissions.enabled</name>
    <value>false</value>
</property>

在这里插入图片描述重新启动集群

start-all.sh

在这里插入图片描述重新执行代码

在这里插入图片描述如下,发现报错没有了
在这里插入图片描述
此时,去hdfs上检查文件是否已经上传成功,如下发现文件成功上传到了hdfs了

 hdfs dfs -ls /
 hdfs dfs -cat /user.txt

在这里插入图片描述最后,对代码进行封装提取
在这里插入图片描述
输入方法名称,这里我定义为put

在这里插入图片描述

5、下载文件

代码如下:

/**
 * 下载文件
 * @param fileSystem
 * @throws IOException
 */
private static void get(FileSystem fileSystem) throws IOException{
    //获取HDFS文件系统的输入流
    FSDataInputStream fis = fileSystem.open(new Path("/test/hello.txt"));
    //获取本地文件的输出流
    FileOutputStream fos = new FileOutputStream("D:\\hello.txt");
    //下载文件
    IOUtils.copyBytes(fis,fos,1024,true);
}

在这里插入图片描述执行代码,注意将上传的注释掉
在这里插入图片描述
检查D盘,发现文件就从hdfs上下载到D盘了

在这里插入图片描述

6、删除文件

代码如下:

/**
 * 删除文件
 * @param fileSystem
 * @throws IOException
 */
private static void delete(FileSystem fileSystem) throws IOException{
    //删除文件,目录也可以删除
    //如果要递归删除目录,则第二个参数需要设置为true
    //如果是删除文件或者空目录,第二个参数会被忽略
    boolean flag = fileSystem.delete(new Path("/test/hello02.txt"),true);
    if(flag){
        System.out.println("删除成功!");
    }else{
        System.out.println("删除失败!");
    }
}

在这里插入图片描述
执行代码,注意将上传、下载注释掉

在这里插入图片描述在这里插入图片描述
然后去hdfs上检查文件是否被删除了

执行代码前
在这里插入图片描述
执行代码后,发现文件就被删除了

在这里插入图片描述

7、整个代码汇总

如下:

package com.imooc.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.apache.hadoop.io.IOUtils;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * Java代码操作HDFS
 *  文件操作:上传、下载、删除文件
 */
public class HdfsOp {


    public static void main(String[] args) throws Exception{
        //创建一个配置对象
        Configuration conf = new Configuration();

        //指定HDFS的地址
        conf.set("fs.defaultFS","hdfs://bigdata01:9000");

        //获取操作HDFS的对象
        FileSystem fileSystem =FileSystem.get(conf);

        //上传文件
        //put(fileSystem);

        //下载文件
        //get(fileSystem);

        //删除文件
        delete(fileSystem);
    }

    /**
     * 文件上传
     * @param fileSystem
     * @throws IOException
     */
    private static void put(FileSystem fileSystem) throws IOException {
        //获取HDFS文件系统的输出流
        FSDataOutputStream fos = fileSystem.create(new Path("/user.txt"));

        //获取本地文件的输入流
        FileInputStream fis = new FileInputStream("D:\\user.txt");

        //上传文件:通过工具类把输入流拷贝到输出流里面,实现本地文件上传到HDFS
        IOUtils.copyBytes(fis,fos,1024,true);
    }

    /**
     * 下载文件
     * @param fileSystem
     * @throws IOException
     */
    private static void get(FileSystem fileSystem) throws IOException{
        //获取HDFS文件系统的输入流
        FSDataInputStream fis = fileSystem.open(new Path("/test/hello.txt"));
        //获取本地文件的输出流
        FileOutputStream fos = new FileOutputStream("D:\\hello.txt");
        //下载文件
        IOUtils.copyBytes(fis,fos,1024,true);
    }

    /**
     * 删除文件
     * @param fileSystem
     * @throws IOException
     */
    private static void delete(FileSystem fileSystem) throws IOException{
        //删除文件,目录也可以删除
        //如果要递归删除目录,则第二个参数需要设置为true
        //如果是删除文件或者空目录,第二个参数会被忽略
        boolean flag = fileSystem.delete(new Path("/test/hello02.txt"),true);
        if(flag){
            System.out.println("删除成功!");
        }else{
            System.out.println("删除失败!");
        }
    }

}

8、log4j配置

注意,我们在执行代码的时候,发现控制台有一些红色的报错信息,这个是因为缺少日志的配置,下面进行配置下,执行代码就不会报错了。
在这里插入图片描述
1:pom.xml中增加log4j依赖

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.10</version>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>1.7.10</version>
</dependency>

在这里插入图片描述2:resources目录下添加log4j.properties文件

在项目的src\main\resources目录中添加log4j.properties

log4j.properties文件内容如下:

log4j.rootLogger=info,stdout

log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout 
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c] [%p] - %m%n

在这里插入图片描述再执行代码,发现就不会有那些红色的警告信息了。

在这里插入图片描述

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-02-24 15:21:56  更:2022-02-24 15:22:10 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 10:58:34-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码