HDFSのアーキテクチャと設計上の

著者|敬意

HDFSは、Hadoopのファイルシステムを分散Hadoopの分散ファイルシステムです。読者は、すべてのHDFS短い記事が少し理解しているHDFSに適しているが、HDFSと混乱初心者のためにそれを見つけることができるように、以下では、主にHDFSの設計の下でより多くの重要なポイントについてです。この記事の主な参照は、Hadoopの公式文書3.0です。

リンク:http://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html

データセットのサイズを一度に保存することができる単一の物理マシンの容量を超える場合、複数のコンピュータ間でのストレージ管理は、分散項は、ファイルシステムがファイルと呼ばれる、異なる独立したコンピュータの数に分割して格納する必要がありますシステム。

ディレクトリ

  • HDFSシーンの使用

  • HDFSの動作モード

  • ファイルシステムの名前空間(名前空間)

  • データレプリケーション

  • 永続的なファイルシステムのメタデータ

  • 通信プロトコル

  • 丈夫

  • データ編成

  • アクセシビリティ

  • 記憶空間回復

1、HDFSシーンの使用

HDFSは、大きなファイルを格納するためのデータストリーミングモードにアクセスするようになって。これは、ライトワンス、何回も読んで、データセット上の様々な分析で長い時間は、それぞれの分析は、大容量のファイル、Hadoopの現在サポートされているストレージPBレベルのデータのためのデータのデータセットのほとんどまたはすべてを含んでいます。

HDFSが大幅に時間コストを遅らせる可能性がある、最適化された高データスループットアプリケーション用に設計されているため、HDFSは、低遅延のデータアクセス時間を必要とするアプリケーションには適していません。

ファイルシステムに格納されたファイルの合計数は、メモリ容量を名前ノードに限定することができるHDFSは、経験、ファイルの100百万人、およびデータのブロックを表す各ファイルに基づいて、メモリの少なくとも300メガバイトを必要とします。

現在、Hadoopのファイルには、作家であってもよく、常にファイル内の任意の変更をサポートしていません、ファイルデータの末尾に追加される書き込み。

データブロック通常のファイルシステムに対して、HDFSはまた、概念ブロックは、デフォルトでは128メガバイト、また、別の記憶装置として、ブロックサイズに分割し、複数のブロックに分割HDFS上のファイルですが、ファイルのブロックサイズよりも小さいHDFSこれは、ブロックの全体のスペースを占有しません。特に明記しない限り、それは、具体的には、テキストブロックHDFSブロックで言及指します。

HDFSは非常に大きいブロックなぜ、その目的は、アドレス指定のオーバーヘッドを最小限に抑えることです。この数は、タスクの数はそうあまりにも、仕事が遅く動作速度になる場合、通常、データの一ブロックのみを処理するMapReduceマップタスクでは、大きすぎて設定することはできません。

2、HDFSの動作モード

マスタ/スレーブ・アーキテクチャ、すなわちA名前ノード(マネージャ)複数のデータノード(作業者)を使用してHDFS。

ファイルシステムの管理を担当する名前空間名前ノード。ファイルシステムツリーとツリー全体内のすべてのファイルとディレクトリを維持し、この情報は、次の2つのファイル、画像ファイル、編集、名前空間に格納されたファイルをログに記録します。名前ノードはまた、それぞれに配置された各ファイルのデータブロックのノード情報を記録します。データノードのノード・ファイル・システムが動作し、それらはデータブロック(または名前ノードスケジュールを受信するクライアント)を格納および取得する必要があり、定期的にその名前ノードするブロックの格納されたリストを送信します。

あなたが名前ノードしていない場合は、ファイルシステムが動作しません、我々はブロックは、ファイルデータノードを再構築する方法を知らないので、その名前ノードフォールトトレランスは非常に重要です。この目的を達成するために、2つの機構のHadoopを提供します。

最初のメカニズムは、永続的な状態にあるファイルシステムのメタデータを構成するこれらのファイルをバックアップすることです。一般的に、ローカルディスクに書き込まれた永続ファイルながら、リモートでNFSをマウント書き込みます。

第二の方法は、ログ統合名前空間のミラーを編集することにより、定期的に補助名前ノード、補助名前ノードを実行することで、ローカル保存スペースのマージは、コピーをミラーリングするとき名前ノードの障害を有効にちなんで名付けられました。プライマリノードに障害が発生した場合でも、それは必然的に、あなたは新しい名前ノードの実行などの補助名前ノードに名前ノードNFSに格納されているメタデータをコピーすることができ、いくつかのデータが失われます。どの機構のフェールオーバーを必要とします。私たちは、少し後の分析を行います。

3、ファイルシステムの名前空間(名前空間)

HDFSは、従来の階層型ファイル編成構造をサポートしています。ユーザーまたはアプリケーションがディレクトリを作成し、そのディレクトリにファイルを保存することができます。

ファイルシステムの名前空間の階層と、既存のファイルシステムの大部分は似ています。ユーザーがファイルを作成、削除、移動、または名前を変更することができます。HDFSのサポートのユーザーディスククォータとアクセス制御は、現在のハードリンクとソフトリンクをサポートしていません。しかし、HDFSアーキテクチャは、これらの機能を実装妨げるものではありません。

ネーム・スペース・ファイル・システムを維持する責任名前ノード、任意のファイルシステムの名前空間への変更、またはプロパティが名前ノードが記録されます。アプリケーションは、HDFSに保存されたファイルのコピーの数を設定することができます。ファイルのコピーの数は、この情報は、名前ノードによって保存され、ファイルの複製因子と呼ばれています。

4、データ・レプリケーション

HDFSは、クロスマシン確実に大規模なクラスタ内の大きなファイルを格納するように設計されています。各ファイルは、最後を除いて、すべてのデータブロックは、同じサイズである、一連のブロックに格納します。

フォールトトレランスのために、すべてのデータブロックは、ファイルのコピーを持っています。そして、各ファイルの係数データブロックサイズのコピーが設定可能です。アプリケーションは、ファイルのコピーの数を指定することができます。係数のコピーは、ファイルの作成時に指定することができ、それは後から変更することができます。

HDFSのファイルは一つだけ作家随時、追記型、および厳格な要件です。

その各々名前ノード完全なコピー管理データブロックは、定期的にデータノードのハートビート信号とクラスタ(Blockreport)からのブロック・ステータス・レポートを受信します。データノードが起動すると、それは、ローカルのファイルシステムをスキャンし、これらのローカルファイルの1つに対応するすべてのHDFSデータブロックのリストを生成し、名前ノードのレポートに送られ、この報告書は、ブロックステータスレポートです。データノードは、ノードが正常に動作していることを意味し、ハートビート信号を受信します。ブロックステータスレポートは、データノード上のすべてのデータブロックのリストが含まれています。

データ収集ブロックリスト。/ HDFSのfsck / -files - ブロックまたはHDFSのfsckの:ブロックの健康を参照してください。

HDFSのアーキテクチャと設計上の

ファイル名接頭辞_blk、各ブロック・メタデータ・ファイル、及びブロックの直列.METAチェックサムと各セクションの先頭を含むサフィックスに関連付けられたメタデータファイルに格納されたHDFSデータブロックそして、。

一定規模のデータブロックの数は、データノードは、新しいデータブロックとメタデータ情報を格納するためのサブディレクトリを作成するとき。現在のディレクトリがすでにデータ・ブロック(dfs.datanode.numlocksプロパティセットで)64を格納した場合は、サブディレクトリを作成し、究極の目標は、ツリーの高ファンアウトを設計することです。

dfs.datanode.data.dirプロパティは、ディスクの異なる複数のリストを指定した場合、データブロックは、各ディレクトリのように書き込まれる(ラウンドロビン)回転します。

クライアントがタイムリーに検出し、不良ブロックの前に不良ブロックを修復読むことができるように、スキャナは、各ブロックのデータノード、定期的なテストにノード上のすべてのブロックを実行します。、そして、3週間ごとに状態を修復に失敗する可能性はデフォルトでブロックをテストします。

ユーザーは、httpことができます://データノード:検査報告書の50070 / blockScannerReportデータノード取得ブロック。

堆積物のコピー

キーは、HDFSの信頼性とパフォーマンスのコピーを格納することです。最適化されたコピー・ストレージ戦略は、他のほとんどのHDFS分散ファイルシステム、重要な特性とは区別されます。この機能は、チューニングの多くを必要とし、経験を蓄積する必要があります。HDFSを採用した戦略と呼ばれる信頼性は、ネットワーク帯域幅のデータの可用性と利用率を向上させるために意識(ラック意識を)ラック。ポリシーのコピーを保存する現在この方向での最初の一歩を実装しました。

プロセスによって知覚されるラック、名前ノードIDは、データノードが属する各ラックについて決定することができます。シンプルだが無い最適化戦略は、別のラックに格納されたコピーです。データ障害及び許容時間が完全にラックの複数の読み出しデータの帯域幅を利用するとき、これは効果的にラック全体の損失を防止することができます。この戦略は、コンポーネントが故障した場合に負荷分散を助長している場合、クラスタ内のコピーの均一な分布を設定することができます。しかし、この戦略は、書き込みのコストを増加させる複数のラックへのデータ書き込みのブロックを送信する必要があるからです。

ほとんどの場合、複製因子が3である、HDFSストレージ戦略は、異なるラック内のローカルノードラックのコピー、同じラック上の他のノードのコピー、および最後のコピーを格納することですノード。この戦略は、書き込み動作の効率を向上させることができるラックとの間のデータ伝送を、減少させます。

実際には、2つの方法でデータ記憶ディスク選択ポリシーのhadoop2.0、データノードのコピーで:

:最初はhadoop1.0ディスク・ディレクトリのポーリング、実装クラスを追いました

RoundRobinVolumeChoosingPolicy.java

第二は、使用可能なディスク領域を選択することで、実装クラス、保存十分です:AvailableSpaceVolumeChoosingPolicy.java

第二の戦略は、対応する設定項目です。

HDFSのアーキテクチャと設計上の

如果不配置,默认使用第一种方式,既轮询选择磁盘来存储数据副本,但是轮询的方式虽然能够保证所有磁盘都能够被使用,但是经常会出现各个磁盘直接数据存储不均衡问题,有的磁盘存储得很满了,而有的磁盘可能还有很多存储空间没有得到利用,所有在hadoop2.0集群中,最好将磁盘选择策略配置成第二种,根据磁盘空间剩余量来选择磁盘存储数据副本,这样一样能保证所有磁盘都能得到利用,还能保证所有磁盘都被利用均衡。

在采用第二种方式时还有另外两个参数会用到:

HDFSのアーキテクチャと設計上の

默认值是10737418240,既10G,一般使用默认值就行。官方解释为,首先计算出两个值,一个是所有磁盘中最大可用空间,另外一个值是所有磁盘中最小可用空间,如果这两个值相差小于该配置项指定的阀值时,则就用轮询方式的磁盘选择策略选择磁盘存储数据副本。

HDFSのアーキテクチャと設計上の

默认值是0.75f,一般使用默认值就行。官方解释为,有多少比例的数据副本应该存储到剩余空间足够多的磁盘上。该配置项取值范围是0.0-1.0,一般取0.5-1.0,如果配置太小,会导致剩余空间足够的磁盘实际上没分配足够的数据副本,而剩余空间不足的磁盘取需要存储更多的数据副本,导致磁盘数据存储不均衡。

副本选择

为了降低整体的带宽消耗和读取延时,HDFS会尽量让读取程序读取离它最近的副本。如果在读取程序的同一个机架上有一个副本,那么就读取该副本。如果一个HDFS集群跨越多个数据中心,那么客户端也将首先读本地数据中心的副本。

安全模式

Namenode启动后会进入一个称为安全模式的特殊状态。 处于安全模式的Namenode是不会进行数据块的复制的。Namenode从所有的 Datanode接收心跳信号和块状态报告。块状态报告包括了某个Datanode所有的数据块列表。每个数据块都有一个指定的最小副本数。

当Namenode检测确认某个数据块的副本数目达到这个最小值(最小值默认是1,由dfs.namenode.replication.min属性设置),那么该数据块就会被认为是副本安全(safely replicated)的;在一定百分比(这个参数可配置,默认是0.999f,属性值为dfs.safemode.threshold.pct)的数据块被Namenode检测确认是安全之后(加上一个额外的30秒等待时间),Namenode将退出安全模式状态。接下来它会确定还有哪些数据块的副本没有达到指定数目,并将这些数据块复制到其他Datanode上。

如果datanode丢失的block达到一定的比例,namenode就会一直处于安全模式即只读模式。

当namenode处于安全模式时,该怎么处理?

找到问题所在,进行修复(比如修复宕机的datanode)。

或者可以手动强行退出安全模式(没有真正解决问题): hdfs namenode --safemode leave。

在hdfs集群正常冷启动时,namenode也会在safemode状态下维持相当长的一段时间,此时你不需要去理会,等待它自动退出安全模式即可。

用户可以通过dfsadmin -safemode value 来操作安全模式,参数value的说明如下:

enter - 进入安全模式

leave - 强制NameNode离开安全模式

get - 返回安全模式是否开启的信息

wait - 等待,在执行某条命令前先退出安全模式。

5、文件系统元数据的持久化

Namenode上保存着HDFS的名字空间。对于任何对文件系统元数据产生修改的操作,Namenode都会使用一种称为EditLog的事务日志记录下来。例如,在HDFS中创建一个文件,Namenode就会在Editlog中插入一条记录来表示;同样地,修改文件的副本系数也将往Editlog插入一条记录。Namenode在本地操作系统的文件系统中存储这个Editlog。

整个文件系统的名字空间,包括数据块到文件的映射、文件的属性等,都存储在一个称为FsImage的文件中,这个文件也是放在Namenode所在的本地文件系统上。

Namenode在内存中保存着整个文件系统的名字空间和文件数据块映射(Blockmap)的映像(即FsImage)。这个关键的元数据结构设计得很紧凑,因而一个有4G内存的Namenode足够支撑大量的文件和目录。

当Namenode启动时,或者检查点达到配置文件中的阀值,它从硬盘中读取Editlog和FsImage,将所有Editlog中的事务作用在内存中的FsImage上,并将这个新版本的FsImage从内存中保存到本地磁盘上,然后删除旧的Editlog,因为这个旧的Editlog的事务都已经作用在FsImage上了。这个过程称为一个检查点(checkpoint)。

hdfs dfsadmin -fetchImage fsimage.backup

//手动从namenode获取最新fsimage文件,并保存为本地文件。

因为编辑日志会无限增长,那么恢复编辑日志的过程就会比较长,解决方案是,运行辅助namenode,为主namenode内存中的文件系统元数据创建检查点。最终主namenode拥有最新的fsimage文件和更小的edits文件。

这也解释了辅助namenode和主namenode拥有相近内存需求的原因(辅助namenode也需要把fsimage文件载入内存)。

创建检查点的触发条件受两个配置参数控制,

dfs.namenode.checkpoint.period属性(辅助namenode每隔一段时间就创建检查点,单位s)。dfs.namenode.checkpoint.txns,如果从上一个检查点开始编辑日志大小达到多少的事务数时,创建检查点。

在主namenode发生故障时(假设没有备份),就可以从辅助的namenode上恢复数据。有两种实现方式。

方法一,将相关的存储目录复制到新的namenode中 。

方法二,使用-importCheckpoint选项启动namenode守护进程,从而将辅助namenode用作新的主namenode,有个前提时,dfs.namenode.dir属性定义的目录中没有元数据时。

6、通讯协议

所有的HDFS通讯协议都是建立在TCP/IP协议之上。客户端通过一个可配置的TCP端口连接到Namenode,通过ClientProtocol协议与Namenode交互。而Datanode使用DatanodeProtocol协议与Namenode交互。

一个远程过程调用(RPC)模型被抽象出来封装ClientProtocol和Datanodeprotocol协议。在设计上,Namenode不会主动发起RPC,而是响应来自客户端或 Datanode 的RPC请求。

7、健壮性

HDFS的主要目标就是即使在出错的情况下也要保证数据存储的可靠性。

常见的三种出错情况是:Namenode出错, Datanode出错和网络割裂(network partitions)。

心跳检测,磁盘数据错误和重新复制。

每个Datanode节点周期性地向Namenode发送心跳信号。网络割裂可能导致一部分Datanode跟Namenode失去联系。Namenode通过心跳信号的缺失来检测这一情况,并将这些近期不再发送心跳信号Datanode标记为宕机,不会再将新的IO请求发给它们。任何存储在宕机Datanode上的数据将不再有效。

Datanode的宕机可能会引起一些数据块的副本系数低于指定值,Namenode不断地检测这些需要复制的数据块,一旦发现就启动复制操作。

设置合适的datanode心跳超时时间,避免用datanode不稳定导致的复制风暴。

在下列情况下,也可能需要重新复制:某个Datanode节点失效,某个副本遭到损坏,Datanode上的硬盘错误,或者文件的副本系数增大。

集群均衡(针对datanode)

HDFS的架构支持数据均衡策略。如果某个Datanode节点上的空闲空间低于特定的临界点,按照均衡策略系统就会自动地将数据从这个Datanode移动到其他空闲的Datanode。

个文件的请求突然增加,那么也可能启动一个计划创建该文件新的副本,并且同时重新平衡集群中的其他数据。这个均衡策略目前还没有实现。

数据完整性(针对datanode)

从某个Datanode获取的数据块有可能是损坏的,损坏可能是由Datanode的存储设备错误、网络错误或者软件bug造成的。HDFS客户端软件实现了对HDFS文件内容的校验和(checksum)检查。

当客户端创建一个新的HDFS文件,会计算这个文件每个数据块的校验和,并将校验和作为一个单独的隐藏文件保存在同一个HDFS名字空间下。当客户端获取文件内容后,它会检验从Datanode获取的数据跟相应的校验和文件中的校验和是否匹配,如果不匹配,客户端可以选择从其他Datanode获取该数据块的副本。

元数据磁盘错误(针对namenode出错)

FsImage和Editlog是HDFS的核心数据结构。如果这些文件损坏了,整个HDFS实例都将失效。因而,Namenode可以配置成支持维护多个FsImage和Editlog的副本。任何对FsImage或者Editlog的修改,都将同步到它们的副本上。这种多副本的同步操作可能会降低Namenode每秒处理的名字空间事务数量。然而这个代价是可以接受的,因为即使HDFS的应用是数据密集的,它们也非元数据密集的。当Namenode重启的时候,它会选取最近的完整的FsImage和Editlog来使用。

另外一个可选方案是通过共享存储NFS或一个分布式编辑日志(也叫journal)实现多namenode节点(HA),来增强故障恢复能力。

在HDFS HA的实现中,配置了一对active-standby的namenode,当活动的namenode失效,备用的namenode就会接管它的任务并开始服务于客户端的请求。

实现HA需要在架构上做如下修改:

namenode之间通过高可用共享存储实现编辑日志的共享,当备用namenode接管工作之后,它将通读共享编辑日志直到末尾,实现与active namenode状态同步,并继续读取由活动namenode写入的新条目。

datanode需要同时向两个namenode发送数据块处理报告,因为数据块映射信息存在namenode的内存,而非硬盘。

客户端使用特定的机制处理namenode的失效,这一机制对于用户是透明的。

辅助namenode的角色被namenode所包含,备用namenode为活动的namenode命名空间设置周期性检查。

快照

快照支持某一特定时刻的数据的复制备份。利用快照,可以让HDFS在数据损坏时恢复到过去一个已知正确的时间点。

8、数据组织

数据块

HDFS被设计成支持大文件,适用HDFS的是那些需要处理大规模的数据集的应用。这些应用都是只写入数据一次,但却读取一次或多次,并且读取速度应能满足流式读取的需要。HDFS支持文件的“一次写入多次读取”语义。一个典型的数据块大小是128MB。因而,HDFS中的文件总是按照128M被切分成不同的块,每个块尽可能地存储于不同的Datanode中。

流水线复制

当客户端向HDFS文件写入数据的时候,一开始是写到本地临时文件中。假设该文件的副本系数设置为3,当本地临时文件累积到一个数据块的大小时,客户端会从Namenode获取一个Datanode列表用于存放副本。然后客户端开始向第一个Datanode传输数据,第一个Datanode一小部分一小部分(4 KB)地接收数据,将每一部分写入本地仓库,并同时传输该部分到列表中第二个Datanode节点。第二个Datanode也是这样,一小部分一小部分地接收数据,写入本地仓库,并同时传给第三个Datanode。最后,第三个Datanode接收数据并存储在本地。

因此,Datanode能流水线式地从前一个节点接收数据,并在同时转发给下一个节点,数据以流水线的方式从前一个Datanode复制到下一个。

9、可访问性

HDFS给应用提供了多种访问方式。用户可以通过Java API接口访问,也可以通过C语言的封装API访问,还可以通过浏览器的方式访问HDFS中的文件。通过WebDAV协议访问的方式正在开发中。

DFSShell

HDFS以文件和目录的形式组织用户数据。它提供了一个命令行的接口(DFSShell)让用户与HDFS中的数据进行交互。命令的语法和用户熟悉的其他shell(例如 bash, csh)工具类似。下面是一些动作/命令的示例:

HDFSのアーキテクチャと設計上の

DFSAdmin

DFSAdmin 命令用来管理HDFS集群。这些命令只有HDSF的管理员才能使用。下面是一些动作/命令的示例:

HDFSのアーキテクチャと設計上の

浏览器接口

一个典型的HDFS安装会在一个可配置的TCP端口开启一个Web服务器用于暴露HDFS的名字空间。用户可以用浏览器来浏览HDFS的名字空间和查看文件的内容。

http://ip:50070

10、存储空间回收

文件的删除和恢复

当垃圾回收生效时,通过fs shell删除的文件并没有立刻从HDFS中删除。实际上,HDFS会将这个文件重命名转移到user//.Trash目录。只要文件还在.Trash目录中,该文件就可以被迅速地恢复。文件在Trash中保存的时间是可配置的,当超过这个时间时,Namenode就会将该文件从名字空间中删除。删除文件会使得该文件相关的数据块被释放。注意,从用户删除文件到HDFS空闲空间的增加之间会有一定时间的延迟。

只要被删除的文件还在.Trash目录中,用户就可以恢复这个文件。如果用户想恢复被删除的文件,他/她可以浏览.Trash目录找回该文件。

减少副本系数

ファイル係数のコピーが減少すると、名前ノード過剰コピーが削除]を選択します。次のハートビートは、データノード検出に情報を渡します。データノードは、対応するデータブロック、空き容量増加のクラスタを除去するための移動しました。同様に、エンドsetReplication API呼び出しに、クラスタ間の空きスペースを増やし、いくつかの遅れがあるでしょう。

[この記事では、ユーザー生成コンテンツである、それは記事のソース、記事へのリンク、記事およびその他の基本的な情報予約の著者でマークする必要があります]

おすすめ

転載: blog.51cto.com/14463231/2422569