一、HDFS分布式文件存储
如果让你设计一款分布式文件存储需要考虑哪些问题?
- 数据上传下载的效率
- 数据的安全
- 用户操作数据的体验
二、HDFS操作文件的方式
1)、shell命令,2)、java api
三、企业中常见的存储架构DAS、NAS、SAN对比
文件存储架构.jpg
四、传统文件系统存在的弊端
- 性能低
- 可扩展性差
- 无法支撑高效率的计算分析
五、分布式文件存储需要解决的问题
- 如何解决海量数据存的下的问题----
- 如何解决海量数据文件查询便捷----
- 如何解决大文件传输效率慢----
- 如何解决硬件故障数据丢失----
- 如何解决用户查询视角统一规整----
六、HDFS设计目标
- 硬件故障是常态----故障检测和自动快速恢复(HDFS的核心架构目标)
- HDFS上的应用主要是以流式读取数据----用于批处理(不注重考虑实时性要求)
- 文件大小是GB到TB的级别
- HDFS应对文件要求的是write-one-read-many访问模型----(文件写入之后不再修改)
- 移动计算的代价比移动数据的代价低(数据不动程序动)
- HDFS被设计为可从一个平台轻松移植到另一个平台
七、HDFS应用场景
适合场景:大文件、数据流式访问、一次写入多次读取、低成本部署,廉价PC、高容错
不适合场景:小文件、数据交互式访问、频繁任意修改、低延迟处理
八、HDFS客户端核心类
- Configuration 配置类
- FileSystem 文件系统对象基类
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
public class HDFSClientTest {
private static Configuration conf = null;
private static FileSystem fs = null;
/**
* 初始化,与HDFS集群建立连接
* @throws IOException
*/
@Before
public void connect2HDFS() throws IOException {
//设置客户端身份,以具备权限操作HDFS,不设置的情况下默认是当前机器的登录用户权限
System.setProperty("HADOOP_USER_NAME", "root");
//创建配置对象实例
conf = new Configuration();
//设置操作的文件系统是HDFS,并且制定HDFS的操作地址
conf.set("fs.defaultFS","hadf://node1.itcast.cn:8020");
//创建FileSystem对象实例
fs = FileSystem.get(conf);
}
/**
* HDFS创建文件夹
*/
@Test
public void mkdir() throws IOException {
//首先判断文件夹是否存在
if(!fs.exists(new Path("/ichint"))){
fs.mkdirs(new Path("/ichint"));
}
}
/**
* 上传文件
*/
@Test
public void putFileToHDFS() throws IOException {
//创建本地文件路径
Path src = new Path("D:\\ichint\\scala\1.txt");
//HDFS文件路径
Path dst = new Path("/ichint/1.txt");
//上传文件
fs.copyFromLocalFile(src, dst);
}
/**
* 下载文件
*/
@Test
public void getFileFromHDFS() throws IOException {
//创建本地文件路径
Path dst = new Path("D:\\ichint\\scala\1.txt");
//HDFS文件路径
Path src = new Path("/ichint/1.txt");
//下载文件
fs.copyToLocalFile(src,dst);
}
/**
* 关闭客户端和HDFS的连接
* @throws IOException
*/
@After
public void close(){
//首先判断文件系统实例是否为null,如果为null,进行关闭
if (fs != null) {
try {
fs.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
image.png
image.png
大数据HDFS文件上传原理.jpg












网友评论