李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
大数据
正文
04.HDFS之API操作
Leefs
2021-09-16 PM
1370℃
0条
[TOC] ### 前言 本次操作使用过的版本是`hadoop-client 3.1.3`,在进行操作之前,需要创建好一个Maven项目,在进行后续的操作。 ### 一、概念 Hadoop中关于文件操作类基本上全部是在"**org.apache.hadoop.fs**"包中,这些API能够支持的操作包含:打开文件,读写文件,删除文件等。 Hadoop类库中最终面向用户提供的**接口类**是**FileSystem**,该类是个**抽象类**,只能通过来类的get方法得到具体类。 ### 二、实操 #### 2.1 引入Maven依赖 ```xml
org.apache.hadoop
hadoop-client
3.1.3
org.apache.hadoop
hadoop-hdfs
3.1.3
org.apache.hadoop
hadoop-hdfs-client
3.1.3
provided
junit
junit
4.12
org.slf4j
slf4j-log4j12
1.7.30
``` #### 2.2 引入日志配置文件 **log4j.properties** ```xml log4j.rootLogger=INFO, stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n log4j.appender.logfile=org.apache.log4j.FileAppender log4j.appender.logfile.File=target/spring.log log4j.appender.logfile.layout=org.apache.log4j.PatternLayout log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n ``` #### 2.3 代码 ```java 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.io.IOException; import java.net.URI; import java.net.URISyntaxException; import java.util.Arrays; /** * 客户端代码常用套路 * 1、获取一个客户端对象 * 2、执行相关的操作命令 * 3、关闭资源 * HDFS zookeeper */ public class HdfsClient { private FileSystem fs; @Before public void init() throws URISyntaxException, IOException, InterruptedException { // 连接的集群地址 URI uri = new URI("hdfs://hadoop102:8020"); // 创建一个配置文件 Configuration configuration = new Configuration(); //设置副本数 configuration.set("dfs.replication", "2"); // 用户 String user = "root"; // 1 获取到了客户端对象 fs = FileSystem.get(uri, configuration, user); } @After public void close() throws IOException { // 3 关闭资源 fs.close(); } /** * 创建目录 * @throws IOException */ @Test public void testmkdir() throws IOException { // 2 创建一个文件夹 fs.mkdirs(new Path("/data/llc/demo")); } /** * 本地文件上传HDFS * 参数优先级 * hdfs-default.xml => hdfs-site.xml=> 在项目资源目录下的配置文件 =》代码里面的配置 * @throws IOException */ @Test public void testPut() throws IOException { // 参数解读:参数一:表示删除原数据; 参数二:是否允许覆盖;参数三:原数据路径; 参数四:目的地路径 fs.copyFromLocalFile(false, true, new Path("D:\\air.csv"), new Path("hdfs://hadoop102:8020/data/llc/demo")); } /** * 通过create方法上传文件 * 当文件已存在时会进行覆盖 * @throws IOException */ @Test public void testPut2() throws IOException { FSDataOutputStream fos = fs.create(new Path("/data/llc/llc.txt")); //写入文件内容 fos.write("hello world".getBytes()); } /** * 文件下载 * @throws IOException */ @Test public void testGet() throws IOException { // 参数的解读:参数一:原文件是否删除;参数二:原文件路径HDFS; 参数三:目标地址路径Win ; 参数四: // fs.copyToLocalFile(true, new Path("hdfs://hadoop102:8020/data/llc/demo/air.csv"), new Path("D:\\"), true); fs.copyToLocalFile(false, new Path("hdfs://hadoop102:8020/data/llc/llc.txt"), new Path("D:\\"), false); } /** * 删除 * @throws IOException */ @Test public void testRm() throws IOException { // 参数解读:参数1:要删除的路径; 参数2 : 是否递归删除 // 删除文件 // fs.delete(new Path("/data/llc/word.csv"),false); // 删除空目录 // fs.delete(new Path("/data/llc/demo"), false); // 删除非空目录 fs.delete(new Path("/data/llc"), true); } /** * 文件的更名和移动 * @throws IOException */ @Test public void testmv() throws IOException { // 参数解读:参数1 :原文件路径; 参数2 :目标文件路径 // 对文件名称的修改 // fs.rename(new Path("/data/input/word.csv"), new Path("/data/input/word2.csv")); // 文件的移动和更名 // fs.rename(new Path("/data/input/demo01/test.csv"),new Path("/data/input/llc.csv")); // 目录更名 fs.rename(new Path("/data/input/demo01"), new Path("/data/input/demo")); } /** * 获取文件详细信息 * @throws IOException */ @Test public void fileDetail() throws IOException { // 获取所有文件信息 RemoteIterator
listFiles = fs.listFiles(new Path("/data/input"), true); // 遍历文件 while (listFiles.hasNext()) { LocatedFileStatus fileStatus = listFiles.next(); System.out.println("==========" + fileStatus.getPath() + "========="); System.out.println(fileStatus.getPermission()); System.out.println(fileStatus.getOwner()); System.out.println(fileStatus.getGroup()); System.out.println(fileStatus.getLen()); System.out.println(fileStatus.getModificationTime()); System.out.println(fileStatus.getReplication()); System.out.println(fileStatus.getBlockSize()); System.out.println(fileStatus.getPath().getName()); // 获取块信息 BlockLocation[] blockLocations = fileStatus.getBlockLocations(); System.out.println(Arrays.toString(blockLocations)); } } /** * 判断是文件夹还是文件 * @throws IOException */ @Test public void testFile() throws IOException { FileStatus[] listStatus = fs.listStatus(new Path("/data/input")); for (FileStatus status : listStatus) { if (status.isFile()) { System.out.println("文件:" + status.getPath().getName()); } else { System.out.println("目录:" + status.getPath().getName()); } } } } ``` ### 三、项目目录结构 ![04.HDFS之API操作01.jpg](https://lilinchao.com/usr/uploads/2021/09/4205293856.jpg)
标签:
Hadoop
,
HDFS
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:
https://lilinchao.com/archives/1493.html
上一篇
03.HDFS读写流程
下一篇
05.HDFS之NameNode和SecondaryNameNode
评论已关闭
栏目分类
随笔
2
Java
326
大数据
229
工具
31
其它
25
GO
47
NLP
4
标签云
字符串
Hadoop
散列
前端
Python
gorm
Yarn
队列
RSA加解密
Hive
Stream流
ajax
国产数据库改造
Java
Golang基础
GET和POST
锁
Linux
Golang
JavaWEB项目搭建
数据结构和算法
稀疏数组
Quartz
Nacos
Docker
MyBatis
Flume
Scala
Elastisearch
CentOS
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞
评论已关闭