今回はYARNの設定を行っていく。
Chefレシピ作成にあたってはDeploying MapReduce v2 (YARN) on a Clusterを参考にした。
今回はちょっとハマってしまったのでその辺りも書いていこうと思う。
まずは今回作ったChefレシピの概要を下記にまとめてみた。
- 編集済みの設定ファイル(mapred-site.xmlとyarn-site.xml)を配置する。
- yarnデータ格納用フォルダの作成(/data/1/yarn/,/data/1/yarn/local,/data/1/yarn/logs(yarn-siteで設定したフォルダ))
- yarn.nodemanager.remote-app-log-dir用のhdfsディレクトリ作成(権限周りもちゃんと設定)
- hdfs上にtmpディレクトリ、hadoop-mapreduce-historyserver サービス用のディレクトリ作成(ないとうまく動かなかった)
- サービス起動
実際のChefレシピは下記(前回に追記する形で記載。また、今回の部分だけ抜粋してる)
#設定ファイル(YARN) template "mapred-site.xml" do path "/etc/hadoop/conf.my_cluster/mapred-site.xml" source "mapred-site.xml.erb" owner "root" group "hadoop" mode 00644 end template "yarn-site.xml" do path "/etc/hadoop/conf.my_cluster/yarn-site.xml" source "yarn-site.xml.erb" owner "root" group "hadoop" mode 00644 end #yarnデータ格納用フォルダ作成 directory "/data/1/yarn" do owner "yarn" group "yarn" mode 00755 action :create end directory "/data/1/yarn/local" do owner "yarn" group "yarn" mode 00755 action :create end directory "/data/1/yarn/logs" do owner "yarn" group "yarn" mode 00755 action :create end #yarn.nodemanager.remote-app-log-dir用のhdfsディレクトリ作成 bash "create hdfs directory for app-log" do code <<-EOS sudo -u hdfs hadoop fs -mkdir -p /var/log/hadoop-yarn/apps sudo -u hdfs hadoop fs -chown -R yarn:hadoop /var/log/hadoop-yarn sudo -u hdfs hadoop fs -chmod -R 1774 /var/log/hadoop-yarn EOS not_if "sudo -u hdfs hadoop fs -test -d /var/log/hadoop-yarn/apps" end #hdfs上にtmpディレクトリ作成 bash "create tmp directory on hdfs" do code <<-EOS sudo -u hdfs hadoop fs -mkdir /tmp sudo -u hdfs hadoop fs -chmod -R 1777 /tmp EOS not_if "sudo -u hdfs hadoop fs -test -d /tmp" end #hdfs上にHistory用ディレクトリ作成 bash "create history directory on hdfs" do code <<-EOS sudo -u hdfs hadoop fs -mkdir -p /user/history sudo -u hdfs hadoop fs -chown -R yarn:hadoop /user/history sudo -u hdfs hadoop fs -chmod -R 1777 /user/history EOS not_if "sudo -u hdfs hadoop fs -test -d /user/history" end #Service起動 service "hadoop-hdfs-namenode" do action :restart end service "hadoop-hdfs-datanode" do action :restart end service "hadoop-yarn-resourcemanager" do action :restart end service "hadoop-yarn-nodemanager" do action :restart end service "hadoop-mapreduce-historyserver" do action :restart end
HDFSに対してディレクトリを作るときは、2回目以降もエラーにならないよう、HDSF上にフォルダがない場合のみ実行するようにしている。
HDFS上のフォルダ存在判定にはtestコマンドを使っている。testコマンドはフォルダがすでにある場合には0,ない場合には1を返す。
mapred-site.xml
<?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <!-- Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. See accompanying LICENSE file. --> <!-- Put site-specific property overrides in this file. --> <configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration>
yarn-site.xml.erb
<?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration> <property> <name>yarn.resourcemanager.resource-tracker.address</name> <value>0.0.0.0:8031</value> </property> <property> <name>yarn.resourcemanager.address</name> <value>0.0.0.0:8032</value> </property> <property> <name>yarn.resourcemanager.scheduler.address</name> <value>0.0.0.0:8030</value> </property> <property> <name>yarn.resourcemanager.admin.address</name> <value>0.0.0.0:8033</value> </property> <property> <name>yarn.resourcemanager.webapp.address</name> <value>0.0.0.0:8088</value> </property> <property> <description>Classpath for typical applications.</description> <name>yarn.application.classpath</name> <value> $HADOOP_CONF_DIR, $HADOOP_COMMON_HOME/*,$HADOOP_COMMON_HOME/lib/*, $HADOOP_HDFS_HOME/*,$HADOOP_HDFS_HOME/lib/*, $HADOOP_MAPRED_HOME/*,$HADOOP_MAPRED_HOME/lib/*, $YARN_HOME/*,$YARN_HOME/lib/* </value> </property> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce.shuffle</value> </property> <property> <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name> <value>org.apache.hadoop.mapred.ShuffleHandler</value> </property> <property> <name>yarn.nodemanager.local-dirs</name> <value>/data/1/yarn/local</value> </property> <property> <name>yarn.nodemanager.log-dirs</name> <value>/data/1/yarn/logs</value> </property> <property> <description>Where to aggregate logs</description> <name>yarn.nodemanager.remote-app-log-dir</name> <value>/var/log/hadoop-yarn/apps</value> </property> </configuration>
yarn.resourcemanager.webapp.addressで0.0.0.0:8088を設定している。自身のIPとかHostNameいれたらなんか実行時にWebUIにアクセスできなくなったのでこうしてる。デフォルトなら設定しなくてもいいのかも。
yarn.nodemanager.local-dirs、yarn.nodemanager.log-dirsにはローカル上のディレクトリを指定する。(ディレクトリはChefレシピ内で作ったとこ)
yarn.nodemanager.remote-app-log-dirにはHDFS上のディレクトリを指定する。(こちらもChefレシピ内でつくってる)
さて、いざ実行してみるとうまくいかなかった。。。
どうもyarn.nodemanager.local-dirs の設定あたりでエラーがでてる。ちゃんとフォルダは作ったし、権限も設定したし何が悪いんだろうと思いログを見てみる。
/var/log/hadoop-mapreduce/yarn-mapred-historyserver-hadoopvm.log のログ抜粋
なんでディレクトリ作ったのに再度つくろうとしているのかはわからないが、どうも/data/1 のディレクトリ権限がだめっぽい感じです。
ディレクトリ権限は下記の様な感じ。
よく見たら/data/1 ディレクトリはhdfsユーザ以外は読み込みしかできないようになってます。(このディレクトリ自体は前回hdfsの設定で作ったもの)
なので、/data/ , /data/1 のディレクトリ権限を変えて( 775とかに)実行したらうまく動くようになった。ここに気づくのに結構時間かかった。。。
成功していれば下記のような画面になるはず。
UnhealthyノードではなくActiveになりました。
これで完成です。
やっと設定が終わったので次は実際に動かしてみたいと思います。長かった。
コメントはまだありません