Почему производительность скрипта pyspark не улучшается с увеличением количества ядер и исполнителей?

#performance #apache-spark #pyspark

#Производительность #apache-spark #pyspark

Вопрос:

У меня есть скрипт для двоичной классификации путем загрузки предварительно обученной модели. Интересно, почему, когда я пробую разные комбинации num-executors и executor-core, я всегда получаю примерно одинаковую производительность. Вот важные строки в моем скрипте pyspark:

 start = time.time()

# extract evaluation pairs
#
aug_comb_mldf =  dfml_partial.select('eventId').crossJoin(df_id_zero_aug.select('eventId').withColumnRenamed('eventId', 'eventIde'))

pt1 = time.time()

# feature enigineering
#
feats_titles = ["feat1f", "feat2f", "feat3f",
                "feat4f", "feat5f", "feat6f"]
augfldf = aug_comb_mldf.join(dfml_partial.withColumnRenamed('eventId', 'eventId').alias('a'), ['eventId'], 'inner') 
   .join(dfallaug.withColumnRenamed('eventId', 'eventIde').drop('id').alias('b'), ['eventIde'], 'inner')
   .withColumn('feat1f', when(expr('a.feat1 = b.feat1'), 1).otherwise(0))
   .withColumn('feat2f', when(expr('a.feat2 = b.feat2'), 1).otherwise(0))
   .withColumn('feat3f', when(expr('a.feat3 = b.feat3'), 1).otherwise(0))
   .withColumn('feat4f', when(expr('a.feat4 = b.feat4'), 1).otherwise(0))
   .withColumn('feat5f', when(expr('a.feat5 = b.feat5'), 1).otherwise(0))
   .withColumn('feat6f', when(expr('a.feat6 = b.feat6'), 1).otherwise(0))
   .select(feats_titles)

pt2 = time.time()

# Make predictions.
#
aug_predictions = model.transform(augfldf)

pt3 = time.time()

aug_predictions_true = aug_predictions.select("eventId", "eventIde", "id", "probability")
aug_predictions_true = aug_predictions_true.filter((aug_predictions.predictedLabel != '0'))

# find highest prob
#
w=Window().partitionBy("eventIde")

aug_predictions_true = aug_predictions_true.withColumn("rank", row_number().over(w.orderBy(desc("probability"))))
        .filter(col("rank")==1)
        .drop("rank")

pt4 = time.time()

print ("pt1-start = ", pt1-start)
print ("pt2-start = ", pt2-pt1)
print ("pt3-start = ", pt3-pt2)
print ("pt4-start = ", pt4-pt3)
print ("total = ", pt4-start)
 

Вот производительность:

 ('pt1-start = ', 0.034136056900024414)
('pt2-start = ', 0.41227102279663086)
('pt3-start = ', 0.12337303161621094)
('pt4-start = ', 0.1068110466003418)
('total = ', 0.676591157913208)
 

Вот как я запускаю этот скрипт:

 spark-submit --master yarn myapp.py --num-executors 16 --executor-cores 4 --executor-memory 12g --driver-memory 6g
 

Я запустил spark-submit с другой комбинацией из четырех конфигураций, которые вы видите, и я всегда получаю примерно одинаковую производительность.

Ответ №1:

Это —executor-core означает количество параллельных потоков, которые он будет запускать внутри исполнителей. Но в python нет понятия потоковой передачи из-за GIL (глобальная блокировка интерпретатора), поэтому он не будет запускать параллельные потоки.

Поэтому, чтобы повысить производительность вашей среды выполнения, я бы предложил играть с большим количеством исполнителей вместо увеличения количества ядер.

Комментарии:

1. Спасибо за ваш ответ. Моя проблема заключается в том, что при увеличении количества ядер производительность не улучшается.