В настоящее время мы развертываем наши приложения Flink в виде толстой банки с использованием плагина maven-shade. Проблема в том, что каждый jar-файл приложения занимает примерно 130–140 МБ, что сложно создавать и развертывать каждый раз. Есть ли способ исключить зависимости и просто развернуть в кластере тонкую банку размером около 50 КБ?
Как использовать тонкую банку вместо толстой?
Ответы (2)
Вы можете заранее разместить JAR-файлы зависимостей в кластере в lib
Flink (см. Избегайте динамической загрузки классов) и просто загружайте тонкий JAR при каждой отправке задания.
Вот как мы это делаем с Gradle!
У нас есть два подпроекта:
job
: для потокового задания, которое мы хотим запуститьruntime
: для дополнительных зависимостей времени выполнения (например, пользовательской реализацииFileSystem
)
Мы создаем новую конфигурацию градиента для зависимостей, которые предоставляются во время выполнения:
configurations {
provided,
compile.extendsFrom provided
}
а затем отметьте предоставленные зависимости как:
provided("org.apache.flink:flink-java:1.6.0") // flink java v1.6.0
Затем мы изменяем задачу jar
, чтобы создать jar без каких-либо provided
зависимостей:
jar {
dependsOn configurations.runtime
from {
(configurations.runtime - configurations.provided).collect {
it.isDirectory()? it : zipTree(it)
}
} {
exclude 'META-INF/*.RSA'
exclude 'META-INF/*.SF'
exclude 'META-INF/*.DSA'
}
manifest {
attributes 'Main-Class': 'com.example.Entrypoint'
}
}
В результате получается jar
с обязательными зависимостями (compile
), которые мы затем развертываем с помощью веб-интерфейса.
Что касается зависимостей настраиваемой среды выполнения, мы создаем настраиваемый образ Docker и помещаем построенный артефакт (runtime.jar
, созданный с использованием той же конфигурации, что и выше) в libs/
directory во Flink. Вы также можете сделать это вручную, если не используете Docker.
И, наконец, в нашем конкретном случае не существует прямой зависимости между нашим заданием и зависимостью времени выполнения (которая обнаруживается с помощью отражения).