2facebook0twittertはてぶ2こんにちは。Sparkはいわゆる「スケーラブルな汎用分散処理エンジン」なのですが、実際にはユーザの利用形態はSQLに関する処理や、機械学習などのデータ分析関連に偏っているように思えます。用途の幅が広がるのではないかなと思います。Sparkで並列化してみます。そもそもどんなところで並列処理は使用されているのか一般的に並列処理が使用されているのはいわゆるスパコンの分野です。いった用途に利用されているようです。いうソフトウェアは有限要素解析を行うことができるソフトウェアですが、応用分野としては弾性解析(どれくらいの圧力をあたえるとどの程度物体が歪むか)などがあり、自動車の車体の強度(例えばハンドルを切った時にどの程度車体が"よれる"か、など)や、タイヤの材料の解析(例えばブレーキをかけた時にどの程度路面との間に摩擦が生じるか、など)などに利用されています。身近なところではゲームの3次元グラフィックスにも並列処理が活用されています。人間が目で見ることのできる画面が、実際にはどの色で塗りつぶされるべきか1ピクセルづつ計算しながら高速に描画されています。画面上の全てのピクセルを高速に塗りつぶすために、GPUを使用した並列計算が活用されています。使用して並列化してみます。レイトレーシングは上記に述べた3次元グラフィックスを描画する方法の一つで、比較的並列処理に向いているので今回使用してみます。)のプログラムを改変前のプログラムとして使用します。実行してみると以下のような画像が生成されます。このプログラムは特に並列処理されておらず、シングルコアを使用した1プロセスで実行されます。実際には画像の左上から右下まで1ピクセルづつ全く同じ処理を繰り返しています。同時に同じ処理を複数のピクセルに対して実行できれば、並列化による高速化が期待できます。Dataset)が分散処理のためのデータの単位になります。RDDはざっくり言うと、配列を任意の単位で区切ったもので、RDD単位で別のプロセス、別のノードで処理を行うことができます。処理された結果もまた別のRDDに格納され、後段の処理にまわすことができます。http://datastrophic.io/core-concepts-architecture-and-internals-of-apache-spark/今回は1ピクセルを処理するためのデータをRDD化し、一律に同じ処理を実行し、結果を結合するようにします。元のプログラムを見ると、いくつかグローバル変数が適されており、複数の関数から参照されています。Sparkでは基本的には全ての関数から共有できるグローバル変数を許しておらず、変数はそれぞれの関数の中で完結していることが必要です。いう関数を作り、変数と処理を移動します。変更したものが以下のコードになります。変数を引数としてそれぞれの関数に渡すただしStep-1の変更によってエラーが出るようになってしまいました。関数の中のローカル変数となったことにより、別の関数から参照できなくなってしまったことが原因です。ここではグローバル変数を参照するのではなく、関数を呼び出す時に引数として変数の内容を渡すようにします。変更したものが以下のコードになります。関数を定義することができます。関数を使用して並列化するため、呼び出し先の関数を定義します。先ほどこのレイトレーシングプログラムは1ピクセルづつ同じ処理を実行していると書きました。その部分が以下の内容です。変更したものが以下のソースコードになります。入力値をRDD化し、並列実行するプログラム側で並列化の準備ができました。最後に入力データをRDD化します。入力値は以下の部分で作成されています。depth_max)RDDは配列から簡単に作成することができます。ループから処理する関数を呼び出す代わりに、入力値の配列を作成するようにします。以下のように変更しました。rays.tar.append(in_param)入力値の配列ができたらRDD化します。指定していますが、必須ではありません。配列として取得します。inrdd.map(genpix).collect()変更したものが以下のものになります。https://github.com/m-kiuchi/cllab181217-spark/blob/master/raytracing-5.pySpark化による並列化の速度向上を検証するさて、並列化によって速度はどの程度向上したでしょうか。実行時間を比較してみます。0m1.464s・・・なんかあまり速くなった気がしません。Sparkのオーバーヘッドがそれなりにあるので並列化による恩恵を余り受けられていないのかもしれません。変更してもう一度試してみます。0m5.487s30%ほど高速化できました。上記はCPU4コア、メモリ8GBのパソコンでやった結果です。CPUコア数やメモリ量を増やして変化を見てみました。パソコンで実行した結果です。0m5.899s強烈に高速化できました。まとめていますので参考になれば幸いです。LABの情報を逃さずチェックしよう!メールアドレスを登録すると記事が投稿されるとメールで通知します。※登録後メールに記載しているリンクをクリックして認証してください。2017′′に弊社の木内が登壇いたします。LABの情報を逃さずチェックしよう!メールアドレスを登録すると記事が投稿されるとメールで通知します。※登録後メールに記載しているリンクをクリックして認証してください。