1、NoSQL数据库原理第3章 HDFS的基本原理 2 3.1.1 Hadoop的由来 2013年-2016年,谷歌公司发表三篇论文,被称为谷歌(大数据)的“三驾马车”l The Google File Systeml MapReduce:Simplified Data Processing on Large Clustersl Bigtable:A Distributed Storage System for Structured Data Apache软件基金会根据上述论文,发起一个开源软件项目:Hadoopl 当时实力雄厚的Yahoo公司给予大力支持 主要优势l 可利用普通、廉价的x86设备
2、实现分布式数据管理和数据批处理。l 提供了非常好的容错性和可扩展性l 屏蔽了底层原理复杂性,用户只需要调用接口即可第3章 HDFS的基本原理3.1 Hadoop概述Apache软件基金会标志Apache Hadoop的官方标志 3 3.1.2 Hadoop的架构与扩展l Hadoop1.x和2.x:主要差别是引入了Yarn模块,将资源管理和任务监控等功能从原来的MapReduce模块中独立出来。Yarn可以对MapReduce和Spark等多种分布式处理框架提供服务。l Hadoop3.x和2.x体系架构基本相同,但提供了一些新特性,进行了多项性能优化。l 目前主流使用的为2.7x(以上),以
3、及3.x版本。Hadoop可以和多种组件配合使用,构建复杂的大数据解决方案l Hadoop自身(核心组件)擅长对大数据进行分布式存储和批处理l 对于数据采集、实时数据处理、数据挖掘等军不太擅长l 只依靠自身也无法实现对数据进行表格话管理和实时查询l Hadoop是分布式批处理工具,不是NoSQL!第3章 HDFS的基本原理3.1 Hadoop概述 4 3.1.2 Hadoop的架构与扩展 Hadoop核心组件包括l HDFS:分布式文件系统(原型为谷歌的GFS)l YARN:分布式资源管理l MapReduce:分布式计算框架(原型为谷歌的MapReduce)HBase(原型为谷歌的Bigta
4、ble)、Hive等曾经属于Hadoop的核心组件之列,但之后独立成为开源软件项目第3章 HDFS的基本原理3.1 Hadoop概述Hadoop的核心架构及与重要扩展项目 5 3.1.2 Hadoop的架构与扩展 主要扩展组件l Hive:分布式数据仓库l HBase:分布式NoSQL数据库l Spark、Tez:分布式计算引擎l Flume:数据采集l Sqoop:和关系型数据库进行数据互转l Oozie/hue:工作流、可视化操作l Ambari/Cloudera Manager/Fusion Insight:集成化解决方案l Mahout:分布式数据挖掘l Pig:通过简化的数据操作语言
5、执行MapReduce操作l Zookeeper:分布式协调服务l 第3章 HDFS的基本原理3.1 Hadoop概述 6 3.1.3 Hadoop的部署需求l 一台以上(一般三台以上)X86服务器,节点需要具备足够的存储空间和内存容量 硬盘是否越大越好?l 运行Linux操作系统,例如:Centos、Ubuntu、Red Hat Enterprise Linux Server等。l 部署JVM或JDK环境 Hadoop是基于Java语言开发的l 网络环境:多个节点如何找到对方?节点之前还需要通过网络进行监控和数据传输等。一般将所有节点部署在同一个子网内,但可能分属不同的机架(连接到不同的交换
6、机)合理进行物理网络的链接,合理配置实体防火墙,以及各个节点上的软件防火墙 通过使用Host文件或DNS方法,将各个主机名和IP地址绑定 建议在各个节点上部署NTP客户端,实现时间同步l 网络控制:可以通过在各个节点上部署SSH协议(服务端和客户端)实现“一键启动”(即执行一条指令启动所有节点上的角色进程)第3章 HDFS的基本原理3.1 Hadoop概述 7 3.1.3 Hadoop的部署需求l 一台以上(一般三台以上)X86服务器,节点需要具备足够的存储空间和内存容量 硬盘是否越大越好?l 运行Linux操作系统,例如:Centos、Ubuntu、Red Hat Enterprise Li
7、nux Server等。l 部署JVM或JDK环境 Hadoop是基于Java语言开发的l 网络环境:多个节点如何找到对方?节点之前还需要通过网络进行监控和数据传输等。一般将所有节点部署在同一个子网内,但可能分属不同的机架(连接到不同的交换机)合理进行物理网络的链接,合理配置实体防火墙,以及各个节点上的软件防火墙 通过使用Host文件或DNS方法,将各个主机名和IP地址绑定 建议在各个节点上部署NTP客户端,实现时间同步l 网络控制:可以通过在各个节点上部署SSH协议(服务端和客户端)实现“一键启动”(即执行一条指令启动所有节点上的角色进程)第3章 HDFS的基本原理3.1 Hadoop概述
8、8 Hadoop与HBase NoSQL数据库的关系l Hadoop不能提供对数据的表格化存储,无法实现数据条目的自由增删改,以及便捷的实时查询功能l Hadoop中的HDFS文件系统为HBase提供了底层存储支持 数据分布式、分块存储和多副本管理、数据文件的统一访问 数据与节点的监控与容错保障l MapReduce、Hive和Spark等分布式处理框架可以从HBase(或HDFS)中读取数据,或者将处理结果写入HBase第3章 HDFS的基本原理3.1 Hadoop概述 9 3.2.1 HDFS架构 主从式架构l Namenode(NN)负责存储文件和分块信息 集群中一般只有一个运行(act
9、ive)状态的的NN 集群中可能还有其他备用(standby)状态的NN NN掌握着集群整体情况l Seondary Namenode(SNN)只负责帮助NN压缩元数据l Datanote(DN)负责存储具体分块 集群中一般有多个DN第3章 HDFS的基本原理3.2 HDFS原理 10 3.2.1 HDFS架构 主从式架构l 集群中有多个DN,结合数据多副本机制可以实现比较强的容错性l DN对全局情况并不了解,只负责向NN上报自身存储情况,并根据NN的指令进行数据传输l NN根据DN的上报情况,判断数据分块状态是否监控,以及各个DN是否正常工作l 一台物理节点可能同时部署为NN、SNN和DN
10、每个角色实际以Java进程的方式启动第3章 HDFS的基本原理3.2 HDFS原理 11 3.2.2 Namenode的数据结构 以文件方式存储元数据l Fsimage:只读状态,在NN启动时整体读入内存l Editlog:以日志方式存储文件信息的变动情况 NN启动时l 构造新的Fsimage,并将其读入内存,在该过程中,HDFS接受读请求,不接受写请求,该过程称为“安全模式”(safe mode)第3章 HDFS的基本原理3.2 HDFS原理 12 3.2.2 Namenode的数据结构 Editlog 需要定期合并,形成新的Fsimagel NN在每次启动之前进行Fsimage 的更新工作
11、l SNN可以代替NN完成该工作 Fsimage文件过大,可能造成启动缓慢l 因此HDFS不适合存储小文件l HDFS会将大文件分块存储第3章 HDFS的基本原理3.2 HDFS原理 13 3.2.3 数据分块和多副本机制 HDFS的分布式存储策略l 大文件分块存储,默认分块为64MB-256MB,可以通过配置文件设置大小l 每个分块具有多个副本,副本数量最小为1,默认为3,可以通过配置文件设置数量l 数据块以Linux文件形式均匀分布在DN上(blk_ xxxxxxxxxx),DN并不清楚自身存储的数据块的副本情况,以及数据块和哪个文件信息对应(由NN进行管理)第3章 HDFS的基本原理3.
12、2 HDFS原理 14 3.2.3 数据分块和多副本机制 分块大小的影响l 分块的目的是使数据均匀分布在不同节点上,便于进行并行处理即每个节点优先处理本地数据(分块),从而减少网络传输开销。l 并行处理时,一般每个任务(例如每个Mapreduce任务进程)会读取一个分块。如果分块太大,可能导致分块数量减少,不利于并行处理。此外,当出现某个并行处理的子任务故障时,恢复该子任务,可能需要重新读入改分块数据,或者将数据读取到其他空闲节点上重做,此时过大的分块会导致性能低下、等待时间过长等问题。如果分块太小,则可能造成元数据存储开销太大(fsimage太大)第3章 HDFS的基本原理3.2 HDFS原
13、理 15 3.2.3 数据分块和多副本机制 数据多副本机制l 实际以分块为单位实现多副本l 默认为3副本机制,结合机架感知(rack aware)机制,可以实现良好的容错性 数据存储在本节点、当前机架上的另一个节点,以及不同机架的某个节点上l 用户设置的副本数量不能小于节点数量l 副本数量由NN进行监控和维护,构造数据副本时,NN指示相关DN进行数据拷贝第3章 HDFS的基本原理3.2 HDFS原理 16 3.2.3 数据分块和多副本机制 机架感知l 不同机架,可能意味者节点接入不同的供电线路和交换机设备l 数据分布在不同机架上,可以防止电源或交换机故障造成的分区不可用l 配置文件中机架是一个
14、逻辑概念,理论上不需要和实际的机架结构设置成相同的l 机架可以是多层的(可以理解为将机架分组)第3章 HDFS的基本原理3.2 HDFS原理 17 3.2.4 数据读写原理 写入时l NN分配一个合适的写入位置(DN)l 用户成功写入一个数据块则视为成功,不会再关心其副本数量l NN会(定期)检查到该数据块副本数量不够,并分配合适的DN创建新副本l 每次创建副本时,当前DN只对下一个DN负责,不会继续对后面的DN负责l 数据副本数量不足时,无法对其进行Append等进一步的写操作第3章 HDFS的基本原理3.2 HDFS原理 18 3.2.4 数据读写原理 写入时l 数据一旦写入,则无法被随意
15、修改,否则会提高多副本一致性上的复杂度,以及提高元数据维护上的复杂度l 早期的Hadoop不支持在文件末尾追加数据(append),最近的版本可以支持该操作(一般是追加新block)第3章 HDFS的基本原理3.2 HDFS原理 19 3.2.4 数据读写原理 读取时l NN将当前数据副本的所在节点列表发给客户端,客户端可以找到一个可用的节点进行读取l 客户端可以从NN持续获得所有数据块的存储位置,并直接向合适的DN读取数据第3章 HDFS的基本原理3.2 HDFS原理 20 3.2.5 HDFS支持的序列化文件 一般情况下,HDFS上存储文本文件(txt)l 访问日志等大数据内容可能是文本文
16、件:以天然的方式分行,以tab键或逗号分割等字符分列的文件(例如:tsv、csv)l 文本比较易于理解,但存储效率低,无法实现快速检索 HDFS支持序列化文件(sequence file)l 序列化文件支持按行、块等方式进行压缩 HBase中存储的文件,实际就是一种序列化文件l HBase中的文件无法被直接理解,但存储和查询效率更高l 序列化文件仍然不支持数据随机改写,早期甚至不支持数据追加第3章 HDFS的基本原理3.2 HDFS原理 21 3.3.1 部署HDFS 可以整体部署Hadoop,也可以单独部署HDFS,不部署Yarn和MapReducel 通过原生软件包进行部署 版本原则、参数
17、配置和后期管理上的自由度更高,占用存储和处理资源比较小 部署难度较大,学习成本较高特别是一些高级特性 当部署多个软件包时,可能遇到兼容性等问题l 通过集成化工具进行部署 组件的选择、管理上的自由度和扩展性受限,集成化工具可能占用额外的存储和处理资源 部署和管理难度降低,通常可以实现基于WEB界面的部署、维护和管理 一般能够提供多个组件之间的兼容性保证,以及提供一些优化的特性和功能 工具本身或某些高阶功能可能是不开源、收费的 常见工具:Apache Ambari(Hortonworks)、Cloudera Manager或华为 FusionInsight等第3章 HDFS的基本原理3.3 部署和
18、配置HDFS 22 3.3.1 部署HDFS 集群规划l HDFS的优势是(DN的)横向扩展性,因此在初始规划时,可以构建一个小规模集群,随着数据量的提升,再逐步增加DN的数量l 确定节点的软硬件环境和网络环境,以此为依据,确定哪些节点为NN、DN或SNN等角色l 是否安装其他协同组件,是否对系统进行某些定制化的配置(例如本地存储路径)等 硬件环境、网络环境的准备l 参见3.1.3节 Hadoop的部署需求l 确保各个节点具有合适的存储能力、处理能力和网络互访能力(以及足够的网络带宽)第3章 HDFS的基本原理3.3 部署和配置HDFS 23 3.3.1 部署HDFS 软件环境准备:Linux
19、操作系统、JVM或JDK环境、网络地址、主机名和防火墙等网络环境、NTP时间同步、SSH无密码访问(原生方式)Hadoop软件包l 在官方网站下载软件包,在合适的路径(确认当前用户有足够的读写权限)进行解压即可l 一般在每个节点的解压位置相同,以便于管理l 进而对各个节点上的Hadoop软件进行配置(修改配置文件)第3章 HDFS的基本原理3.3 部署和配置HDFS 24 3.3.2 HDFS的基本配置 Hadoop软件包下有以下重要的子目录l(1)sbin目录主要存放HDFS和Yarn组件的集群控制命令。l(2)bin目录存放HDFS的文件系统命令行工具以及Yarn等组件的命令行工具。l(3
20、)etc/hadoop目录存放Hadoop的配置文件。l(4)share目录存放hadoop的各类库包(Jar),可以说是整个软件的核心部分。大部分版本会将HTML格式的官方文档存放在软件包的share/doc目录下。第3章 HDFS的基本原理3.3 部署和配置HDFS 25 3.3.2 HDFS的基本配置 Hadoop的配置文件大多以XML和TXT格式存在。默认存在于hadoop安装目录的etc/hadoop目录下,重要的配置文件有以下6个:l(1)core-site.xml:Hadoop全局的配置文件,也包含一些HDFS的宏观配置l(2)dfs-site.xml:HDFS配置文件l(3)y
21、arn-site.xml:YARN配置文件。l(4)mapred-site.xml:MapReduce配置文件l(5)slaves:从节点(子节点)列表l(6)hadoop-env.sh:与运行脚本的环境变量相关的配置文件第3章 HDFS的基本原理3.3 部署和配置HDFS 26 3.3.2 HDFS的基本配置 Hadoop的配置文件大多以XML和TXT格式存在(以及sh脚本方式)。默认存在于hadoop安装目录的etc/hadoop目录下,重要的配置文件有以下6个:l(1)core-site.xml:Hadoop全局的配置文件,也包含一些HDFS的宏观配置l(2)dfs-site.xml:H
22、DFS配置文件l(3)yarn-site.xml:YARN配置文件。l(4)mapred-site.xml:MapReduce配置文件l(5)slaves:从节点(子节点)列表l(6)hadoop-env.sh:与运行脚本的环境变量相关的配置文件第3章 HDFS的基本原理3.3 部署和配置HDFS 27 3.3.2 HDFS的基本配置 core-site.xml示例l l l fs.defaultFSl hdfs:/node1:8020 l l l l l l 第3章 HDFS的基本原理3.3 部署和配置HDFS 28 3.3.2 HDFS的基本配置 dfs-site.xml 基本配置选项 N
23、amenode相关l dfs.namenode.name.dir:元数据在NN本地(Linux系统中的)存储路径l dfs.blocksize:分块大小(单位是字节)l dfs.replication:分块大小 Datanode相关l dfs.datanode.data.dir Secondary Namenode相关l dfs.namenode.checkpoint.dir第3章 HDFS的基本原理3.3 部署和配置HDFS 29 3.3.2 HDFS的基本配置 Slaves文件:当前集群下的从节点(DN)列表,该文件只对NN有用,NN会根据该文件获取可管理的DN。hadoop-env.sh
24、文件l 可以进一步配置JAVA_HOME环境变量、日志位置等内容 机架感知策略l core-site中配置:l net.topology.node.switch.mapping.imp,内容为.TableMappingl net.topology.table.file.name,内容为映射文件的路径和名称l 映射文件示例第3章 HDFS的基本原理3.3 部署和配置HDFS 30 3.3.3 集群的启动和停止 sbin目录下的start-dfs.sh和stop-dfs.sh为HDFS的集群启动和停止命令。l 一般在HDFS的Namenode执行,负责启动/停止所有节点上的Hadoop角色。l 使
25、用该命令的前提是,集群中的各个节点配置了可无密码访问的ssh服务。指令执行后,HDFS服务会根据配置文件信息,通过SSH方式调用其他节点上的命令启动或停止相应的角色。单独启动或停止一个HDFS进程,或者对单独的角色进行控制l hadoop-daemon.sh start|stop namenode|datanode|secondarynamenode 第3章 HDFS的基本原理3.3 部署和配置HDFS 31 3.3.3 集群的启动和停止 HDFS集群启动后,可以在各个节点命令行执行jps命令,查看启动是否成功 还可以通过http:/namnode:50070/查看系统的状态第3章 HDFS的
26、基本原理3.3 部署和配置HDFS 32 3.4.1 管理和操作命令 基本命令:hdfs,可以附带多个指令,例如:l dfs:文件系统操作 例如查看根目录文件列表:hdfs dfs-ls/l dfsadmin:文件系统感知 例如查看机架感知信息:hdfs dfsadmin-printTopologyl fsck:HDFS的集群检查工具l namenode-format:主节点格式化指令l balaner:数据平衡指令第3章 HDFS的基本原理3.4 使用和管理HDFS 33 3.4.2 格式化Namenode 在HDFS安装好初次启动之前,需要对Namenode进行格式化,可以利用如下命令进行
27、:l hdfs namenode-format第3章 HDFS的基本原理3.4 使用和管理HDFS 34 3.4.3 Namenode的安全模式 当Namenode启动时,需要将fsimage等信息读入内存,并且等待各个Datanode上报存储状态,在这个过程完成之前,Namenode处在“安全模式”(safemode)中,此时Namenode为只读状态,即只能读取不能写入,当足够数量的节点以及数据块处在健康状态时,系统会自动退出安全模式。在一些特殊情况下,可以通过如下指令手动对安全模式进行管理:l hdfs dfsadmin-safemode enter|leave|get|waitl 其中
28、,leave选项可以退出安全模式,enter选项可以进入安全模式,get选项可以获取是否处在安全模式中的信息,wait选项则会一直等待到安全模式结束。第3章 HDFS的基本原理3.4 使用和管理HDFS 35 3.4.4 元数据恢复 由于Secondary Namenode在进行元数据合并时,保存了元数据的副本信息,因此当Namenode数据发生损坏时,可以利用Secondary Namenode中的数据进行恢复,具体流程如下l(1)利用stop-dfs.sh命令停止整个集群。l(2)清空Namenode原有的元数据信息,路径可以从配置项dfs.namenode.name.dir中获得。l(3
29、)如果Secondary Namenode和Namenode没有部署在同一节点上,需要将Secondary Namenode存储的副本信息复制到Namenode,其路径和Secondary Namenode中的元数据副本的路径一致,可以从配置项dfs.namenode.checkpoint.dir中获得。l(4)执行hadoop namenode-importCheckpoint,系统将检查副本数据,并将其复制到dfs.namenode.name.dir所指示的路径当中。第3章 HDFS的基本原理3.4 使用和管理HDFS 36 3.4.5 子结点的添加与删除(1)静态添加/删除Datanod
30、e的方法。l 利用stop-dfs.sh命令停止整个集群。l 在Namenode节点上的slaves配置文件中添加新的节点,或删掉旧的节点。添加新节点时,要确保新节点和其他节点之间主机名和IP地址可以相互访问,可以实现ssh无密码访问等,参见Hadoop集群的部署和配置过程。l 利用start-dfs.sh重新启动整个集群,在新节点配置正确的情况下,会随命令启动Datanode角色,并和Namenode连接。l 可以执行hdfs balancer命令。在节点之间进行手动的数据平衡。删除节点之后,Namenode会自动检查副本数量,并选择新的节点存储不足的副本。第3章 HDFS的基本原理3.4
31、使用和管理HDFS 37 3.4.5 子结点的添加与删除(2)动态添加Datanode的方法。l HDFS集群保持运行状态。l 在Namenode节点上的slaves配置文件中添加新的节点。确保新节点和其他节点之间主机名和IP地址可以相互访问,可以实现ssh无密码访问等,参见Hadoop集群的部署和配置过程。l 在新节点执行hadoop-daemon.sh start datanode,启动Datanode角色。l 在主节点执行hdfs dfsadmin refreshNodes,刷新节点列表,Namenode会根据新列表和子节点建立联系。第3章 HDFS的基本原理3.4 使用和管理HDFS
32、38 3.4.5 子结点的添加与删除(3)动态删除Datanode的方法。l HDFS集群保持运行状态。l 提前在hdfs-site.xml中配置dfs.hosts.exclude属性,内容为一个本地文本文件的路径,该文件可以称为exclude文件,其结构和slave文件的相同,即为每行一个节点主机名的列表。记录在exclude文件中的主机,会在刷新之后记当作禁用状态(Decommissioning),并可以在Web界面中看到该状态。l 在主节点执行hdfs dfsadmin refreshNodes,刷新节点列表。l 将节点写入exclude文件,并执行hadoop dfsadmin ref
33、reshNodes刷新节点列表。第3章 HDFS的基本原理3.4 使用和管理HDFS 39 3.4.5 子结点的添加与删除 添加/删除Datanode完成之后,可以通过以下两种手段查看结果。l(1)在命令行执行hdfs dfsadmin-report查看节点列表信息。l(2)通过Web界面,切换到Datanodes标签,可以查看子节点的列表,“In Operation”表示正在使用的节点,“Decommissioning”表示目前禁用的节点。第3章 HDFS的基本原理3.4 使用和管理HDFS 40 3.4.6 HDFS文件系统操作 hdfs dfs指令,主要参数l-ls/-mkdirl-pu
34、t/-get和-mv/-cpl-appendToFilel-chown/-chmodl-tail/textl HDFS中没有当前目录的概念,因此不存在“cd xxx目录”等指令第3章 HDFS的基本原理3.4 使用和管理HDFS 41 3.4.7 以WEB方式查看文件系统 http:/namnode:50070/explorer.html第3章 HDFS的基本原理3.4 使用和管理HDFS 42 典型情况下,每个子节点可能既执行map任务,也在下一个阶段执行reduce任务,同时也是DN存储节点 Map阶段优先处理本节点数据,但Shuffle阶段需要将每个map阶段的处理结果传输到Reduce
35、任务所在的各个节点,可能产生大量的网络开销 Reduce结果一定要写入HDFS(并存储为多副本),如果一个任务需要多轮MapReduce才能完成,则中间会写入多次HDFS,因此效率较低,但可靠性很高l Hadoop3.0、以及Tez组件针对这一点进行了大量优化,Apache Spark也回避了这种模式第3章 HDFS的基本原理3.5 MapReduce原理简介 43 Hive是基于Hadoop实现的分布式数据仓库系统,可以用来实现大数据场景下的分布式数据统计和预处理(ETL)等功能。Hive可以将HDFS文件映射为二维数据表,并且支持将SQL语句(实际是Hive QL语言,简称HQL)转化为M
36、apReduce或Tez过程,其目的是将复杂的MapReduce编程转换为简单的SQL语句编写。Hive的实时检索能力很弱。因此,Hive一般不会被当作NoSQL数据库使用,而是作为数据仓库工具或MapReduce的替代性工具使用。第3章 HDFS的基本原理3.6 Hive分布式数据仓库 44 本章介绍了Hadoop的概况,以及HDFS的基本原理与基本使用方法,目的是为后续学习Apache HBase做必要的准备。Hadoop不是一个单纯的开源软件,而是一个“家族”,且处在不断改进和扩展的过程中;Hadoop是大数据工具的事实标准即便其中的某些组件可能收到挑战 Hadoop中的HDFS提供了分布式文件系统,但不能提供数据的表格化管理和实时检索能力,因此通常不被看作NoSQL Apache HBase一般会基于HDFS部署,以解决底层文件存储问题l HBase在HDFS基础上提供了数据条目的增删改能力(逻辑上的),这也是HDFS不具备的功能 Hadoop的部署和管理难度较大,可以通过专门的书籍或课程进行深入学习。第3章 HDFS的基本原理小结