- 高容错和高可用性
- 流式数据访问
- 弹性存储,支持大规模数据集
- 简答一致性模型(一次写,多次读)
- 移动计算而非移动数据
- 协议和接口多样
- 多样的数据管理功能
- NameNode(NN)
元数据管理者,管理NameSpace(文件系统命名空间)记录文件是如何切分并存储在那些节点上的一些信息
NameSpace上任何属性的更改都由NameNode记录,维护整个系统的文件和目录.
- DataNode(DN)
DN是文件系统的工作节点,根据客户端或者NameNode发送的管理指令,执行对应的读写操作
通过心跳检测机制定期向NameNode发送自身存储块的信息
- Client
Client代表用户与NN或者DN进行交互
用户面向Client 的API编程
- 客户端首先向NameNode发起读文件请求
- NN将该文件的分块信息,存储位置信息返回给客户端
- 客户端依据NN返回来的元数据向DataNode并行读取文件
- 第一步:客户端向NN发起写文件请求,NN检测可写的节点信息,如果文件较大进行分块处理(客户端申请的时候是一个块一个块的申请),比如有三个副本,每次NN只返回一个block块的三个副本位置信息.
- 第二步:客户端获取到对应block块所处的DN节点位置后,客户端开始写操作,首先向第一个DN写,以数据包的形式发送,存在多个副本的时候,包的写入是依次进行的,写入第一个DN后,第一个DN会向第二个DN写数据依次进行,写完第一个block后,再重复进行第一步和第二步
- 第三步:等待所有的块写完后,客户端接收到全部写完的ack回复,然后关闭socket流.DN向NN报告新增的block块信息.
- 冗余备份
- 核心文件备份
- 跨机架存储
- 心跳检测机制
- 安全模式
- 数据完整性校验
- 空间回收(防止误删)
以下命令都以hdfs dfs 开头
| 命令 | 含义 |
|---|---|
| -mkdir | 创建目录 |
| -touchz | 创建文件 |
| -rmr | 递归删除 |
| -cat | 查看文件内容 |
| -text | 查看压缩文件内容 |
| -ls | 查看目录文件 |
| -du -h | 查看磁盘使用情况 |
| -copyToLocal | 下载文件到本地 |
| -copyFromLocal | 上传文件到HDFS |
以下均以hdfs dfsadmin开头
| 命令 | 含义 |
|---|---|
| -report | 查看文件系统报告信息 |
| -help | 查看帮助信息 |
| -setQuota | 设置目录配额,限定指定目录下的名字个数 |
| -safemode | 安全模式管理 |
- 要求:需要使用java读取hdfs的一个文本文件,并将其内容打印在出来
- 环境准备
- maven环境准备
- 引入hdfs依赖
- 打包配置:配置主类
- maven环境准备
- 代码编写
- 定义路径
- 读取文件并返回一个字符串
- 创建配置类对象Configuration conf
- 创建文件操作对象FileSystem fs = FileSystem.open(conf)
- 获取文件输入流 fs.open(new Path(路径))
- 将输入流转换成字节数组输出流
- 将字节数组输出流转换成字符串
- 打印到控制台
- 上线测试
pom配置文件
4.0.0 com.fjh readFromHDFS 1.0-SNAPSHOT 8 8 org.apache.hadoop hadoop-client 2.7.4 provided HDFSUtil maven-compiler-plugin 2.3.2 1.8 1.8 UTF-8 maven-assembly-plugin jar-with-dependencies com.fjh.Main make-assembly package assembly
java代码
package com.fjh.util;
import com.fjh.config.Config;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
public class ReadUtil {
public static String readWithPath(String path) throws Exception {
//非空校验
if(path==null||path.trim().length()==0){
throw new Exception("路径不能为空");
}
//获取hdfs的输入流
byte[] context = getInputStreamFromHDFSWithPath(path);
//返回字符串
return new String(context, StandardCharsets.UTF_8);
}
//获取hdfs的文件输入流
public static byte[] getInputStreamFromHDFSWithPath(String path) throws Exception {
//非空校验
if(path==null||path.trim().length()==0){
throw new Exception("路径不能为空");
}
//通过配置对象创建文件操作系统
FileSystem fs = FileSystem.get(Config.conf);
//创建HDFS文件路径
Path file = new Path(path);
//获取流
FSDataInputStream inputStream = fs.open(file);
//将流转换成字节数组
//创建一个缓存流
byte[] buf = new byte[10*1024];
//每次读取的长度
int readLength = 0;
//输出流
ByteArrayOutputStream bos = new ByteArrayOutputStream();
//开始读取流到输出流
while((readLength=inputStream.read(buf))>0){
//读多少写多少,防止多写
bos.write(buf,0,readLength);
}
inputStream.close();
bos.close();
return bos.toByteArray();
}
}



