Ну, если говорить про спарк, то ± понятно, в порядке убывания импакта причины следующие:
1. Стык Python/C при вызове «пакетной» функции для каждого ряда
2. Стык Scala/Python
3. Интерпретатор Python
Ну, по опыту собеседований, Java разработчики, которые могут написать не только hello world на Scala, на рынке есть. Они стоят дороже питонистов, но при этом результат который они создадут будет куда как надежнее чем поделка среднестатистического питониста. К сожалению, средний уровень базовых программистких скилов в среде питонистов существенно ниже… В том числе из-за набежавших на хайп «датасаентистов тюню xgboost за 300 к/c».
Работа в спарке с текстам делается обычно через переход к колонке-вектору (sparse разумеется) — соответственно все нужные утилиты типа TF-IDF, CountVectorizer, работ с N-gram и т.д. присутствуют. А датафреймы с очень большим количеством колонок он не любит, так как в памяти и при шафле все равно формат рядный, да еще и плотный.
Ну тут дело в том, что часто расспределение времени работы между питоном и «бэкендом» 1/999. Например, когда тренируем нейросетку, или когда работаем со спарком, но в рамках Spark SQL. В таких задачах все работает максимально быстро. Но как только баланс работы смещается хотя бы к 1/9 уже становится заметна разница.
Сравнивать локальный алгоритм в памяти и расспределенный на кластере нестоит — локальный почти всегда выиграет. Но вот вопрос насколько много R в разных вариантах дает оверхеда при использовании UDF открытый (при использовании стандартных конструкций транслирующихся в Spark SQL все понятно). Если кто-то погоняет бенчмарк будет круто.
В плане производительности и Java, и Scala в спарке одно и тоже. АПИ более заточен под Scala, но из Java тоже можно пользовать. Про write-only код согласен полностью, Scala требует куда большей ответственности.
Но если брать Spark, то без скалиста все-таки никуда — надо уметь же внутрь залезть и разобратся почему что не работает и как сделать чтобы заработало. Не важно на чем клиент.
Это хорошо может помочь если действительно можно реализовать udf без pandas.apply внутри, на стандартных функциях. Но тогда не очень понятно зачем UDF — базовых функций и в Spark SQL много. Но в нашем случае надо выполнить некоторую логику именно для каждого ряда — с Arrow будет не в 7-8 раз разница, а в 3-4, если без скайлерна, а с ним мрак по любому. Попробую погонять отдельно.
Накладные расходы. Нам, например, нужно уметь получать тысячи скоров за десятки миллисекунд, поэтому самые критичные блоки работают без REST, а, в идеале, вообще без удаленных вызовов. Хотя при желании многое можно порешать собирая задачи в пакеты.
Нет, внутри была только интерпретация дерева XGBoost-а, параллельность была на уровне вызывающих. Вердикт — то, во что JPPML превращает XGBoost не юзабельно (700мс на скоринг 1000 объектов).
UPD: Если убрать использования sklearn, то скорость сопоставима. При этом производительность sklearn самого по себе в этом аспекте на уровне.
Вывод такой — Spark умеет UDF до определнной сложности (пока не появляется дополинетльных пакетов) умеет транслировать и запускать почти без оверхеда. Но при появлении использования расширенных пакетов фолбэчится на Python.
1. Стык Python/C при вызове «пакетной» функции для каждого ряда
2. Стык Scala/Python
3. Интерпретатор Python
Попробовал с PyPy — 55 секунд Python, 30 секунд PyPy, 7 секунд Scala. Т.е. разница уже не 7-8 раз, а всего 4-5 раз :)
Ну а появился в 2016 потому что до этого нормальной поддержки не было, SparkR появился в 1.4, это июнь 2015-го.
Характер у сестер, конечно, разный, но с любой можно найти общий язык и жить долго и счастливо. Даже выбирать не надо — вместе хорошо уживаются :)
Но если брать Spark, то без скалиста все-таки никуда — надо уметь же внутрь залезть и разобратся почему что не работает и как сделать чтобы заработало. Не важно на чем клиент.
Пока идет процесс подсчета Python честно жжет киловаты на всех 4-х ядрах, в GIL не упирается:
![](https://habrastorage.org/webt/7h/h5/vi/7hh5vix5gwzgibisi7w0ry_nkjg.png)
В итоге — PySpark 1 минута 38 секунд, обычный Spark — 2 секунды:
![](https://habrastorage.org/webt/xd/br/r3/xdbrr3otn9dno8jjqe96-9kkwzo.png)
«Доктор, что я делаю не так?»
UPD: Если убрать использования sklearn, то скорость сопоставима. При этом производительность sklearn самого по себе в этом аспекте на уровне.
Вывод такой — Spark умеет UDF до определнной сложности (пока не появляется дополинетльных пакетов) умеет транслировать и запускать почти без оверхеда. Но при появлении использования расширенных пакетов фолбэчится на Python.