У меня есть вопрос о запуске PySpark на сервере - PullRequest
0 голосов
/ 30 октября 2019

Резюме:

  • Я создал конвейер машинного обучения, в котором я использую функциональность pandas_udf для обучения XGBoost моделей. Время обучения модели на моей локальной машине составляет 20-25 минут, тогда как когда я запускаю ее на Red Hat , время обучения уходит до 4 часов, при этом все остальные факторы, такие как среда, остаются неизменными. То, что мы смогли воспроизвести, запустив код на разных серверах, выглядит следующим образом:

    • Если Task имеет уровень локальности PROCESS_LOCAL, он завершается очень быстро независимо оттот факт, что мы запускаем его (локально или на сервере), но если locality задания равно ANY, то время, необходимое для его выполнения в Red Hat, очень велико по сравнению с моим локальным компьютером. Например - выполнение задачи с локальностью ANY на моем локальном компьютере может занять 2 или 3 секунды, но задача с таким же уровнем локальности в Red hat будет где-то около 15-20 минут.

      ПРИМЕЧАНИЕ : Task в вышеприведенном пункте относится к процессу обучения моделей XGBoost с использованием функциональности pandas_udf

    • На основании других задержек, которые мы видели, плюс вышеупомянутыепроблема, заставила нас сделать вывод, что в Red Hat происходит какая-то проблема ввода-вывода или проблемы с сетью. Потому что, когда модели проходят обучение, и если я использую htop, это показывает мне, что все ядра используются и процесс запущен.


  • Мы будем очень признательны за любые рекомендации или помощь по приведению времени выполнения на сервере в соответствие с моим локальным. Если требуется какая-либо другая информация, пожалуйста, дайте мне знать.


ENV и PySpark Config

pandas  :    0.25.1
pyspark :    2.4.3
pyarrow :    0.13.0
def create_spark_session():
    conf = SparkConf() .set('spark.driver.extraClassPath', os.environ['ANALYTICS'] +
                            '/mysql-connector-java-8.0.17/mysql-connector-java-8.0.17.jar') \
        .set('spark.executor.extraClassPath', os.environ['ANALYTICS'] +
             '/mysql-connector-java-8.0.17/mysql-connector-java-8.0.17.jar')\
        .setAppName("APP") \
        .setMaster("local[*]") \
            .set("spark.network.timeout", '3s') \
        .set('spark.executor.memory', '6g') \
        .set('spark.driver.memory', '6g')\
        .set('spark.executor.heartbeatInterval', '2s') \
        .set("spark.sql.execution.arrow.enabled", "true") \
        .set('spark.default.parallelism', 32)

    spark = SparkSession \
        .builder \
        .config(conf=conf) \
        .getOrCreate()
    sc = spark.sparkContext
    sc.setLogLevel("DEBUG")

    return spark

MacOs Config

enter image description here

Red Hat Config

enter image description here

...