spark.lapply を使用して R コードを並列化する方法How To parallelize R code with spark.lapply

R コードの並列化は、ドライバーと R データに対して実行されるため、困難です。フレームは配布されません。Parallelization of R code is difficult, because R code runs on the driver and R data.frames are not distributed. 多くの場合、ローカルで実行され、Apache Spark で実行するように変換される既存の R コードがあります。Often, there is existing R code that is run locally and that is converted to run on Apache Spark. それ以外の場合、高度な統計分析や機械学習手法で使用される一部の SparkR 関数は、分散コンピューティングをサポートしていない可能性があります。In other cases, some SparkR functions used for advanced statistical analysis and machine learning techniques may not support distributed computing. このような場合は、SparkR UDF API を使用して、クラスター全体に必要なワークロードを分散することができます。In such cases, the SparkR UDF API can be used to distribute the desired workload across a cluster.

ユースケースの例: 同じデータで複数の機械学習モデルをトレーニングする場合 (ハイパーパラメーターのチューニングなど)。Example use case: You want to train multiple machine learning models on the same data, for example for hyper parameter tuning. データセットが各ワーカーに適している場合は、SparkR UDF API を使用して、モデルの複数のバージョンを一度にトレーニングする方が効率的な場合があります。If the data set fits on each worker, it may be more efficient to use the SparkR UDF API to train several versions of the model at once.

spark.lapply関数を使用すると、要素のリストに対して関数を実行することで、複数のワーカーで同じタスクを実行できます。The spark.lapply function enables you to perform the same task on multiple workers, by running a function over a list of elements. リスト内の要素ごとに、次のようにします。For each element in a list:

  1. 関数をワーカーに送信します。Send the function to a worker.
  2. 関数を実行します。Execute the function.
  3. すべてのワーカーの結果をリストとしてドライバーに返します。Return the result of all workers as a list to the driver.

次の例では、サポートベクターマシンモデルが iris 3 フォールドクロス検証を使用してデータセットに適合しますが、コストは0.5 から 1 0.1 ずつ増加します。In the following example, a support vector machine model is fit on the iris dataset with 3-fold cross validation while the cost is varied from 0.5 to 1 by increments of 0.1. 出力は、さまざまなコストパラメーターのモデルの概要を一覧にしたものです。The output is a list with the summary of the models for the various cost parameters.


spark.lapply(seq(0.5, 1, by = 0.1), function(x) {
  model <- svm(Species ~ ., iris, cost = x, cross = 3)


すべてのワーカーにパッケージをインストールする必要があります。You must install packages on all workers.