Как использовать тонкую банку вместо толстой?

В настоящее время мы развертываем наши приложения Flink в виде толстой банки с использованием плагина maven-shade. Проблема в том, что каждый jar-файл приложения занимает примерно 130–140 МБ, что сложно создавать и развертывать каждый раз. Есть ли способ исключить зависимости и просто развернуть в кластере тонкую банку размером около 50 КБ?


person Harshith Bolar    schedule 03.10.2018    source источник
comment
Да, просто не имейте никаких зависимостей (кроме зависимостей ядра flink), тогда ваш fat-jar будет меньше. Если у вас есть требуемые зависимости, вам нужно включить их. Как еще они оказались бы в контейнере flink?   -  person Erwin Bolwidt    schedule 03.10.2018


Ответы (2)


Вы можете заранее разместить JAR-файлы зависимостей в кластере в lib Flink (см. Избегайте динамической загрузки классов) и просто загружайте тонкий JAR при каждой отправке задания.

person gcandal    schedule 03.10.2018
comment
Могу ли я удалить все мои классы из файлов толстых jar, затем поместить их в каталог lib и запустить Flink с моими тонкими файлами jar? - person Averell; 27.04.2019

Вот как мы это делаем с 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.

И, наконец, в нашем конкретном случае не существует прямой зависимости между нашим заданием и зависимостью времени выполнения (которая обнаруживается с помощью отражения).

person riyaz-ali    schedule 09.10.2018