网站首页 > java教程 正文
HDFS
HDFS,分布式文件系统
HDFS,Hadoop Distributed File System,分布式文件系统,有着高容错性(fault-tolerent)的特点,并且设计用来部署在低廉的(low-cost)硬件上,而且它提供高吞吐量(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。HDFS 放宽了(relax)POSIX 的要求(requirements)这样可以实现流的形式访问(streaming access)文件系统中的数据,HDFS 开始是为开源的 apache 项目nutch的基础结构而创建,HDFS是 hadoop项目的一部分,而hadoop又是lucene的一部分。
HDFS,环境搭建
上一节:大数据集群Hadoop搭建
Java操作HDFS文件系统
pom.xml
<dependencies>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>3.1.3</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.30</version>
</dependency>
</dependencies>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>
代码案例1:
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import java.io.IOException;
import java.net.URI;
import java.util.Arrays;
public class HdfsDemo {
public static void main(String[] args) throws Exception {
FileSystem fileSystem = getHdfs();
// 创建一个文件夹
fileSystem.mkdirs(new Path("/demo/hello"));
// 上传文件
Path localPath1 = new Path("D:\\Temp\\hello.txt");
Path remotePath1 = new Path("/demo/hello/");
fileSystem.copyFromLocalFile(false, true, localPath1, remotePath1);
Path localPath2 = new Path("D:\\Temp\\hello2.txt");
Path remotePath2 = new Path("/demo/hello/");
fileSystem.copyFromLocalFile(false, true, localPath2, remotePath2);
// 下载文件
Path remotePath3 = new Path("/demo/hello/hello2.txt");
Path remotePath4 = new Path("/demo/hello/helloworld2.txt");
fileSystem.rename(remotePath3, remotePath4);
// 下载文件
Path remoteDownPath1 = new Path("/demo/hello/hello.txt");
Path localDownPath1 = new Path("D:/Temp/hello3.txt");
// fileSystem.copyToLocalFile(false, remoteDownPath1, localDownPath1, true);
// 删除文件
fileSystem.delete(remoteDownPath1, false);
// 获取文件详细信息
fileDetail(fileSystem);
// 判断是文件夹还是文件
file(fileSystem);
close(fileSystem);
}
public static void file(FileSystem fileSystem) throws IOException {
FileStatus[] listStatus = fileSystem.listStatus(new Path("/"));
for (FileStatus status : listStatus) {
if (status.isFile()) {
System.out.println("文件:" + status.getPath().getName());
} else {
System.out.println("目录:" + status.getPath().getName());
}
}
}
public static void fileDetail(FileSystem fileSystem) throws IOException {
// 获取所有文件信息
RemoteIterator<LocatedFileStatus> listFiles = fileSystem.listFiles(new Path("/"), 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));
}
}
/**
* @return
* @throws Exception
*/
public static FileSystem getHdfs() throws Exception {
// 获取连接集群的地址
URI uri = new URI("hdfs://192.168.2.53:8020");
Configuration configuration = new Configuration();
//设置配置文件中副本的数量
configuration.set("dfs.replication", "2");
configuration.set("fs.defaultFS", "hdfs://192.168.2.53:8020");
// 用户
String user = "admin";
FileSystem fileSystem = FileSystem.get(uri, configuration, user);
return fileSystem;
}
/**
* @param fileSystem
* @throws IOException
*/
public static void close(FileSystem fileSystem) throws IOException {
if (fileSystem != null) {
fileSystem.close();
}
fileSystem = null;
}
}
代码案例2:
import java.io.FileInputStream;
import java.io.FileOutputStream;
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;
//操作HDFS
public class FileHdfsDownLoad {
//下载
public static void main(String[] args) throws Exception {
//创建一个操作HDFS的对象
Configuration config = new Configuration();
//设置java代码连接哪个hdfs
config.set("fs.defaultFS", "hdfs://192.168.2.53:8020");
//获取操作HDFS的对象
FileSystem fileSystem = FileSystem.get(config);
//下载文件
downloadFile(fileSystem);
// 上传文件
putFile(fileSystem);
// 关闭
fileSystem.close();
}
private static void putFile(FileSystem fileSystem) throws Exception {
//进行上传文件操作
//获取输入流
FileInputStream fileInputStream = new FileInputStream("D:/Temp/Anaconda.txt");
//获取hdfs中的输出流
Path remoteDownPath1 = new Path("/demo/hello/Anaconda.txt");
FSDataOutputStream fsDataOutputStream = fileSystem.create(remoteDownPath1);
//第一个参数是一个输入流、第二个参数是输出流,第三个是缓存区大小,第四个参数是是否关闭
IOUtils.copyBytes(fileInputStream, fsDataOutputStream, 1024, true);
}
private static void downloadFile(FileSystem fileSystem) throws Exception {
//获取hdfs分布式文件系统中的输入流
Path remoteDownPath1 = new Path("/demo/hello/hello2.txt");
FSDataInputStream fsDataInputStream = fileSystem.open(remoteDownPath1);
//获取本地文件输出流
FileOutputStream foFileOutputStream = new FileOutputStream("D:/Temp/hello3.txt");
//下载文件
IOUtils.copyBytes(fsDataInputStream, foFileOutputStream, 1024, true);
}
}
查看效果:
猜你喜欢
- 2024-09-30 SQL SERVER 清理日志文件的方法(sql server怎么清除日志)
- 2024-09-30 如何使用 Java 在 PDF 文档中添加、删除或旋转页面
- 2024-09-30 夯实基础:完全理解掌握Java文件类File
- 2024-09-30 Java基础——IO流(10)(java基础)
- 2024-09-30 Java编程思想:清除一收尾和垃圾收集
- 2024-09-30 Java教程Java 文件 IO 操作(java io写文件)
- 2024-09-30 近2万字详解JAVA NIO2文件操作,过瘾
- 2024-09-30 JAVA运维必备——linux的基本常见命令,也是“装逼”命令
- 2024-09-30 Java中常用IO流之文件流的基本使用姿势
- 2024-09-30 Java平台的海量小文件分布式文件系统BRFS-全套源码+文档
你 发表评论:
欢迎- 最近发表
-
- Java常量定义防暴指南:从"杀马特"到"高富帅"的华丽转身
- Java接口设计原则与实践:优雅编程的艺术
- java 包管理、访问修饰符、static/final关键字
- Java工程师的代码规范与最佳实践:优雅代码的艺术
- 编写一个java程序(编写一个Java程序计算并输出1到n的阶乘)
- Mycat的搭建以及配置与启动(mycat部署)
- Weblogic 安装 -“不是有效的 JDK Java 主目录”解决办法
- SpringBoot打包部署解析:jar包的生成和结构
- 《Servlet》第05节:创建第一个Servlet程序(HelloSevlet)
- 你认为最简单的单例模式,东西还挺多
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)