HDFSのレプリケーションメカニズム
HDFSでは、ファイルは物理的にブロック単位で保存されます。ブロックサイズは`hdfs-site.xml`ファイル内の`dfs.block.size`パラメータで設定できます:
<!-- ブロックサイズ、単位:バイト -->
<property>
<name>dfs.block.size</name>
<value>134217728</value>
</property>
ブロック保存の利点:
- ファイルサイズがクラスタ内のすべてのディスク容量を超える可能性がある場合、ブロックメカニズムでこの問題を解決できます。
- ブロックをファイル保存の論理単位として使用することで、ストレージサブシステムを簡素化できます。
- ブロックはデータバックアップ(冗長なデータレプリカ)に最適で、データ耐障害性を提供します。
Hadoop 1.xではブロックサイズのデフォルトは64MB、Hadoop 2.xでは128MBです。
ブロックサイズの設定はシステムパフォーマンスに大きな影響を与えます:
サイズが小さすぎると、シーク時間が増加します:通常サイズのファイルが多数の小さなブロックに分割され、読み取り時にすべてのブロックを見つける必要があります。
サイズが大きすぎると、ディスクからデータを転送する時間がブロックの特定位置を見つける時間よりも明らかに長くなり、ブロック処理速度が低下します。
HDFSのラック認識メカニズム
HDFSのラック認識(ラック戦略とも呼ばれます)は、レプリカの保存場所を決定する戦略です。
デフォルトのレプリカ数=3を例に説明します:
- 第1レプリカはクライアントが接続しているDataNodeに保存されます。
- 第2レプリカはクライアントが接続しているDataNodeと同じラック内の他のDataNodeに保存されます。
- 第3レプリカは異なるラックのDataNodeに保存されます。
本番環境では、ラック戦略を手動で設定する必要があります。
HDFSの負荷分散メカニズム
HDFSの負荷分散メカニズムは、各DataNodeに保存されるデータ量をできるだけ均等に保つ(パーセンテージの差が小さい)ことを目指します。
HDFSには自動負荷分散機能がありますが、転送速度が比較的遅いため、クラスタ規模が小さい場合に有効です:
<!-- クラスタがアイドル状態の場合、1MB/s -->
<property>
<name>dfs.datanode.balance.bandwidthPerSec</name>
<value>1048576</value>
</property>
クラスタ規模が大きい場合、負荷分散が通常のビジネス読み書きに影響を与えないように、クラスタがアイドル状態の時に手動で負荷分散を実行する必要があります。
手動コマンドは以下の通りです:
# 任意の2ノード間のストレージパーセンテージの差が10%を超えないように
sbin/start-balancer.sh -t 10%