

前言
在这里,我们将重点介绍Hadoop随附的分布式文件系统,HDFS是Hadoop分布式文件系统. HDFS可以存储非常大的文件,并且可以部署在廉价的服务器上,这适合一次写入和多次读取的情况. 但是,HDFS不适合存储大量小文件并且修改了文件内容的低延迟方案. HDFS被广泛使用,例如: MR任务,Spark任务,Hive数据仓库和Hbase,它们的基础存储可以基于HDFS. 本章将介绍HDFS群集的体系结构设计以及相关的重要概念.
文字
HDFS设计和概念
HDFS群集是典型的主/从体系结构. 主节点称为NameNode,从节点称为DataNode. 最简单的HDFS群集是NameNode节点和多个DataNode节点. HDFS集群的架构图如下:

块: 数据块. HDFS群集将存储的文件分为多个子块. 该块用作独立的存储单元. 默认大小为128M. 如果文件超过单个群集计算机的存储容量,则分区可以解决问题;其次,按块存储和备份可以简化系统的设计. 默认块大小会修改hdfs-site.xml文件中的dfs.blocksize配置.
NameNode: HDFS群集的主节点,维护群集文件的目录结构(名称空间)并编辑日志文件,并记录每个文件块位于内存中的数据节点的信息.
DataNode: HDFS集群的从节点,负责存储实际数据. 根据需要存储和检索数据块分布式文件存储技术,并定期向NameNode发送其存储的数据块列表. 为了实现数据存储的高可靠性,HDFS将块存储在不同的DataNode节点上. 默认值为3,可以通过hdfs-site.xml文件中的dfs.replication配置修改默认值. 如果当前DataNode中的数据块已损坏,则可以从其他DataNode节点复制正确的数据块.
以上是在架构图中显而易见的几个重要概念. 接下来,我们将介绍隐藏在架构图中的几个重要概念,以及架构设计中的高可用性和可伸缩性.
联邦HDFS: 这主要是为了解决可伸缩性问题. 我们知道数据和数据位置之间的对应关系存储在NameNode进程的内存中. 对于具有大量文件数据的群集,NameNode的内存将成为群集大小扩展的瓶颈. 因此,单个NameNode群集是不可取的. Hadoop 2.x发行版引入了联合HDFS,以通过将NameNode节点添加到集群来允许水平扩展. 每个NameNode管理一部分名称空间. 每个NameNode维护一个名称空间卷. 名称空间卷彼此独立. 一个NameNode的故障不会影响其他NameNode维护的命名空间.

HDFS HA: 此解决方案具有很高的可用性,即HDFS High Available. 在此实现中配置了一对主备NameNode. 当活动NameNode发生故障时,备用NameNode将接管相应的任务. 此过程对用户是透明的. 为了实现此设计,需要在体系结构中进行以下修改:
1. HA的两个NameNode通过高可用性共享存储共享编辑日志,目的是使备用NameNode能够接管工作并与主NameNode的状态同步. QJM(仲裁日志管理器)旨在提供高度可用的日志编辑器,建议将其用于大多数HDFS群集. QJM以一组日志节点(通常为3个)的形式运行,并且每次编辑都必须写入大多数日志节点,因此系统可以容忍任何一个节点的丢失,并且日志节点为JournalNode.
2. DataNode需要同时向两个NameNode发送数据报告,因为数据块的映射信息存储在NameNode的内存中
3. 客户端需要处理对用户透明的NameNode故障问题
HDFS的基本操作
命令行界面
操作HDFS的命令行界面是最简单,最方便的方法. HDFS命令与Linux本机命令非常相似. 您可以通过hadoop fs help命令查看HDFS支持的所有命令. 接下来,我们将介绍常用的命令:
hadoop fs -put
hadoop fs -ls
hadoop fs -cat
hadoop fs -text
hadoop fs -rm

以上是更常用的HDFS命令. 您可以通过查看帮助文件以输出不同的信息,向每个命令添加一些命令行选项. 以ls命令为例,看看HDFS输出的文件信息.
hadoop fs -ls / hadoop-ex / wordcount / input
-rw-r--r-- 3个根超级组32 2019-03-03 01:34 / hadoop-ex / wordcount / input / words
-rw-r--r-- 3个根超级组28 2019-03-03 01:46 / hadoop-ex / wordcount / input / words2
您会发现输出类似于Linux下的ls命令. 第1部分显示文件类型和权限分布式文件存储技术,第2部分是副本3的数量,第3部分和第4部分是文件所属的用户和用户组,第5部分是文件大小(如果目录为0),第6部分和7是文件修改日期和时间,第8部分是文件的路径和名称. HDFS中有一个超级用户,即启动NameNode的用户.
Java接口
与命令行界面相比,Java界面更加灵活和强大. 但是使用起来不是很方便. 通常,您可以使用Java接口在MR或Spark任务中读取HDFS上的数据. 本章仅以读取HDFS文件数据为例,介绍Java接口的使用,主要使用FileSystem API来实现,读者可以查阅更具体,更多的使用方法.
package com.cnblogs.duma.hdfs;
导入org.apache.hadoop.conf.Configuration;
导入org.apache.hadoop.fs.FileSystem;
导入org.apache.hadoop.fs.Path;
导入org.apache.hadoop.io.IOUtils;

import java.io.IOException;
import java.io.InputStream;
导入java.net.URI;
公共类FileSystemEx {
公共静态void main(String [] args)引发IOException {
Configuration conf = new Configuration();
// uri是core-site.xml文件中fs.defaultFS配置的值
FileSystem fs = FileSystem.get(URI.create(“ hdfs: // hadoop0: 9000”),conf);
InputStream in = null;
尝试{
//指定打开的文件
in = fs.open(new Path(“ / hadoop-ex / wordcount / input / words”));

///将输入流复制到标准输出流
IOUtils.copyBytes(in,System.out,4096,false);
}捕获(IOException e){
e.printStackTrace();
}最后{
//关闭输入流
IOUtils.closeStream(in);
}
}
}
结束
本章主要介绍HDFS的体系结构设计和一些重要概念. 这些设计内容可能对我们设计架构或编写代码很有帮助. 因此,学习一个框架不仅行之有效,而且还要更加关注其架构设计以及与其他架构相比的优缺点,这将极大地帮助我们的未来发展. 最后,我花了很少的空间介绍HDFS的基本操作,该操作方便文档并且不复杂,因此没有详细的介绍. 个人认为HDFS Java接口应用场景相对有限. 将来,处理HDFS可能会成为命令行界面.
文章来自:
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-284007-1.html
0
弄个破渔网让它拖着不是很好么
而且还是我家的路