各データノードがストレージに異なるディレクトリを使用するように Hadoop を構成するにはどうすればよいですか?
すべてのデータノードはストレージ スペースを共有します。datanode1 で dir1 を使用し、datanode2 で dir2 を使用したいと思います。最初に、共有ストレージ内の同じディレクトリを使用するようにすべてのデータノードを構成しましたが、1 つのデータノードしか実行されていないことがわかりました。
各データノードがストレージに異なるディレクトリを使用するように Hadoop を構成するにはどうすればよいですか?
すべてのデータノードはストレージ スペースを共有します。datanode1 で dir1 を使用し、datanode2 で dir2 を使用したいと思います。最初に、共有ストレージ内の同じディレクトリを使用するようにすべてのデータノードを構成しましたが、1 つのデータノードしか実行されていないことがわかりました。
クラスタ内のノードごとにカスタム hdfs-site.xml ファイルを作成し、データ ディレクトリ プロパティ ( dfs.data.dir
) を適切に構成する必要があります。現在、hadoop 構成にも共有ディレクトリを使用している場合は、これを行う方法も修正する必要があります。
少し面倒ですが、シェルスクリプトを使用してファイルを生成したり、Puppet や Chef などのツールを使用したりできると思います。
あなたへの質問-なぜNFSを使用しているのか、データの局所性のポイントをやや打ち負かしています-Hadoopは、(あなたの場合のように)コードとデータの両方ではなく、データがある場所にコードを移動するように設計されています。
データの冗長性を備えた SAN アレイに支えられているために NFS を使用している場合、これもまた困難です。十分な大きさのクラスターがあり、適切に構成されていると仮定すると、HDFS は (構成されている場合) データのレプリケーションを管理します。 . 理論的には、高価な SAN でバッキングするよりも、コモディティ ハードウェアを使用する方がコストがかからないはずです (セットアップや状況によって異なります)。
それが大雑把な方法かどうかはわかりませんが、これはnamenodeのslaves.shファイルをカスタマイズして、各データノードの異なるディレクトリ構造の実装を実現する方法です:
の各データノードで実行される ssh リモート コマンドを編集します$HADOOP_HOME/bin/slaves.sh
。
for slave in `cat "$HOSTLIST"|sed "s/#.*$//;/^$/d"`; do
# If the slave node is ap1001 (first datanode),
# Then use a different directory path for SSH command.
if [ $slave == "ap1001" ]
then
input=`/bin/echo $"${@// /\\ }"` >/dev/null 2>&1
# If the command type is start-dfs (start the datanodes)
# Then construct the start command for remote execution on datanode through ssh
/bin/echo $input | grep -i start
if [ $? -eq 0 ]
then
inputArg="cd /app2/configdata/hdp/hadoop-1.2.1 ; /app2/configdata/hdp/hadoop-1.2.1/bin/hadoop-daemon.sh --config /app2/configdata/hdp/hadoop-1.2.1/libexec/../conf start datanode"
else
# If the command type is stop-dfs (stop the datanodes)
# Then construct the stop command for remote execution on datanode through ssh
inputArg="cd /app2/configdata/hdp/hadoop-1.2.1 ; /app2/configdata/hdp/hadoop-1.2.1/bin/hadoop-daemon.sh --config /app2/configdata/hdp/hadoop-1.2.1/libexec/../conf stop datanode"
fi
ssh $HADOOP_SSH_OPTS $slave $inputArg 2>&1 &
else
# Use default command for remaining slaves.
ssh $HADOOP_SSH_OPTS $slave $"${@// /\\ }" \
2>&1 | sed "s/^/$slave: /" &
fi
if [ "$HADOOP_SLAVE_SLEEP" != "" ]; then
sleep $HADOOP_SLAVE_SLEEP
fi
done