Flink: Как использовать тонкую банку вместо толстой?
В настоящее время мы развертываем наши приложения Flink в виде толстой фляги с помощью плагина maven-shade-plugin. Проблема в том, что каждая фляга приложения в итоге занимает примерно 130-140 МБ, что каждый раз создает и развертывает. Есть ли способ исключить зависимости и просто развернуть тонкий кластер в кластере размером около 50 КБ?
2 ответа
Вы можете поместить JAR-файлы зависимостей в кластер заранее в Flink's lib
(см. Избегайте динамической загрузки классов) и просто загружайте тонкий JAR при каждой отправке задания.
Вот как мы это делаем с Gradle!
У нас есть два подпроекта:
job
: Для потоковой работы, которую мы хотим запуститьruntime
: Для дополнительных зависимостей во время выполнения (например,FileSystem
реализация)
Мы создаем новую конфигурацию Gradle для зависимостей, которые предоставляются во время выполнения:
configurations {
provided,
compile.extendsFrom provided
}
и затем пометьте предоставленные зависимости как:
provided("org.apache.flink:flink-java:1.6.0") // flink java v1.6.0
Затем мы модифицируем 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/
каталог во Флинке. Вы также можете сделать это вручную, если не используете Docker.
И, наконец, в нашем конкретном случае не существует прямой зависимости, определенной между нашей работой и зависимостью времени выполнения (которая обнаруживается с помощью отражения).