2017-10-30 5 views
0

新しいspark/pysparkユーザーとして、(テスト目的で)ローカルモードでAWS t2.small ec2インスタンス上でスクリプトを実行しています。基本的なpysparkステートメントを高速化する方法

ie。このよう火花= SparkSessionなどの基本的なスパークステートメントの速度に関する、私の質問に注力するように、私はコードを残してきた

from __future__ import print_function 
from pyspark.ml.classification import NaiveBayesModel 
from pyspark.ml.evaluation import MulticlassClassificationEvaluator 
from pyspark.sql import SparkSession 
import ritc (my library) 
if __name__ == "__main__": 
    spark = SparkSession\ 
     .builder\ 
     .appName("NaiveBayesExample")\ 
     .getOrCreate() 
    ... 
    request_dataframe = spark.createDataFrame(ritc.request_parameters, ["features"]) 
    model = NaiveBayesModel.load(ritc.model_path) 
    ... 
    prediction = model.transform(ritc.request_dataframe) 
    prediction.createOrReplaceTempView("result") 
    df = spark.sql("SELECT prediction FROM result") 
    p = map(lambda row: row.asDict(), df.collect()) 
    ... 

...

日時ライブラリ(ではないの使用:例として、私は3つの最大の「犯人」のタイミングを持っています:

'spark = SparkSession...' -- 3.7 secs 
'spark.createDataFrame()' -- 2.6 secs 
'NaiveBayesModel.load()' -- 3.4 secs 

なぜこれらの時間が長すぎますか?

少し背景を述べると、上記のようなスクリプトをRESTサービスとして公開する機能を提供したいと思います。

In supervised context: 
- service #1: train a model and save the model in the filesystem 
- service #2: load the model from the filesystem and get a prediction for a single instance 

(注意:#2 REST要求が異なる時に実行され、予期しない(ランダム)倍となる一般的なパターンは次のようになります。 - >一回:モデルを訓練 - 長いターンアラウンドタイム を期待 - >複数回:単一インスタンスの予測を要求 - ターンアラウンド時間(ミリ秒単位) - たとえば、< 400 ms

私の考えには欠陥がありますか?この目標を達成するためには、第2のターンアラウンドタイム?

ほとんどすべての芸術私が遭遇したスパークのパフォーマンスに関するアイディア/ビデオ/ディスカッションでは、重い作業が重視されていました。上記の「列車モデル」タスクは実際には「重い」ものかもしれません。しかし、「単一のインスタンスの予測を要求する」必要があります。

誰でも手助けできますか?

ありがとうございます。

コリン・ゴールドバーグ

答えて

0

のでApacheSparkは、この方法で使用するように設計されています。予測のためにストリーミング入力データを処理することを目標とする場合は、Spark Streamingを参照することをお勧めします。また、PMMLやMLeapのようなSparkモデルを扱うための他のオプションを調べることもできます。

+0

お返事ありがとうございます。現時点では、ストリーミングデータが適用されるかどうかはわかりませんが、これが要因になることがあります。私はPMMLとMLeapをスピードアップする必要があります。 –

関連する問題