LoginSignup
9
7

More than 5 years have passed since last update.

ディスク容量が貧弱なYARNクラスタでSparkを動かす際の注意点

Posted at

Apache 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

ただし、上記ページは左側のメニュー一覧には存在しないので、存在していることを知らないと辿りつけないという罠。。。

「NodeManager Unhealthy」とかでググるとStackOverflowとかいろいろ引っかかるので、皆一度はハマっているのかなぁと思います。

NodeManagerのUnhealthy化が招くトラブル

Unhealthy化したNodeManagerはYARNコンテナ割当対象から外されるため、Hadoopクラスタ上で新しいアプリケーションを動かすためのリソース量が減ってしまいます。

大体、運用していると各スレーブに平均的に処理が分散されるので、NodeManagerのディスク使用量の推移もほぼ均等に進むため、いつのまにか使えるNodeManagerが1つも居なくなって、投入したYARNアプリケーションが進まなくなるという恐ろしい事態になります。

ResourceManagerのWebUIで「Unhealthy Nodes」列を見たり、yarn node -list -allコマンドで「Node-State」の列を見たりしてチェックします。yarn nodeコマンドは-allオプションを付けないと、UnhealthyになったNodeManagerを表示しないので注意が必要です。

SparkとNodeManagerのUnhealthy化

SparkをYARN上で実行すると、アプリケーションごとにエグゼキュータが動作しているスレーブ上にDistributed CacheとしてSparkの設定ファイルやjarファイル(200MBくらいある!)を配布するようです。
このため、気づかないうちにNodeManagerが利用しているディスク容量が増加しがちです。

# ls -lRh filecache/
filecache/:
total 4.0K
drwxr-xr-x 2 yarn yarn 4.0K Nov 16 14:49 18

filecache/18:
total 176M
-r-x------ 1 yarn yarn 176M Nov 16 14:49 spark-assembly-1.5.2-hadoop2.6.0.jar

Sparkのドキュメントを改めて見ると、確かにそれっぽいことが書いてありました。

  Note that JARs and files are copied to the working directory for
  each SparkContext on the executor nodes. This can use up a significant
  amount of space over time and will need to be cleaned up. With YARN,
  cleanup is handled automatically, and with Spark standalone, automatic
  cleanup can be configured with the spark.worker.cleanup.appDataTtl property.

YARNだと自動的にクリーンアップされると書いてありますね。
このクリーンアップを制御するパラメータを調査したところ、以下のものが該当しそうです。

yarn-default.xml

  <property>
    <description>Interval in between cache cleanups.</description>
    <name>yarn.nodemanager.localizer.cache.cleanup.interval-ms</name>
    <value>600000</value>
  </property>

  <property>
    <description>Target size of localizer cache in MB, per nodemanager. It is
      a target retention size that only includes resources with PUBLIC and
      PRIVATE visibility and excludes resources with APPLICATION visibility
    </description>
    <name>yarn.nodemanager.localizer.cache.target-size-mb</name>
    <value>10240</value>
  </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のログには特にメッセージが出ないようです。
INFOくらい出してくれてもいいかも?

9
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
7