导入语句需要花费大量时间执行火花执行器(Pyspark执行器)

时间:2018-10-09 07:25:48

标签: apache-spark tensorflow keras pyspark spark-streaming

我正在使用Spark(PySpark)流和Keras开发python预测脚本。该预测发生在我调用model.predict()的执行程序上。

我导入的模块是

from keras.layers.core import Dense, Activation, Dropout 
from keras.layers.recurrent import LSTM 
from keras.models import Sequential

我已经检查过,这些导入在Spark驱动程序(2 cor + 2gb)上加载需要2.5秒。使我感到惊讶的是,每次执行者获得这份工作时,它都会自动再次进行这些导入。我确定每次将作业提交给执行者时都会进行这些导入的原因是,因为我在每个作业的执行者日志中看到以下语句,这些语句仅在我导入上述模块时才会出现。

/opt/conda/lib/python3.6/site-packages/h5py/__init__.py:36: FutureWarning: Conversion of the second argument of issubdtype fromfloattonp.floatingis deprecated. In future, it will be treated asnp.float64 == np.dtype(float).type. from ._conv import register_converters as _register_converters Using TensorFlow backend.

我的目标是在1秒内做出预测,但是导入本身需要2.5秒(每次导入都在spark执行器上进行)。这是预期的行为吗?我能尽力减少这次时间的任何事情是毫秒吗?

更新1

过去几天,我对其进行了分析,发现有两个主要问题。

  1. 我找到了一种包装keras模型并将其腌制在驱动程序上并在执行程序上腌制的方法。这样可以将时间缩短1秒。
  2. 但是在驱动程序上,每批执行mapPartition()时,每次执行器(对于每个作业)每次都要进行整个keras和tensorflow初始化,这需要2.5秒。有没有一种方法可以对每个执行程序而不是对每个作业初始化一次导入。可能是pyspark中的一些文件,我可以在其中放置这些导入文件(假设这些文件在执行程序出现时执行一次)

0 个答案:

没有答案