fbpx

CL LAB

HOME > CL LAB > Spark > (Japanese text only.) 普通のPythonスクリプトをSpark化してお手軽並列処理する #spark

(Japanese text only.) 普通のPythonスクリプトをSpark化してお手軽並列処理する #spark

 ★ 0

= 0
Q[:2] = (x, y)
D = normalize(Q - O)
depth = 0
rayO, rayD = O, D
reflection = 1.
in_param = {
(略)
}
# Loop through initial and secondary rays.
ret = genpix(in_param, depth, depth_max)


<br />RDDは配列から簡単に作成することができます。そこで上記の2段の for ループから処理する関数を呼び出す代わりに、入力値の配列を作成するようにします。以下のように変更しました。

```python
tar = []
for i, x in enumerate(np.linspace(S[0], S[2], w)):
    if i % 10 == 0:
        print("{0:.2f}%".format(i / float(w) * 100))
    for j, y in enumerate(np.linspace(S[1], S[3], h)):
        (略)
        in_param = {
            (略)
        }
        # Loop through initial and secondary rays.
        tar.append(in_param)

入力値の配列ができたらRDD化します。 配列をRDD化するには SparkContext の parallelize() を呼び出します。オプションで numSlices を指定していますが、必須ではありません。


from pyspark import SparkContext
from pyspark.sql import SparkSession

def main():
    (略)
    sc = SparkContext()
    inrdd = sc.parallelize(tar, numSlices=100)

作成したRDDに対して map() 関数を実行し、結果を Python の配列として取得します。


    inrdd = sc.parallelize(tar, numSlices=100)
    retar = inrdd.map(genpix).collect()

変更したものが以下のものになります。

https://github.com/m-kiuchi/cllab181217-spark/blob/master/raytracing-5.py

Spark化による並列化の速度向上を検証する

さて、並列化によって速度はどの程度向上したでしょうか。実行時間を比較してみます。


[変更前]
$ time python3 ./raytracing.py
(略)
real    0m21.130s
user    0m20.941s
sys 0m0.332s

[Spark版]
$ time ~/spark/bin/spark-submit ./raytracing-5.py
(略)
real    0m20.398s
user    0m19.444s
sys 0m1.464s

・・・なんかあまり速くなった気がしません。Sparkのオーバーヘッドがそれなりにあるので並列化による恩恵を余り受けられていないのかもしれません。出力画像サイズを 幅400px x 高300px から、HDサイズの 幅1980px x 高1080px に変更してもう一度試してみます。


[変更前]
$ time python3 ./raytracing.py
(略)
real    5m38.236s
user    5m36.490s
sys 0m0.518s

[Spark版]
$ time ~/spark/bin/spark-submit ./raytracing-5.py
(略)
real    4m9.103s
user    1m21.582s
sys 0m5.487s

30%ほど高速化できました。上記はCPU4コア、メモリ8GBのパソコンでやった結果です。CPUコア数やメモリ量を増やして変化を見てみました。以下の結果は CPU16コア, 16GB のパソコンで実行した結果です。


[変更前]
$ time python3 ./raytracing.py
(略)
real    5m22.154s
user    5m21.189s
sys 0m1.137s

[Spark版]
$ time ~/spark/bin/spark-submit --conf spark.driver.memory=11G ./raytracing-5.py
(略)
real    1m26.337s
user    0m59.485s
sys 0m5.899s

強烈に高速化できました。最高ですね!

さいごに

データ分析に限らない Apache Spark の「スケーラブルな汎用分散処理エンジン」の側面がなんとなく伝わればうれしいです! では!

CL LAB Mail Magazine

CL LABの情報を逃さずチェックしよう!

メールアドレスを登録すると記事が投稿されるとメールで通知します。

メールアドレス: 登録

※登録後メールに記載しているリンクをクリックして認証してください。

Related post