本章内容介绍下 Hadoop 自带的分布式文件系统,HDFS 即 Hadoop Distributed Filesystem。HDFS 能够存储超大文件,可以部署在廉价的服务器上,适合一次写入多次读取的场景。但 HDFS 不适合低延迟,存储大量小文件以及修改文件内容的场景。HDFS 应用比较广泛,如:MR任务、Spark任务、Hive 数据仓库以及 Hbase 数据库,它们的底层存储都可以基于 HDFS 。本章将介绍 HDFS 集群的架构设计以及相关的重要概念。

HDFS的设计以及概念

HDFS集群是典型的 master/slave 架构,master 节点叫做 NameNode,salve 节点叫做 DataNode。最简单的 HDFS 集群便是一个 NameNode 节点和多个 DataNode 节点,HDFS 集群的架构图如下

Block:数据块,HDFS 集群将存储的文件划分为多个分块,块作为独立的存储单元,默认大小为为 128M。如果某个文件超过集群单机存储容量,分块可以解决该问题;其次按照块进行存储、备份能简化系统的设计。默认块大小修改 hdfs-site.xml 文件中的 dfs.blocksize 配置。

NameNode:HDFS 集群的 Master 节点,维护集群文件的目录结构(命名空间)和编辑日志文件,同时在内存中记录文件各个块所在的数据节点的信息。

DataNode:HDFS 集群的 Slave 节点,负责存储实际的数据。根据需要存储和检索数据块,并定期向 NameNode 发送他们所存储的数据块列表。为了实现数据存储的高可靠,HDFS 将一个块存储在不同的 DataNode 节点, 默认是 3 个,可以通过 hdfs-site.xml 文件中的 dfs.replication 配置修改默认值。如果当前 DataNode 中的数据块损坏, 可以从其他 DataNode 节点复制一个正确的数据块。

以上是架构图中显而易见的几个重要概念,接下来将结合架构设计中的高可用、可扩展性来介绍下架构图中隐藏的几个重要概念。

联邦 HDFS:这个主要是为了解决可扩展性的问题,我们知道 NameNode 进程的内存中存放了数据与数据位置的对应关系,对于一个文件数据量多的集群来说,NameNode 的内存将成为集群规模扩大的瓶颈。因此,单一 NameNode 的集群并不可取。Hadoop 2.x 的发行版引入了联邦 HDFS 允许向集群中添加 NameNode 节点实现横向扩展。每一个 NameNode 管理命名空间中的一部分,每个 NameNode 维护一个命名空间卷(namespace volume),命名空间卷之间相互独立,一个 NameNode 失效不会影响其他 NameNode 维护的命名空间。

HDFS HA: 这个解决高可用,即 HDFS High Available。这一实现中配置了一对活动-备用(active-standby)NameNode。当活动的 NameNode 失效,备用 NameNode 会接管相应的任务,这一过程对用户透明。实现这一设计,需要在架构上做如下修改:

  1. HA 的两个 NameNode 之间通过高可用共享存储实现编辑日志的共享,目的是为了能够使备用 NameNode 接管工作后实现与主 NameNode 状态同步。QJM(日志管理器,quorum journal manager)是为提供一个高可用的日志编辑而设计的,被推荐用于大多数 HDFS 集群中。QJM 以一组日志节点的形式运行,一般是 3,每一次编辑必须写入多数日志节点,因此系统可以忍受任何一个节点丢失,日志节点便是 JournalNode。

  2. DataNode 需要同时向 2 个 NameNode 发送数据报告,因为数据块的映射信息存储在 NameNode 的内存中

  3. 客户端需要处理 NameNode 失效的问题,对用户透明

HDFS的基本操作

命令行接口

命令行接口操作 HDFS 是最简单、最方便的方式。HDFS 的命令与 Linux 本地命令非常相似,可以通过 hadoop fs help 命令查看 HDFS 所支持所有命令,接下来介绍下常用的命令

hadoop fs -put <localsrc> <dst> #将本地文件上传至 HDFS
hadoop fs -ls <path> # 与 Linux ls命令类似
hadoop fs -cat <src> #查看 HDFS 文件数据
hadoop fs -text <path> # 同 cat 命令, 可以看 SequenceFile、压缩文件
hadoop fs -rm <src> # 删除 HDFS 文件或目录

以上是比较常用的 HDFS 命令,查看帮助文档可以在每个命令上增加一些命令行选项,输出不同的信息。以 ls 命令为例,看一下 HDFS 输出的文件信息

hadoop fs -ls /hadoop-ex/wordcount/input
-rw-r--r--   3 root supergroup         32 2019-03-03 01:34 /hadoop-ex/wordcount/input/words
-rw-r--r-- 3 root supergroup 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接口更加灵活,更强大。但用起来不是很方便,一般可以在 MR 或者 Spark 任务中使用 Java 接口读取 HDFS 上的数据。本章仅举一个读取 HDFS 文件数据的例子介绍一下 Java 接口的使用方式,主要使用 FileSystem API 来实现,更具体和更多的使用方法读者可以自行查阅。

package com.cnblogs.duma.hdfs;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils; import java.io.IOException;
import java.io.InputStream;
import java.net.URI; public class FileSystemEx {
public static void main(String[] args) throws IOException {
Configuration conf = new Configuration();
// uri 便是 core-site.xml 文件中 fs.defaultFS 配置的值
FileSystem fs = FileSystem.get(URI.create("hdfs://hadoop0:9000"), conf);
InputStream in = null; try {
// 指定打开的文件
in = fs.open(new Path("/hadoop-ex/wordcount/input/words"));
// 将输入流拷贝到标准输出流
IOUtils.copyBytes(in, System.out, 4096, false);
} catch (IOException e) {
e.printStackTrace();
} finally {
// 关闭输入流
IOUtils.closeStream(in);
}
}
}

小结

本章主要介绍了 HDFS 的架构设计和一些重要的概念,这些设计上的东西可能对我们自己设计架构或者写代码会有帮助。所以,学习一个框架不光会用,更要注重他的架构设计,以及跟其他架构对比的优缺点,这对我们以后的成长有很大的帮助。最后花了少量篇幅介绍了 HDFS 的基本操作,这方便文档比较全,并且并不复杂,因此没有详细的介绍。个人认为 HDFS Java 接口应用场景相对有限,日后跟 HDFS 打交道更多的可能还是命令行接口。

大数据技术 - 分布式文件系统 HDFS 的设计的更多相关文章

  1. 【大数据】分布式文件系统HDFS 练习

    作业要求来自于https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/3292 利用Shell命令与HDFS进行交互 以”./bin/dfs d ...

  2. 大数据:Hadoop(HDFS 的设计思路、设计目标、架构、副本机制、副本存放策略)

    一.HDFS 的设计思路 1)思路 切分数据,并进行多副本存储: 2)如果文件只以多副本进行存储,而不进行切分,会有什么问题 缺点 不管文件多大,都存储在一个节点上,在进行数据处理的时候很难进行并行处 ...

  3. 【转载】Hadoop分布式文件系统HDFS的工作原理详述

    转载请注明来自36大数据(36dsj.com):36大数据 » Hadoop分布式文件系统HDFS的工作原理详述 转注:读了这篇文章以后,觉得内容比较易懂,所以分享过来支持一下. Hadoop分布式文 ...

  4. 【学习笔记】大数据技术原理与应用(MOOC视频、厦门大学林子雨)

    1 大数据概述 大数据特性:4v volume velocity variety value 即大量化.快速化.多样化.价值密度低 数据量大:大数据摩尔定律 快速化:从数据的生成到消耗,时间窗口小,可 ...

  5. 大数据技术原理与应用——分布式文件系统HDFS

    分布式文件系统概述 相对于传统的本地文件系统而言,分布式文件系统(Distribute File System)是一种通过网络实现文件在多台主机上进行分布式存储的文件系统.分布式文件系统的设计一般采用 ...

  6. 大数据 --> 分布式文件系统HDFS的工作原理

    分布式文件系统HDFS的工作原理 Hadoop分布式文件系统(HDFS)是一种被设计成适合运行在通用硬件上的分布式文件系统.HDFS是一个高度容错性的系统,适合部署在廉价的机器上.它能提供高吞吐量的数 ...

  7. 大数据技术之Hadoop3.1.2版本完全分布式部署

    大数据技术之Hadoop3.1.2版本完全分布式部署 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.主机环境准备 1>.操作系统环境 [root@node101.yinz ...

  8. 大数据技术之Hadoop3.1.2版本伪分布式部署

    大数据技术之Hadoop3.1.2版本伪分布式部署 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.主机环境准备 1>.操作系统环境 [root@node101.yinzh ...

  9. 寻找丢失的微服务-HAProxy热加载问题的发现与分析 原创: 单既喜 一点大数据技术团队 4月8日 在一点资讯的容器计算平台中,我们通过HAProxy进行Marathon服务发现。本文记录HAProxy服务热加载后某微服务50%概率失效的问题。设计3组对比实验,验证了陈旧配置的HAProxy在Reload时没有退出进而导致微服务丢失,并给出了解决方案. Keywords:HAProxy热加

    寻找丢失的微服务-HAProxy热加载问题的发现与分析 原创: 单既喜 一点大数据技术团队 4月8日 在一点资讯的容器计算平台中,我们通过HAProxy进行Marathon服务发现.本文记录HAPro ...

随机推荐

  1. Confluence 6 CSS 指南:修改顶部背景

    Confluence 默认页面的顶部是有关站点的菜单连接,在这里定义了 快速连接, 浏览菜单,用户菜单和快速查找输入框.在这个示例中,我们将会尝试修改顶部的菜单部分的背景和一些自定义的图片. 创建一个 ...

  2. Selenium WebDriver中鼠标事件

    鼠标点击操作  鼠标点击事件有以下几种类型:  清单 1. 鼠标左键点击   Actions action = new Actions(driver);action.click();// 鼠标左键在当 ...

  3. SpringMVC国际化与文件上传

    点击阅读上一章 其实SpringMVC中的页面国际化与上一章的验证国际化基本一致. 1.对页面进行国际化 1)首先我们对Spring配置文件中添加国际化bean配置 <!-- 注册国际化信息,必 ...

  4. Es6对象的扩展和Class类的基础知识笔记

    /*---------------------对象的扩展---------------------*/ //属性简写 ,属性名为变量名, 属性值为变量的值 export default functio ...

  5. popup的简单应用举例(具体在增删改查组件中用到)以及补充的知识点

    一.首先说一下自执行函数 1. 立即执行函数是什么?也就是匿名函数 立即执行函数就是 声明一个匿名函数 马上调用这个匿名函数 2.popup的举例 点击,弹出一个新的窗口.保存完事,页面不刷新数据就返 ...

  6. Java 获取当前系统的时间

    获取当前系统的时间,每隔一秒,打印一次. import java.util.Date; public class TestDate { public static void main(String[] ...

  7. C++ Primer 笔记——函数

    1.函数内的局部静态对象在程序的执行路径第一次经过对象定义语句的时候初始化,并且直到程序终止才被销毁,在此期间即使对象所在的函数结束执行也不会对它有影响. size_t get_count() { ; ...

  8. 论文阅读笔记二十三:Learning to Segment Instances in Videos with Spatial Propagation Network(CVPR2017)

    论文源址:https://arxiv.org/abs/1709.04609 摘要 该文提出了基于深度学习的实例分割框架,主要分为三步,(1)训练一个基于ResNet-101的通用模型,用于分割图像中的 ...

  9. 20165206 2017-2018-2《Java程序设计》课程总结

    20165206 2017-2018-2<Java程序设计>课程总结 一.每周作业链接汇总 预备作业1:对师生关系的看法和期望 预备作业2:c语言基础和学习技能的理解 预备作业3:Linu ...

  10. 发布WebApi项目时,提示未包含bin\yourDocumentationFile.xml文档文件

    Open your publishprofile (*.pubxml) and include this code into "Project" element: <Item ...