Apache Sparkのソースリーディングメモその1

  • 1
    Like
  • 0
    Comment

これは何か

  • ふとしたきっかけからApache Sparkを触ってみたら裏側の仕組みに興味が出たのでソースを分かるところから読んでいったメモです。
  • 何か間違えてたらコメントでご指摘いただけると幸いです :pray:

用意するもの

起動コマンド周り

  • Sparkのソースは巨大で複数のprojectから構成されている
  • 初心者たる私はどこから手を付けてよいか分からない。
  • そのためまずは普段つかっているbin/spark-submitでjobをシングルノードで実行した時に何が起きているかを読んでいく。
  • このqiitaでは主にcore projectのorg.apache.spark.deploy配下を読んでいく。

bin/spark-submit

  • 実行用のshellスクリプト
  • 環境変数 SPARK_HOMEがセットされてなかったらよしなにexportしてから "${SPARK_HOME}"/bin/spark-class org.apache.spark.deploy.SparkSubmit "$@" をexecして終了。
  • 以降の処理は "${SPARK_HOME}"/bin/spark-class に引き継がれる。

bin/spark-class

  • spark-submitで渡された引数に基づいてsparkのジョブを実行する。
  • 手元の環境で適当なjobを実行した時は最終的に以下のコマンドをexecしている。
$ /Library/Java/JavaVirtualMachines/jdk1.8.0_91.jdk/Contents/Home/bin/java \
-cp /Users/seri/Documents/scala-work/spark-2.1.0-bin-hadoop2.7/conf/:/Users/seri/Documents/scala-work/spark-2.1.0-bin-hadoop2.7/jars/* \
-Xmx1g \
org.apache.spark.deploy.SparkSubmit \
--master local[4] \
--class SimpleApp \
target/scala-2.11/spark_sample_2.11-1.0.jar

org.apache.spark.deploy.SparkSubmit

  • 上記のspark-classから実行される

main

    appArgs.action match {
      case SparkSubmitAction.SUBMIT => submit(appArgs)
      case SparkSubmitAction.KILL => kill(appArgs)
      case SparkSubmitAction.REQUEST_STATUS => requestStatus(appArgs)
    }
  • appArgs.actionには、何も指定されなければSUBMITがsetされることがわかるのでsubmitに飛んでみる

submit

  • メソッド冒頭で引数をparseして複数の変数に束縛し(scala界隈でも束縛って言うのかな…まぁいいか)、続いて冒頭にネスト関数が定義されているがとりあえず置いといて処理が始まる部分から読んでいく
  • デフォルトではargs.useRest はtrueになっているので、spark-submitを実行したnodeに入っているsparkがRest導入前のものでなければ何事もなくdoRunMain()が実行されるはず

doRunMain

  • proxyUser がセットされていたら実行ユーザーをセットする?か何かしている分岐が入る。良くわからんので後回し
  • このオプションがなければ runMain が実行される。いよいよjobが実際に実行されそうな名前のメソッドが出てきた。

runMain

  • bin/spark-submit の引数で渡したjarをloadしてmainメソッドを取り出してinvokeしている。至ってシンプル。
  • クラスタを起動してる場合はjobとして指定されたjarファイルをserializeして各クラスタに分散する、みたいなことをここでやるのではと勝手に思っていたがそれはないらしい。
  • まだ読んでないが、おそらくjobのコード中でRDDオブジェクトを作っている場合に各クラスタへのデータとコードの配置が行われるのではないかと考えられる。

次のアクション

  • 実際にjobを実行する段階でsparkが何をしているのかを具体的に見ていきたいのでSparkContextを読む