📝

Apache SparkのSparkContextについて

2022/02/11に公開

SparkContextを理解していなかったので調べてみた。

Cluster Modeの概要のページにdriver programなど用語が書いてある。

https://spark.apache.org/docs/latest/cluster-overview.html

Spark applications run as independent sets of processes on a cluster, coordinated by the SparkContext object in your main program (called the driver program).

SparkContextは、メインプログラムのオブジェクト(正確にはクラス群)であり、1つのクラスターの中で複数の独立したプロセスが動作するように調整しているもの。

Specifically, to run on a cluster, the SparkContext can connect to several types of cluster managers (either Spark’s own standalone cluster manager, Mesos, YARN or Kubernetes), which allocate resources across applications. Once connected, Spark acquires executors on nodes in the cluster, which are processes that run computations and store data for your application. Next, it sends your application code (defined by JAR or Python files passed to SparkContext) to the executors. Finally, SparkContext sends tasks to the executors to run.

  • SparkContextは、Clusterマネージャーと接続可能で、アプリケーション内の資源の割り当てを行う。
  • SparkはClusterマネージャーを介して各ノード(Cluster1つ1つのこと)でexecutorsを取得する。executorsは、計算処理をし、データを保存する処理を担う。
  • JARやPythonなどの実行バイナリもしくはファイルを、executorsに送信し、SparkContextはタスクをexecutorsに送り、実行。

Clusterマネージャーというのは、MesosYARN, Kubernetesなどのことを指す。

https://spark.apache.org/docs/latest/cluster-overview.html#cluster-manager-types

技術的な詳細の違いはよくわからないが、物理的に異なる実行環境の、複数のコンピューティング環境を管理するものと理解している。

SparkContextは実際的には、RDD(Resilient Distributed Dataset)を作成するものらしい。RDDは、Sparkで操作されるデータの実体のようなもので、RDDを操作するAPIがSparkには色々用意されている。開発者はそのAPI経由であれば、裏側の分散処理がどう行われているかを気にすることなく、データ処理ができる。

まとめると

  • SparkContextはメインプログラムで呼び出されるもので、Apache Sparkのentry pointととなるもの。

  • メインプログラムで呼び出されるSpark contextは、Cluster マネージャーと接続し、Sparkで実行されるjobを管理(資源の割り当て、スケジュールなど)する。

SparkSessionについて

SparkContextとは別にSparkSessionというのがSpark 2.0から導入されたようだ。
これはなんだろうか。

from pyspark.sql import SparkSession
spark = SparkSession \
    .builder \
    .appName("hoge") \
    .getOrCreate()

SparkSessionは以下のコンテキストを隠蔽する。

  • Spark Context
  • Hive Context
  • SQL Context

上記の異なる3つのコンテキストを統合するため、開発者はコンテキストの違いを気にかけることなく利用できる。

Spark shell、これはCLIから操作するSparkの入力方法だが、sparkとしてdefaultで用意されている。

Spark ContextとHive Contextなど

これはどういうものなのか調べてみる。

Hive Contextは、Sparkの操作をHiveQLで行う時に利用する。SQLContextを拡張したもの(継承)で、SQLContextの機能を全て持っている。
SQL Contextは、Sparkの操作をSQLで行う時に利用する。こちらもSQLContextを拡張したもの。

In addition to the basic SQLContext, you can also create a HiveContext, which provides a superset of the functionality provided by the basic SQLContext. Additional features include the ability to write queries using the more complete HiveQL parser, access to Hive UDFs, and the ability to read data from Hive tables. To use a HiveContext, you do not need to have an existing Hive setup, and all of the data sources available to a SQLContext are still available. HiveContext is only packaged separately to avoid including all of Hive’s dependencies in the default Spark build. If these dependencies are not a problem for your application then using HiveContext is recommended for the 1.3 release of Spark. Future releases will focus on bringing SQLContext up to feature parity with a HiveContext.

https://spark.apache.org/docs/1.6.1/sql-programming-guide.html#starting-point-sqlcontext

これらのContextもSpark 2.0ではSparkSessionというより使いやすいものが登場したので使うことはないだろう。

参考

Discussion