新しい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のターンアラウンドタイム?
ほとんどすべての芸術私が遭遇したスパークのパフォーマンスに関するアイディア/ビデオ/ディスカッションでは、重い作業が重視されていました。上記の「列車モデル」タスクは実際には「重い」ものかもしれません。しかし、「単一のインスタンスの予測を要求する」必要があります。
誰でも手助けできますか?
ありがとうございます。
コリン・ゴールドバーグ
お返事ありがとうございます。現時点では、ストリーミングデータが適用されるかどうかはわかりませんが、これが要因になることがあります。私はPMMLとMLeapをスピードアップする必要があります。 –