Chefを使ってCDHを設定してみた(YARN編)


今回はYARNの設定を行っていく。

Chefレシピ作成にあたってはDeploying MapReduce v2 (YARN) on a Clusterを参考にした。

今回はちょっとハマってしまったのでその辺りも書いていこうと思う。

 

まずは今回作ったChefレシピの概要を下記にまとめてみた。

  1. 編集済みの設定ファイル(mapred-site.xmlとyarn-site.xml)を配置する。
  2. yarnデータ格納用フォルダの作成(/data/1/yarn/,/data/1/yarn/local,/data/1/yarn/logs(yarn-siteで設定したフォルダ))
  3. yarn.nodemanager.remote-app-log-dir用のhdfsディレクトリ作成(権限周りもちゃんと設定)
  4. hdfs上にtmpディレクトリ、hadoop-mapreduce-historyserver サービス用のディレクトリ作成(ないとうまく動かなかった)
  5. サービス起動

 

実際の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を返す。

HDFS上でフォルダがすでにあるか

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-UNHELTHY1

YARN-UNHELTHY2

どうもyarn.nodemanager.local-dirs の設定あたりでエラーがでてる。ちゃんとフォルダは作ったし、権限も設定したし何が悪いんだろうと思いログを見てみる。

 

/var/log/hadoop-mapreduce/yarn-mapred-historyserver-hadoopvm.log のログ抜粋

YARN−Directory権限エラー

なんでディレクトリ作ったのに再度つくろうとしているのかはわからないが、どうも/data/1 のディレクトリ権限がだめっぽい感じです。

ディレクトリ権限は下記の様な感じ。

YARN-LOCALDIRECTORY権限(失敗版)

よく見たら/data/1 ディレクトリはhdfsユーザ以外は読み込みしかできないようになってます。(このディレクトリ自体は前回hdfsの設定で作ったもの)

なので、/data/ , /data/1 のディレクトリ権限を変えて( 775とかに)実行したらうまく動くようになった。ここに気づくのに結構時間かかった。。。

成功していれば下記のような画面になるはず。

YARN−成功

UnhealthyノードではなくActiveになりました。

これで完成です。

やっと設定が終わったので次は実際に動かしてみたいと思います。長かった。

コメントはまだありません

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

AWS
Docker
ECS+ALBの動的ポートマッピングでダウンタイムのないデプロイを試してみた

はじめに 少し前に個人で作成しているWebサービスのインフラにDockerを使い始めました。 複数台 …

スクリーンショット 2016-01-09 20.02.08
Ruby on Rails
Capistrano3を利用してBitbucketプライベートリポジトリにあるRailsアプリをデプロイしてみた

Railsアプリを配置する際、毎回手作業で頑張って配置してきたが、そろそろ自動デプロイを・・・ とい …

MarketTreeViewのイメージ
Ruby on Rails
[Eve Online 3rd party app] Market Tree Viewの実装 [EOPES制作記]

Eve Online 3rd party app のEOPES を作り始めてから約3ヶ月が経ちました …