Pull to refresh

Comments 13

Спасибо за статью!

Что дальше и можно ли что-то улучшить..:

...

  1. "Немножко" над clean code поработать, чтобы этим кодом можно было пользоваться больше одного раза.

>Big Data Tool Apache Spark в Docker-контейнерах,
Знаете, что мне осталось сразу не очень понятным? Spark хорош в ситуации легкого масштабирования, например при наличии ярн кластера, ну и хотя бы сотни-тысячи ядер. У вас, как я понимаю, два узла (ядер соответственно скорее всего штук 20?), а сколько в наличии GPU вообще как-то не уловилось. В чем был смысл смешивать спарк и докер? Чтобы запуститься под windows (потому что драйверы для нужных GPU не работают в линуксе?

Драйверы для всех GPU имеются для линукса. У меня есть доступ только к виндовым машинам, линукс накатить нет возможности, а VMWare и VirtualBox не позволяют проводить такие манипуляции с GPU, остался вариант только с WSL.GPU в наличии по одному на каждой машине: 2060, 1650; с возможностью добавить на одну из машин 1080 Ti.

Вторая причина кроется в варианте использования той же DJL без Spark, но на GPU.

Третья причина (сейчас будет дилетантское суждение, так как изучил вопрос лишь поверхностно) - образ воркера для Kubernetes Operator должен содержать необходимый JVM, либы и скрипт обнаружения ресурсов, то есть все равно пришлось бы делать образ.

А так - да, Standalone кластер в докере - оверхэд и не нужно, для Yarn-Mesos слишком мало машин и ресурсов, а до кубера на винде я пока еще не дошел, и вряд ли дойду :)

Понятно. Ну тогда да, такое решение хоть и странное немного, на первый взгляд, но под эти условия наверное логичное. Главное — работает)
>неплохо бы подключить Kryo serializer. Во время работы с Rapids 22.06.0 у меня он так и не заработал.
Не очень представляю, как вам такое удалось :) Там конечно есть (с десяток наверное) параметров настройки, но мы как в начале их настроили, так только размеры буфера иногда крутим, когда очень широкие таблицы попадаются под руку. А вот настройка производительности, это да, это тема неисчерпаемая.

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

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

Дело обстоит следующим образом:

Подключение Kryo в случае с Rapids:

.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer") 
.set("spark.kryo.registrator", "com.nvidia.spark.rapids.GpuKryoRegistrator")
.set("spark.kryo.registrationRequired", "true")
.registerKryoClasses(new Class<?>[]{LongValue.class})

Вызываем метод http://localhost:9090/gpu_test, получаем:

org.apache.spark.SparkException: Job aborted due to stage failure: Failed to serialize task 0, not attempting to retry it. Exception during serialization: java.io.IOException: java.lang.IllegalArgumentException: Class is not registered: org.apache.spark.sql.catalyst.InternalRow
Note: To register this class use: kryo.register(org.apache.spark.sql.catalyst.InternalRow.class);

Предвидя следующую ошибку, сразу указываем InternalRow[]:

.registerKryoClasses(new Class<?>[]{InternalRow.class, InternalRow[].class, LongValue.class})

При вызове http://localhost:9090/gpu_test получаем:

Request processing failed; nested exception is org.apache.spark.SparkException: Job aborted due to stage failure: Task 0 in stage 0.0 failed 4 times, most recent failure: Lost task 0.3 in stage 0.0 (TID 6) (172.17.0.5 executor 0): java.lang.IllegalStateException: unread block data

В логах экзекутора:

22/08/01 17:16:10 ERROR Utils: Exception encountered
org.apache.spark.SparkException: Failed to register classes with Kryo
...
Caused by: java.lang.ClassNotFoundException: com.mlwebservice.model.LongValue
	at java.net.URLClassLoader.findClass(URLClassLoader.java:387)

Решение пока не нашел.

Хм. Выглядит как ClassNotFoundException :) Попробуйте прописать spark.executor.extraClassPath — скорее всего нужные jar просто не попали туда.

Вот только если extraClassPath попробовать, так как при старте драйвер отправляет джарник с классом на воркер, иначе бы джоба не поехала; и в логах экзекутора соответствующая запись имеется:

INFO Utils: Fetching spark://172.17.0.6:33139/jars/service.jar to /tmp/spark-cc20e07c-527f-416a-95a7-479a902201fe/executor-04e6f504-1930-43ac-a872-8a7202e64589/spark-c043a020-cc10-410c-8988-371a1c33ffe4/fetchFileTemp8189536983640938756.tmp

Вернусь с результатами так же в коменты, спасибо!

Буду рад, если принесла пользу :)

Sign up to leave a comment.

Articles