原理
假设前提与设计目标
- 硬件错误
- 大规模数据集
- 简单的一致性模型
- 移动计算比移动数据共划算
- 异构软硬件平台见的可以执行
组件
- Namenode:HDFS的守护进程,用来管理文件系统的命名空间,负责记录文件是如何分割成数据块,以及这些数据块分别被存储到哪些数据节点上,它的主要功能是对内存及IO进行集中管理。
- Datanode:文件系统的工作节点,根据需要存储和检索数据块,并且定期向Namenode发送它们所存储的块的列表。
- Secondary Namenode:辅助后台程序,与NameNode进行通信,以便定期保存HDFS元数据的快照,用以备份和恢复数据。
在Namenode节点上,fsimage保存了元数据镜像文件(文件系统的目录树),而edits中完整记录了元数据的操作日志(针对文件系统做的修改操作记录)。Namenode内存中存储的元数据可以用“fsimage+edits”来表达。而SecondaryNamenode负责定时(默认1小时)从Namenode上获取fsimage和edits进行合并,然后再发送给Namenode,减少Namenode的工作量。
每个文件存储成一系列的数据块(128MB)。为了容错,文件的所有数据块都会有副本。每个文件的数据块大小和副本系数都是可配置的。
文件系统shell
命令形式:hadoop fs -cmd
java api
maven依赖:
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>3.2.0</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-hdfs</artifactId>
<version>3.2.0</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>3.2.0</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-mapreduce-client-core</artifactId>
<version>3.2.0</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
代码:
@org.junit.Test
public void downloadFile() throws URISyntaxException, IOException {
// 获得FileSystem对象
FileSystem fileSystem = FileSystem.get(new URI("hdfs://192.168.31.101:9000"), new Configuration());
// 调用open方法进行下载,参数HDFS路径
InputStream in = fileSystem.open(new Path("/wcinput/logs/hadoop-hadoop-namenode-hadoop1.log"));
// 创建输出流,参数指定文件输出地址
OutputStream out = new FileOutputStream("D://nn.log");
// 使用Hadoop提供的IOUtils,将in的内容copy到out,设置buffSize大小,是否关闭流设置true
IOUtils.copyBytes(in, out, 4096, true);
}
@Test
public void uploadFile() throws URISyntaxException, IOException, InterruptedException {
FileSystem fileSystem = FileSystem.get(new URI("hdfs://192.168.31.101:9000"), new Configuration(),"root");
// 获得FileSystem对象,指定使用root用户上传
// FileSystem fileSystem = FileSystem.get(new URI("hdfs://192.168.0.0:9000"), new Configuration(), );
// 创建输入流,参数指定文件输出地址
InputStream in = new FileInputStream("D:\\apache-maven-3.6.3\\conf\\settings.xml");
// 调用create方法指定文件上传,参数HDFS上传路径
OutputStream out = fileSystem.create(new Path("/settings.xml"));
// 使用Hadoop提供的IOUtils,将in的内容copy到out,设置buffSize大小,是否关闭流设置true
IOUtils.copyBytes(in, out, 4096, true);
}
数据流
DataNode在写数据的时候创建packet(64k,包含多个chunk 512b数据+4b校验码),DateNode间建立数据通道。DataNode的选择与Hadoop的机架感知能力有关。
packet会放在一个dataQueue中,成功确认,失败回滚切换DN继续传输。
具体要看源码
NameNode
作用:
保存HDFS所有文件的元数据
接收客户端的请求
NameNode接收DataNode上报的信息,给DataNode分配任务