A、Hadoopのラック意識戦略
コピーノードを選択する(ラックの意識)
1、デフォルトの
最初のクライアントのコピーが配置されているノード。クラスタ外のクライアントは、ランダムに選択した場合。
第2のランダムノードと異なるラックのコピーにコピーします。
第三のコピーと同じラックの第2のコピー、ランダムにノード。
2、hadoop2.7.2戦略
におけるクライアントノード最初のコピー。クラスタ外のクライアントは、ランダムに選択した場合。
そして、同じラックの最初のコピーの2番目のコピー。
第三のコピーは異なるフレームです。
第二に、カスタム検知ステップラック
1は、実装インターフェイスはorg.apache.hadoop.net.DNSToSwitchMappingことクラスの作成
、さらにコアsite.xmlファイルを、以下、2
<プロパティ> <名前> net.topology.node。スイッチ .mapping.impl </名前> <値> org.apache.hadoop.net.ScriptBasedMapping </ value>の <説明> デフォルトDNSToSwitchMappingの実装。これは、 指定されたスクリプト呼び出しで解決にnet.topology.script.file.name ノード名を。値場合のため net.topology.script.file.nameがされていない設定、 デフォルト DEFAULT_RACKの値がされて返されたため、すべてのノード名。 </記述> </ property>の
3、site.xmlの分布コア
全てのHadoopクラスパス($ {HADOOP_HOME /共有/ノードに分散瓶、標識された。4、コンパイラ、 Hadoopの/共通/ LIB}) 以下です。
第三に、カスタムラック具現化センシング
1、準備MyRackAwareクラスとして、
パッケージcom.phx.hadoop.hdfs.rackaware。 輸入org.apache.hadoop.net.DNSToSwitchMapping。 輸入java.io.FileWriter; 輸入はjava.util.ArrayList; 輸入はjava.util.List; パブリック クラスMyRackAware実装DNSToSwitchMapping { / * * * * @param名 * @return *ラック:/ RACK1 / 002 * 192.168.37.102:50010(centos002) *ラック:/ RACK1 / 003 * 192.168.37.103:50010(centos003) *ラック:/ RACK2 / 004 * 192.168.37.104:50010(centos004) *ラック:/ RACK2 / 005 * 192.168.37.105:50010(centos005) * / @Override 公共の一覧<文字列>の決意(一覧<文字列> の名前){ リスト <文字列>リスト= 新しいのArrayList <文字列> (); 試す{ てFileWriter FW = 新しいてFileWriter(" /data/hadoop/rackaware.txt "、真の); 用(文字列str:名){ // 输出原来的信息、IP地址(主机名) fw.write(STR + " \ R \ n " ); // もし(str.startsWith(" 192 "192.168.231.202 ストリングIP = str.substring(str.lastIndexOf(" ")+ 1 )。 もし(Integer.parseInt(IP)<= 103 ){ list.add(" / RACK1 / " + IP)。 } 他{ list.add(" / RACK2 / " + IP)。 } } そうであれば(str.startsWith(" CentOSの" )){ 文字列IP = str.substring(6 )。 もし(Integer.parseInt(IP)<= 003 ){ list.add(" / RACK1 / " + IP)。 } 他{ list.add(" / RACK2 / " + IP)。 } } } fw.write(リスト + " \ R \ n " ); fw.close(); } キャッチ(例外e){ e.printStackTrace(); } リターンリスト; } @Override 公共 ボイドreloadCachedMappings(){ } @Override 公共 ボイド reloadCachedMappings(リストの<string> 名){ } }
MyRackAwareクラスラベル瓶パッケージ:MyRackAware.jar
MyRackAware.jarパッケージは、以下のHadoopクラスパス($ {HADOOP_HOME} /共有/ Hadoopの/共通/ LIB)内のすべてのノードに配布されます。
次のように図2に示すように、コアsite.xmlのプロファイルはさらに構成される。
<プロパティ>
<名前> net.topology.node.switch.mapping.impl </名前>
<値> com.phx.hadoop.hdfs.rackaware.MyRackAware </ value>の
</ property>の
Hadoopの$ {HADOOP_HOME}内のすべてのノードの/ etc / Hadoopのに分配コアsite.xmlファイル
3、再起動後、次のコマンドを使用しますHadoopのdfsadmin -printTopology構成を表示します
前記ノード間の距離を算出する
ラック意識して、名前ノードのデータノードは、図1に示すネットワークトポロジを描画することができます。D1は、R1はスイッチであり、底部はデータノードです。H1はrackid = / D1 / R1 / H1であり 、H1は親R1であり、R1はD1です。これらのrackid情報はtopology.script.file.nameを介して設定することができます。これらrackid情報で、私たちは、任意の2つのデータノード、クラスタ全体のネットワーク帯域幅のバランスを最適化するための最適なストレージ戦略、および最適化されたデータの割り当ての間の距離を計算することができます。
距離(/ D1 / R1 / H1 、/ D1 / R1 / H1)は= 同じ0データノード
の距離(/ DL / RL / HL、/ DL / RL / H2の)同じラックの下で異なるデータノード2 =
距離(/ DL / R1 / H1、/ D1 / R2 / H4)= 同IDC下で4つの異なるデータノードを
距離/ R3 / H7の(/ DL / RL / HL、/ D2)= IDC。6つの異なるデータノードで