2

まず、私の質問を読んでくれてありがとう!

現在、Hadoopのレプリケーションモデルを研究していますが、行き詰まっています。「 OreillyHadoopTheDefinitive Guide 3rdEditionJan2012」という本から勉強しています。質問に来るために、私は最初に本から下のテキストを読む必要があります。

73ページには、次のようなものがあります。

DistributedFileSystemは、クライアントのFSDataOutputStreamを返します。Hadoop分散ファイルシステムは、データの書き込みを開始します。読み取りの場合と同様に、FSDataOutputStreamは、データノードおよびネームノードとの通信を処理するDFSOutputストリームをラップします。クライアントがデータを書き込むとき(ステップ3) 、

DFSOutputStreamはそれをパケットに分割し、データキューと呼ばれる内部キューに書き込みます。データキューはデータストリーマーによって消費されます。データストリーマーは、レプリカを保存するのに適したデータノードのリストを選択して、名前ノードに新しいブロックを割り当てるように依頼します。」*

ご覧のとおり、DFSOutputStreamにはパケットのデータキューがあります。データキューは、namenodeに新しいブロックの割り当てを要求するDataStreamerによって消費されています。

私の質問:

これはどのように作動しますか?

Namenodeはどのように新しいブロックを割り当てますか?

同じ質問、別の質問:Namenodeはどのようにして適切なデータノードのリストを作成しますか?

私はこれについてインターネットや本の中で何も見つけることができません。この本は、プロセスを高レベルから説明しています。

お手数をおかけしますが、よろしくお願いいたします。

4

3 に答える 3

1

これは、プラグイン可能なポリシーベースのアルゴリズムです。詳細については、レプリカの配置を参照してください。

于 2012-06-12T19:18:14.547 に答える
1

あなたも言及したので、私は2つの異なる質問を見るかもしれませんDataStreamer

両方の回答は、「Konstantin Shvachko、Hairong Kuang、Sanjay Radia、RobertChanslerによるHadoop分散ファイルシステム」にあります。

1)クライアント(DataStreamer)からブロックを要求する方法は?

クライアントが書き込むとき、クライアントは最初にNameNodeに、ファイルの最初のブロックのレプリカをホストするDataNodeを選択するように要求します。クライアントはノードからノードへのパイプラインを編成し、データを送信します。最初のブロックがいっぱいになると、クライアントは次のブロックのレプリカをホストするために選択される新しいDataNodeを要求します。新しいパイプラインが編成され、クライアントはファイルの追加バイトを送信します。DataNodeの選択はそれぞれ異なる可能性があります。

2)NameNodeはどのようにして適切なデータノードのリストを作成しますか?

他のユーザーがすでに回答しているように、Hadoopではこのポリシーを構成できますが、デフォルトのレプリカ配置ポリシーとして次のようになります。

新しいブロックが作成されると、HDFSは最初のレプリカをライターが配置されているノードに配置し、2番目と3番目のレプリカを異なるラックの2つの異なるノードに配置し、残りはランダムノードに配置されます。レプリカの数がラックの数の2倍未満の場合、1つのレプリカが1つのノードに配置され、2つ以下のレプリカが同じラックに配置されます。

于 2015-11-02T12:00:59.203 に答える
1

ApacheHDFSデザインをご覧くださいここに画像の説明を入力してください

たとえば、レプリケーション係数が3の場合、HDFSの配置ポリシーはgrepcodeから次のようになります。

** The class is responsible for choosing the desired number of targets
 * for placing block replicas.
 * The replica placement strategy is that if the writer is on a datanode,
 * the 1st replica is placed on the local machine, 
 * otherwise a random datanode. The 2nd replica is placed on a datanode
 * that is on a different rack. The 3rd replica is placed on a datanode
 * which is on a different node of the rack as the second replica.
 */
@InterfaceAudience.Private
public class BlockPlacementPolicyDefault extends BlockPlacementPolicy {

このポリシーは、ラック間の書き込みトラフィックを削減し、書き込みパフォーマンスを向上させます。

ラック障害の可能性は、ノード障害の可能性よりはるかに少ないです。このポリシーは、データの信頼性と可用性の保証には影響しません。

このポリシーでは、ファイルのレプリカがラック全体に均等に分散されません。

レプリカの3分の1が1つのノードにあります

レプリカの3分の2が1つのラックにあります

そして残りの3分の1は残りのラックに均等に分散されます。

このポリシーは、データの信頼性や読み取りパフォーマンスを損なうことなく、書き込みパフォーマンスを向上させます。

==>

1番目と3番目のレプリカが1つのRACに存在し、2番目のレプリカが他のRACに存在する(リモート)

于 2015-11-02T13:01:32.307 に答える