HDFS介绍
HDFS的全称是Hadoop Distributed File System ,Hadoop的 分布式 文件 系统
它是一种允许文件通过网络在多台主机上分享的文件系统,可以让多台机器上的多个用户分享文件和存储
空间
其实分布式文件管理系统有很多,HDFS只是其中一种实现而已
还有 GFS(谷歌的)、TFS(淘宝的)、S3(亚马逊的)
为什么会有多种分布式文件系统呢?这样不是重复造轮子吗?
不是的,因为不同的分布式文件系统的特点是不一样的,HDFS是一种适合大文件存储的分布式文件系
统,不适合小文件存储,什么叫小文件,例如,几KB,几M的文件都可以认为是小文件
HDFS命令
查看目录:hdfs dfs -ls /
上传文件:hdfs dfs -put README.txt /
查看内容:hdfs dfs -cat /README.txt
下载文件:hdfs dfs -get /README.txt .
创建文件夹:hdfs dfs -mkdir /test
删除文件:hdfs dfs -rm /README.txt
删除目录:hdfs dfs -rm -r /abc
Java代码操作HDFS
在本机hosts加入
192.168.32.128 bigdata01
192.168.32.129 bigdata02
192.168.32.130 bigdata03
创建maven项目
加入依赖
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>3.2.0</version>
</dependency>
取消HDFS用户权限验证(本地测试)
主从节点都要将hdfs-site.xml修改配置
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>bigdata01:50090</value>
</property>
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>
修改后重启:stop-all.sh,start-all.sh
Java代码
package com.junfeng.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;
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("/README.txt"));
//获取本地文件的输出流
FileOutputStream fos = new FileOutputStream("D:\\README.txt");
//下载文件
IOUtils.copyBytes(fis, fos, 1024, true);
}
/**
* 删除文件
*
* @param fileSystem
* @throws IOException
*/
private static void delete(FileSystem fileSystem) throws IOException {
boolean flag = fileSystem.delete(new Path("/test.txt"), true);
if (flag) {
System.out.println("删除成功");
} else {
System.out.println("删除失败");
}
}
}