zengbin93 / blog

17 stars 10 forks source link

笔记 - Hadoop基础 #41

Open zengbin93 opened 6 years ago

zengbin93 commented 6 years ago

Hadoop是一个用于存储和处理大型数据的分布式框架,主要包含两个模块:1)MapReduce,数据处理框架,能够在集群中使用;2)Hadoop Distributed File System(HDFS),分布式文件系统,容错性能强。

参考资料

zengbin93 commented 6 years ago

基本概念

zengbin93 commented 6 years ago

使用Docker在单个机器上搭建Hadoop集群

Hadoop的master和slave分别运行在不同的Docker容器中,其中hadoop-master容器中运行NameNode和ResourceManager,hadoop-slave容器中运行DataNode和NodeManager。

https://github.com/kiwenlau/hadoop-cluster-docker https://github.com/sequenceiq/hadoop-docker

https://blog.csdn.net/ghostcloud2016/article/details/80129757

zengbin93 commented 6 years ago

HDFS - 基本原理

特点

1、数据保存多个副本,存储在不同的机器上,容错性能高; 2、适合大文件、批量数据处理; 3、高度可配置,具有非常适合于许多安装的默认配置,大多数时候,只需要为非常大的集群调整配置; 4、不适合实时数据计算; 5、跨异构硬件和软件平台的可移植性强; 6、支持传统的分层文件组织形式,可以在目录中创建目录或存储文件; 7、支持用户配额和访问权限配置; 8、适用于“一次写入,多次读取”的场景。

基本组成

Namenode

NameNode维护文件系统命名空间。对文件系统命名空间或其属性的任何更改由NameNode记录。应用程序可以指定应由HDFS维护的文件的副本数。

Metadata是存储在Namenode上的元数据信息,它存储到磁盘的文件名为:fsimage。并且有个叫edits的文件记录对metadata的操作日志。总体来说,fsimage与edits文件记录了Metadata中的权限信息和文件系统目录树、文件包含哪些块、确定块到DataNode的映射、Block存放在哪些DataNode上(由DataNode启动时上报)。

NameNode的metadata信息在启动后会加载到内存。

Datanode

Datanode将HDFS数据以文件的形式存储在本地的文件系统中,它并不知道有关HDFS文件的信息。它把每个HDFS数据块存储在本地文件系统的一个单独的文件中。

Datanode并不在同一个目录创建所有的文件,实际上,它用试探的方法来确定每个目录的最佳文件数目,并且在适当的时候创建子目录。在同一个目录中创建所有的本地文件并不是最优的选择,这是因为本地文件系统可能无法高效地在单个目录中支持大量的文件。

当一个Datanode启动时,它会扫描本地文件系统,产生一个这些本地文件对应的所有HDFS数据块的列表,然后作为报告发送到Namenode,这个报告就是块状态报告。

DataNode的主要功能是存储Block数据,每次启动时,向NameNode汇报Block信息;此外,每3秒向NameNode发送一次心跳,如果连续10分钟没有发送,NameNode会认为这个DataNode已经丢失,并将存储在该DataNode上的数据从其他DataNode重新复制一份。

SecondaryNameNode

SecondaryNameNode不是NameNode的备份,但可以作为NameNode的备份,当因为断电或服务器损坏的情况,可以用SecondNameNode中已合并的fsimage文件作为备份文件恢复到NameNode上,但是很有可能丢失掉在合并过程中新生成的edits信息。因此不是完全的备份。

由于NameNode仅在启动期间合并fsimage和edits文件,因此在繁忙的群集上,edits日志文件可能会随时间变得非常大。较大编辑文件的另一个副作用是下一次重新启动NameNode需要更长时间。SecondNameNode的主要功能是帮助NameNode合并edits和fsimage文件,从而减少NameNode启动时间。

SecondNameNode执行edits和fsimage文件合并受配置文件中fs.checkpoint.period参数控制,默认是一小时;此外dfs.namenode.checkpoint.txns参数也能够影响合并,它的默认设置为1百万,也就是Edits中的事务条数达到1百万就会触发一次合并,即使未达到检查点时间间隔。

假设上一次执行edits与fsimage文件合并的时间是T;则fsimage文件记录了系统所有T时间之前的文件操作记录;edits文件记录了T时间之后的文件操作记录;直到下一次合并。

fsimage与edits文件合并 - 执行流程 image

Hadoop2.x之后的版本,在高可用状态下,处于standby状态的NameNode会自己做fsimage与edits文件合并操作。

Block - 基本存储单元

Block称为数据块,是HDFS系统的基本存储单元,大小可以配置;默认大小为64MB(hadoop1.x)、128MB(hadoop2.x)、256MB(hadoop3.x)。

单个文件按大小被切分成不同的block,存储到不同的节点上;默认情况下,每个block都有3个副本。

Block大小与副本数通过client端上传文件时可以设置,文件上传成功后副本数可以变更,block size不可变更。

若文件大小不到一个块大小,则单独存成一个block,block块是一个逻辑意义上的概念,文件大小是多少,就占多少空间。

HDFS中的文件都是一次性写入的,并且严格要求在任何时候只能有一个写入者。

image

副本的存放是HDFS可靠性和性能的关键。 HDFS采用一种称为机架感知(rack-aware)的策略来改进数据的可靠性、可用性和网络带宽的利用率。

大型HDFS实例一般运行在跨越多个机架的计算机组成的集群上,不同机架上的两台机器之间的通讯需要经过交换机。在大多数情况下,同一个机架内的两台机器间的带宽会比不同机架的两台机器间的带宽大。

一个简单但没有优化的策略就是将副本存放在不同的机架上。这样可以有效防止当整个机架失效时数据的丢失,并且允许读数据的时候充分利用多个机架的带宽。这种策略设置可以将副本均匀分布在集群中,有利于当组件失效情况下的负载均衡。但是,因为这种策略的一个写操作需要传输数据块到多个机架,这增加了写的代价。

为了降低整体的带宽消耗和读取延时,HDFS会尽量让读取程序读取离它最近的副本。

安全模式

• NameNode在启动的时候会进入一个称为安全模式的特殊状态,它首先将映像文件(fsimage)载入内存,并执行编辑日志(edits)中的各项操作; • 一旦在内存中成功建立文件系统元数据映射,则创建一个新的fsimage文件(这个操作不需要SecondNameNode来做)与一个空的编辑日志; • 此刻namenode运行在安全模式,即namenode的文件系统对于客户端来说是只读的,显示目录、显示文件内容等,写、删除、重命名都会失败; • 在此阶段namenode搜集各个datanode的报告,当数据块达到最小副本数以上时,会被认为是“安全”的,在一定比例的数据块被认为是安全的以后(可设置),再过若干时间,安全模式结束; • 当检测到副本数不足数据块时,该块会被复制,直到达到最小副本数,系统中数据块的位置并不是由namenode维护的,而是以块列表形式存储在datanode中。