1

各データノードがストレージに異なるディレクトリを使用するように Hadoop を構成するにはどうすればよいですか?

すべてのデータノードはストレージ スペースを共有します。datanode1 で dir1 を使用し、datanode2 で dir2 を使用したいと思います。最初に、共有ストレージ内の同じディレクトリを使用するようにすべてのデータノードを構成しましたが、1 つのデータノードしか実行されていないことがわかりました。

4

3 に答える 3

2

クラスタ内のノードごとにカスタム hdfs-site.xml ファイルを作成し、データ ディレクトリ プロパティ ( dfs.data.dir) を適切に構成する必要があります。現在、hadoop 構成にも共有ディレクトリを使用している場合は、これを行う方法も修正する必要があります。

少し面倒ですが、シェルスクリプトを使用してファイルを生成したり、Puppet や Chef などのツールを使用したりできると思います。

あなたへの質問-なぜNFSを使用しているのか、データの局所性のポイントをやや打ち負かしています-Hadoopは、(あなたの場合のように)コードとデータの両方ではなく、データがある場所にコードを移動するように設計されています。

データの冗長性を備えた SAN アレイに支えられているために NFS を使用している場合、これもまた困難です。十分な大きさのクラスターがあり、適切に構成されていると仮定すると、HDFS は (構成されている場合) データのレプリケーションを管理します。 . 理論的には、高価な SAN でバッキングするよりも、コモディティ ハードウェアを使用する方がコストがかからないはずです (セットアップや状況によって異なります)。

于 2012-10-02T00:38:28.077 に答える
0

それが大雑把な方法かどうかはわかりませんが、これは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
于 2014-08-11T07:15:21.057 に答える