SparkをYARN上で動かしていて、気づいたことのメモ。ディスク容量が非常に小さいサーバをスレーブにしていた時に、ある程度Sparkアプリケーションを実行していると、NodeManagerのUnhealthy化が起きたので調査しました。NodeManagerのUnhealthyとはYARNでは、各スレーブサーバで動作しているNodeManagerは自身のサーバでYARNコンテナの動作に利用するディスク領域のチェックを定期的に実行しています。パーミッションが適切か、ディスクの空き容量が十分余っているかを確認しており、デフォルトでは90%以上容量を使ってしまっていると、UNHEALTHYという状態であることをResourceManagerに通知し、新しいYARNコンテナの割り当てがされないようにします。このあたりの仕様はHadoopのドキュメントに書いてあります。https://hadoop.apache.org/docs/current/hadoop-yarn/hadoop-yarn-site/NodeManager.htmlただし、上記ページは左側のメニュー一覧には存在しないので、存在していることを知らないと辿りつけないという罠。Unhealthy」とかでググるとStackOverflowとかいろいろ引っかかるので、皆一度はハマっているのかなぁと思います。NodeManagerのUnhealthy化が招くトラブルUnhealthy化したNodeManagerはYARNコンテナ割当対象から外されるため、Hadoopクラスタ上で新しいアプリケーションを動かすためのリソース量が減ってしまいます。大体、運用していると各スレーブに平均的に処理が分散されるので、NodeManagerのディスク使用量の推移もほぼ均等に進むため、いつのまにか使えるNodeManagerが1つも居なくなって、投入したYARNアプリケーションが進まなくなるという恐ろしい事態になります。-allコマンドで「Node-State」の列を見たりしてチェックします。nodeコマンドは-allオプションを付けないと、UnhealthyになったNodeManagerを表示しないので注意が必要です。CacheとしてSparkの設定ファイルやjarファイル(200MBくらいある!)を配布するようです。このため、気づかないうちにNodeManagerが利用しているディスク容量が増加しがちです。spark-assembly-1.5.2-hadoop2.6.0.jarSparkのドキュメントを改めて見ると、確かにそれっぽいことが書いてありました。property.http://spark.apache.org/docs/latest/submitting-applications.htmlYARNだと自動的にクリーンアップされると書いてありますね。このクリーンアップを制御するパラメータを調査したところ、以下のものが該当しそうです。</property>デフォルトだと10分に1回チェックが走り、10GB以上になっていると削除が行われるようです。ディスク容量が10GB以下のサーバ上でYARNを動かしているときは、このしきい値を変えた方が良さそうです。普通はないと思いますが、手元のノートPC上でVMとしてHadoopクラスタを組んでいたりすると、たまにハマるんですよね。HDFSが使う領域と共存してたりすると、影響がHDFS側にも出るのでさらにbad。試しに、yarn.nodemanager.localizer.cache.target-size-mbをyarn-site.xmlで1024(=1GB)に変更してみたところ、NodeManagerのUnhealty化が発生しなくなりました。このクリーンアップ処理が動作してもNodeManagerのログには特にメッセージが出ないようです。upLoginユーザーは見つかりませんでした。