使用Java API 访问HDFS上的数据

news/2024/5/20 4:09:14 标签: java, hadoop, hdfs

文章目录

  • 一.概述
  • 二.搭建环境
    • 1.使用Maven构建Java程序,添加maven的依赖包
    • 2.修改hdfs-site.ml文件,添加如下配置,放开权限,重启hdfs服务
    • 3.单元测试的setUp和tearDown方法
    • 4.使用Java API操作HDFS的常用操作
      • 1)创建目录
      • 2)创建文件并写入数据
      • 3)重命名操作
      • 4)上传本地文件到HDFS
      • 5)查看某目录下的所有文件
      • 6)查看文件块信息
      • 7)下载一个文件到本地

一.概述

  • 除了可以用HDFS shell的方式 来访问HDFS上的数据,Hadoop还提供了以Java API的方式来操作HDFS上的数据.由于我们实际开发的大数据应用都是以代码的方式提交的,所以在代码中使用API的方式来操作HDFS数据必须掌握

二.搭建环境

1.使用Maven构建Java程序,添加maven的依赖包

  • 在pom.xml文件中的<dependencies>标签下添加如下代码:
<dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-common</artifactId>
      <version>2.6.0</version>
    </dependency>
    <dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-hdfs</artifactId>
      <version>2.6.0</version>
    </dependency>
    <dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-client</artifactId>
      <version>2.6.0</version>
    </dependency>
    <dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-mapreduce-client-core</artifactId>
      <version>2.6.0</version>
    </dependency>
    <dependency>
      <groupId>commons-logging</groupId>
      <artifactId>commons-logging</artifactId>
      <version>1.2</version>
    </dependency>

hdfssitemlhdfs_34">2.修改hdfs-site.ml文件,添加如下配置,放开权限,重启hdfs服务

<!-- 设置权限关闭,易于访问操作,否则可能因权限问题无法访问 -->
<property>
  <name>dfs.permissions</name>
  <value>false</value>
</property>

3.单元测试的setUp和tearDown方法

  • 在单元测试中,一般将初始化的操作放在setUp方法中完成,将关闭资源的操作放在tearDown方法中完成,代码如下:
java">package hadoop.hdfs;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.net.URI;

/**
 * @author sunyong
 * @date 2020/06/30
 * @description
 */
public class HDFSApp {
    public static final String HDFS_PATH="hdfs://hadoop110:9000";
    Configuration cfg=null;
    FileSystem fs = null;

    @Before
    public void setUp() throws Exception{
        System.out.println("HDFSApp.setUp()");
        cfg = new Configuration();
        fs= FileSystem.get(new URI(HDFS_PATH),cfg);
    }
    @After
    public void tearDown() throws Exception{
        cfg = null;
        fs= null;
        System.out.println("HDFSApp.tearDown()");
    }

}

4.使用Java API操作HDFS的常用操作

1)创建目录

java"> //创建目录操作
    @Test
    public void mkdir()throws Exception{
        String path = "/hdfsapi/test";
        fs.mkdirs(new Path(path));
        System.out.println("目录创建成功");
    }
  • 执行效果如如下:
    在这里插入图片描述
  • 去50070端口查看是否创建成功:
    在这里插入图片描述
  • 如上图所示创建成功!

2)创建文件并写入数据

java"> //创建文件操作
    @Test
    public void createFile()throws Exception{
        String path = "/hdfsapi/test/a.txt";
        FSDataOutputStream fsdos = fs.create(new Path(path));
        fsdos.write("hello world,I am creating file and output data".getBytes());
        fsdos.flush();
        System.out.println("创建文件并写入数据成功!");
        fsdos.close();
    }
  • 执行效果如下:
    在这里插入图片描述
  • hadoop环境下查看有没有该文件: hdfs dfs -cat /hdfsapi/test/a.txt,执行效果如下可知已创建文件并写入数据成功
    在这里插入图片描述

3)重命名操作

java">//重命名
    @Test
    public void rename() throws Exception{
        Path oldPath = new Path("/hdfsapi/test/a.txt");
        Path newPath = new Path("/hdfsapi/test/b.txt");
        System.out.println(fs.rename(oldPath,newPath));
    }
  • 执行效果如下:
    在这里插入图片描述
  • 去50070端口查看是否改名了,如下已成功改名:
    在这里插入图片描述

4)上传本地文件到HDFS

java"> //上传本地文件(是Java环境所在系统的文件,我这里是windows系统所以直接用的工程目录下的文件)到hdfs
    @Test
    public void copyFromLocal() throws Exception{
        //要复制的文件
        Path src = new Path("copyFile");
        //目标目录
        Path dist = new Path("/hdfsapi/test/");
        fs.copyFromLocalFile(src,dist);
        System.out.println("上传成功");
    }
  • 执行效果如下:
    在这里插入图片描述
  • 去50070端口查看是否成功,如下:
    在这里插入图片描述

5)查看某目录下的所有文件

java">//查看某目录下所有文件
    @Test
    public void listFiles() throws Exception{
        FileStatus[] listStatus = fs.listStatus(new Path("/hdfsapi/test/"));
        for (FileStatus status : listStatus) {
            //判断是文件还是目录
            String isDir = status.isDirectory()?"文件夹":"文件";
            //权限
            String permission = status.getPermission().toString();
            //副本系数
            short replication = status.getReplication();
            //长度
            long len = status.getLen();
            //路径
            String path = status.getPath().toString();
            System.out.println(isDir+"\t"+permission+"\t"+replication+"\t"+len+"\t"+path);
        }
    }
  • 执行效果如下:
    在这里插入图片描述

6)查看文件块信息

java">//查看文件块信息,即备份在哪几台机器,由于我布置的hadoop是伪分布环境,只有一台机器
    @Test
    public void getFileBlock() throws Exception{
        FileStatus fileStatus = fs.getFileStatus(new Path("/hdfsapi/test/b.txt"));
        BlockLocation[] blocks=fs.getFileBlockLocations(fileStatus,0,fileStatus.getLen());
        for (BlockLocation block : blocks) {
            for (String host : block.getHosts()) {
                System.out.println(host);
            }
        }
    }
  • 执行结果如下:
    在这里插入图片描述

7)下载一个文件到本地

  • 注意:下载时需要在windows系统上配置hadoop
  • a.解压hadoop压缩文件到windows系统上
    在这里插入图片描述
  • b.在windows系统上配置hadoop的环境变量
    在这里插入图片描述
    在这里插入图片描述
  • d.将以下文件拖入hadoop解压后目录的bin目录下,将hadoop.dll文件拖入系统盘的System32目录下(提取码: azpe)
    点我获取
    在这里插入图片描述
  • c.修改windows系统的主机列表(添加虚拟机上的主机):
    在这里插入图片描述
//下载一个文件到本地
    @Test
    public void testCopyToLocalFile() throws URISyntaxException, IOException, InterruptedException {
        fs.copyToLocalFile(new Path("/user/java/copyFile"),new Path("F:\\sunyong\\Java\\codes\\javaToHdfs\\download\\copyFile2.txt"));
        System.out.println("下载成功!");
    }
  • 执行效果如下
    在这里插入图片描述
  • 查看内容:
    在这里插入图片描述

http://www.niftyadmin.cn/n/516143.html

相关文章

Hadoop的序列化机制

文章目录一.什么是序列化和反序列化二.Hadoop的序列化三.Hadoop的序列化案例一.什么是序列化和反序列化 序列化:将对象转化为字节流,以便在网络上传输或者写在磁盘磁盘上进行永久存储反序列化:将字节流转回成对象序列化在分布式数据处理的两个领域经常出现: 进程间通信和永久储…

MapReduce原理及编程

文章目录一.关于MapReduce(一)什么是MapReduce?(二) MapReduce的设计思想(三) MapReduce特点(四)MapReduce实现WordCount(五)MapReduce执行过程(六)Key&Value类型二.MapReduce编程模型(一)InputFormat接口(二)Mapper类(三)Combiner类(四)Partitioner类(五)Reducer类(六)Ou…

MapReduce实现WordCount词频统计

文章目录一.设计分析二.代码开发1.新建maven工程,添加依赖2.编写Mapper类3.编写Reduce类4.编写Driver类执行Job5.执行会在本工程目录出现一个test目录打开目录中的part-r-00000文件即统计词频文件,如下:6.在hadoop中运行1)修改Driver类中输入输出路径:2)打jar包将jar包上传到ha…

JavaSQL 阶段考试错题集

文章目录一.Java部分1.选择题2.简答题3.编程题二.SQL部分1.简答题2.编程题一.Java部分 1.选择题 3.关于 Java 堆&#xff0c;下面说法错误的是&#xff08;&#xff09;。 A.所有类的实例都是在堆上分配内存。 B.对象所占的堆内存是由自动内存管理系统回收。 C.堆内存由存活和…

使用MapReduce实现join操作

文章目录一.概述二.需求三.mapreduce实现join四.MapReduce Map端 join实现原理(没有reduce处理)一.概述 熟悉SQL的读者都知道,使用SQL语法实现join是很简单的,只需要一条SQL语句即可,但是在大数据场景下使用MapReduce编程模型实现join还是比较繁琐的在实际生产中我们可以借助H…

详解数据库设计中的三大范式理论

文章目录一.第一范式(Normal Form,1NF)二.第二范式(2NF)三.第三范式(3NF)四.解析表1:客人住宿信息表的客房实体五.规范化和性能之间的关系六.三大范式总结一.第一范式(Normal Form,1NF) 第一范式的目标是确保每列的原子性.如果每列(或每个属性值)都是不可再分的最小数据单元(也…

分布式资源调度框架YARN

文章目录一.YARN产生背景二.YARN(Yet Another Resource Negotiator)概述三.YARN的基本架构核心组件(一)YARN架构(二) 核心组件1.ResouceManager2.YARN架构核心组件-NodeManager3. YARN架构核心组件-ApplicationMaster4. YARN架构核心组件-Container5. YARN的工作机制如下图:(三…

详解MapReduce过程

文章目录一.MapReduce工作流程图片如下二.工作流程机制详解1.TextInputFormat读取文件详细解析2.map端(注意map task 数量由切片数量决定)3.reduce端一.MapReduce工作流程图片如下 二.工作流程机制详解 1.TextInputFormat读取文件详细解析 TextInputFormat的源码注释为: 用于…