Hadoop2.xクラスタ動的追加削除データノード
8653 ワード
Hadoopクラスタがすでに実行されている場合、新しいデータノードを動的に追加してHadoopシステムに追加したり、あるデータノードをオフラインにしたりする必要があります.ビジネスの必要でクラスタを再起動できない場合、具体的なDataNodeの追加、削除手順はどのようなものですか.
次に、HDFSクラスタにデータノードを動的に追加する方法(Hadoop 2.0バージョン)を、DataNodeのオンラインを例に詳細に説明します.
まず、関連するプロファイルをいくつか簡単に説明します.
(1)dfs.hosts構成オプションで指定したホワイトリストファイルは、データノードを新規にオンラインにする場合、データノードの名前をこのファイルに追加する必要があります.
(2)dfs.hosts.Exclude構成オプションで指定したブラックリストファイルは、データノードをオフラインにする場合、データノードの名前をこのファイルに追加する必要があります.
次の手順を開始します(新しいデータノードのHadoop環境がすべて配備されているとします):
Step 1:新たにデータノードを追加したファイアウォールを閉じる.
Step 2:2つのNameNodeノードのhostsファイルに、新規データノードのhostnameを追加します.
Step 3:新規データノードごとのhostsファイルに、NameNodeのhostnameを2つ追加します.
Step 4:2つのNameNodeで、新規データノードの鍵なしSSHへのログインチャネルをオンにします.
Step 5:2つのNameノード上のdfs.hostsが指定したホワイトリストファイルに追加したすべての新規データノードのhostnameを追加し、追加であることに注意!そして、dfsに保証する.hosts.Excludeで指定したブラックリストファイルには、新しいデータノードのhostnameは含まれていません.
Step 6:クライアントを探し、プロファイルは他のノードと一致し、次のリフレッシュコマンドを実行する.
hdfs dfsadmin -refreshNodes
(このステップは他のノードでも実行できます)
Step 7:ステップ6のクライアントで操作するか、hdfs-siteを変更する必要がある.xmlの構成オプションは、次の構成オプションと同様です.
変更後:
Step 8:手順7のクライアントでコマンドを再実行する:
hdfs dfsadmin -refreshNodes
Step 9:データノードでDataNodeプロセスを開始し、以下のコマンドを実行する.
hadoop-daemon.sh start datanode
Step 10:データノードプロセスの状況(ログ経由)を確認し、NameNodeのwebインタフェースを確認する.
Step 11:2つのNameノードでslavesファイルを変更し、オンラインにするデータノードhostnameをslavesファイルに追加します.
ステップ7で構成を変更してからステップ8のリフレッシュを行う理由は、Hadoop 2にあるからです.xバージョンではFederationメカニズムが導入され、ユーザーは状況に応じて複数のNameNodeを定義することができ、各グループには2つのNameNodeがあり、1つはactiveであり、もう1つはstandbyであり、HAを実現した.リフレッシュコマンドを実行するノードが1つのClientに相当するため、Clientは現在のnameserviceの最初のNameNode実行リフレッシュコマンドをトリガーし、両方のNameNodeがリフレッシュされるようにするには、下の構成を変更してからリフレッシュします.具体的には、リフレッシュは次のように呼び出されます.
ファイルシステムオブジェクトFileSystemを取得した後、FSNamesystemクラスのrefreshNodesメソッドを呼び出します.
適切な操作権限を確認した後、最後にDatanodeManagerクラスによって具体的なリフレッシュを実行します.
ここで、refreshHostsReaderは、dfsの再読み込みである.hostsが指定したプロファイルで、その内容をメモリにロードし、ホワイトリストincludesを更新します.次に、最も重要なステップを実行して、データノードのリストをリフレッシュします.
ここでのinHostsListメソッドは、データノードから心拍数が来て登録する場合、そのノードがホワイトリストに入っているかどうかを判断し、いなければそのデータノードの登録要求を拒否し、異常を投げ出すことです.
DisallowedDatanodeException:"Datanode denied communication with namenode: "+ nodeID
データノードのオフラインについては、上記の手順と同様ですが、Step 5でファイルを交換します.真の操作の過程でクラスタの再起動に関与しない~
次に、HDFSクラスタにデータノードを動的に追加する方法(Hadoop 2.0バージョン)を、DataNodeのオンラインを例に詳細に説明します.
まず、関連するプロファイルをいくつか簡単に説明します.
(1)dfs.hosts構成オプションで指定したホワイトリストファイルは、データノードを新規にオンラインにする場合、データノードの名前をこのファイルに追加する必要があります.
(2)dfs.hosts.Exclude構成オプションで指定したブラックリストファイルは、データノードをオフラインにする場合、データノードの名前をこのファイルに追加する必要があります.
次の手順を開始します(新しいデータノードのHadoop環境がすべて配備されているとします):
Step 1:新たにデータノードを追加したファイアウォールを閉じる.
Step 2:2つのNameNodeノードのhostsファイルに、新規データノードのhostnameを追加します.
Step 3:新規データノードごとのhostsファイルに、NameNodeのhostnameを2つ追加します.
Step 4:2つのNameNodeで、新規データノードの鍵なしSSHへのログインチャネルをオンにします.
Step 5:2つのNameノード上のdfs.hostsが指定したホワイトリストファイルに追加したすべての新規データノードのhostnameを追加し、追加であることに注意!そして、dfsに保証する.hosts.Excludeで指定したブラックリストファイルには、新しいデータノードのhostnameは含まれていません.
Step 6:クライアントを探し、プロファイルは他のノードと一致し、次のリフレッシュコマンドを実行する.
hdfs dfsadmin -refreshNodes
(このステップは他のノードでも実行できます)
Step 7:ステップ6のクライアントで操作するか、hdfs-siteを変更する必要がある.xmlの構成オプションは、次の構成オプションと同様です.
<property>
<name>dfs.namenode.rpc-address.mcs.nn0</name>
<value>namenode0:9000</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mcs.nn1</name>
<value>namenode1:9000</value>
</property>
変更後:
<property>
<name>dfs.namenode.rpc-address.mcs.nn0</name>
<value>namenode1:9000</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mcs.nn1</name>
<value>namendoe0:9000</value>
</property>
Step 8:手順7のクライアントでコマンドを再実行する:
hdfs dfsadmin -refreshNodes
Step 9:データノードでDataNodeプロセスを開始し、以下のコマンドを実行する.
hadoop-daemon.sh start datanode
Step 10:データノードプロセスの状況(ログ経由)を確認し、NameNodeのwebインタフェースを確認する.
Step 11:2つのNameノードでslavesファイルを変更し、オンラインにするデータノードhostnameをslavesファイルに追加します.
ステップ7で構成を変更してからステップ8のリフレッシュを行う理由は、Hadoop 2にあるからです.xバージョンではFederationメカニズムが導入され、ユーザーは状況に応じて複数のNameNodeを定義することができ、各グループには2つのNameNodeがあり、1つはactiveであり、もう1つはstandbyであり、HAを実現した.リフレッシュコマンドを実行するノードが1つのClientに相当するため、Clientは現在のnameserviceの最初のNameNode実行リフレッシュコマンドをトリガーし、両方のNameNodeがリフレッシュされるようにするには、下の構成を変更してからリフレッシュします.具体的には、リフレッシュは次のように呼び出されます.
public int refreshNodes() throws IOException {
int exitCode = -1;
DistributedFileSystem dfs = getDFS();
dfs.refreshNodes();
exitCode = 0;
return exitCode;
}
ファイルシステムオブジェクトFileSystemを取得した後、FSNamesystemクラスのrefreshNodesメソッドを呼び出します.
void refreshNodes() throws IOException {
checkOperation(OperationCategory.UNCHECKED);
checkSuperuserPrivilege();
getBlockManager().getDatanodeManager().refreshNodes(new HdfsConfiguration());
}
適切な操作権限を確認した後、最後にDatanodeManagerクラスによって具体的なリフレッシュを実行します.
public void refreshNodes(final Configuration conf) throws IOException {
refreshHostsReader(conf);
namesystem.writeLock();
try {
refreshDatanodes();
} finally {
namesystem.writeUnlock();
}
}
ここで、refreshHostsReaderは、dfsの再読み込みである.hostsが指定したプロファイルで、その内容をメモリにロードし、ホワイトリストincludesを更新します.次に、最も重要なステップを実行して、データノードのリストをリフレッシュします.
private void refreshDatanodes() throws IOException {
for(DatanodeDescriptor node : datanodeMap.values()) {
// Check if not include.
if (!inHostsList(node)) {
node.setDisallowed(true); // case 2.
} else {
if (inExcludedHostsList(node)) {
startDecommission(node); // case 3.
} else {
stopDecommission(node); // case 4.
}
}
}
}
ここでのinHostsListメソッドは、データノードから心拍数が来て登録する場合、そのノードがホワイトリストに入っているかどうかを判断し、いなければそのデータノードの登録要求を拒否し、異常を投げ出すことです.
DisallowedDatanodeException:"Datanode denied communication with namenode: "+ nodeID
データノードのオフラインについては、上記の手順と同様ですが、Step 5でファイルを交換します.真の操作の過程でクラスタの再起動に関与しない~