Apache Spark: 凄まじい性能はミスると一瞬で身を滅ぼす(手が滑った話)

昔から,超重要なシステムを使っていても,つい手を滑らせることがあるんですよね...
今日は,Hadoopクラスタを一瞬で枯渇させてしまいました.

Hadoopクラスタの全てのマシンで,特にハードディスクのQuotaの設定はしていませんでした.定期的な監視は入っていますし,余裕を持った容量はありますので.

しかしSparkはそれをブチ破る.

Webの莫大なログをアドホックに分析するするつもりでした.hadoopユーザのホームディレクトリにwebというディレクトリを作り,一時間ごとに転送したApache httpdログ形式のテキストファイルが入るようにしました.
/user/hadoop/web/httpd.2014-08-07-10.logみたいな感じ.

それを半年分の1テラバイトくらいをRDDに読み込もうとしました.

scala> sc.textFile("hdfs:/user/hadoop/web/*").collect()

しかし,小規模なデータでデバグしているクセで手が滑って普通に次のように打ち込んでしまいました.

scala> sc.textFile("hdfs:/user/hadoop/web/*").foreach(println)

Scalaでは普通に打ち込むコマンドですが,これはbashの上で打ち込んだコマンドではなく,spark-shell上で打ち込んだコマンドでした.
spark-shellの起動はこんな感じ.

spark-shell --master yarn-client --num-executors 12

結果:
printlnで12台のマシン上の$HADOOP_HOME/logs/userlogs/$アプリID/コンテナIDなど/stdoutに1テラ/12くらいの出力が一瞬で出来かけて,disk usage 100%になって瞬殺になって監視チームから連絡が.

たかが12台くらいの小規模クラスタで良かったです.
コマンドラインの表示も,一瞬で画面が流れるので,気付きませんでした.tmuxのヒストリに残っていたので確認できた感じです.

saveAsTextFileでHDFSに書き出していたら,少なくとも容量オーバーにはならなかったのです.
なんせ画面の更新が遅いのかと思ってキーを叩いたりCTRL-Qを押したりしている間のあっという間だったので,間に合わなかったのです.