Как экстернализовать и загрузить файл свойств из внешнего пути в искровом задании при отправке задания

Я использую java8 и spark 2.4.1 для написания своего искрового задания, в котором я использую TypeSafe для загрузки файла свойств, т.е. application.properties, который находится в папке «ресурсы», содержимое которой приведено ниже.

dev.deploymentMaster=local[8]
dev.spark.eventLog.enabled=true
dev.spark.dynamicAllocation.enabled=false
dev.spark.executor.memory=8g

В программе я загружаю то же, что и ниже, передавая переменную «среда» как «dev» при отправке задания искры, т. Е. Искра-отправить

 public static Config loadEnvProperties(String environment) {
      Config appConf = ConfigFactory.load();
      return  appConf.getConfig(environment);
  }

Выше работает нормально... но этот файл "application.properties" находится внутри папки "resources".

Как я могу передать путь к файлу «application.properties» при отправке из задания spark-submit? Какие изменения мне нужно внести в свой код с помощью TypeSafe? не могли бы вы предоставить образец, если это возможно, в Java?

При загрузке спринта у нас есть что-то, называемое профилированием, например application-dev.properties , application-qa.properties и application-prod.properties и т. д. ... для загрузки этих конкретных свойств среды возможно ли что-то подобное в spark при отправке задания? Если да, не могли бы вы предоставить некоторые подробности или фрагмент, как это сделать?


person BdEngineer    schedule 31.07.2019    source источник


Ответы (1)


но этот файл «application.properties» находится внутри папки «ресурсы».

Как я могу передать путь к файлу «application.properties» при отправке из задания spark-submit?

1) подготовьте сборку maven или затените структуру дистрибутива плагина/sbt как bin для shell скриптов lib для библиотек или uber jar conf для всех файлов конфигурации, таких как application.properties или application.conf

примерная структура дистрибутива:

.
└── yourproject
    ├── bin // all shell scripts and spark-submits
    ├── conf // your property file environment wise
    │   ├── application.conf
    │   └── log4j.properties
    └── lib   // your jars or uber jar

2) подготовьте сценарий оболочки, который примет использование параметра envt, как показано ниже.

Кластер в режиме развертывания:

spark-submit --master yarn --deploy-mode cluster  --num-executors 4 --driver-memory 6g --executor-memory 20g --executor-cores 4 --files conf/application_$env.conf --class yourclass lib/yourjar.jar

Клиент режима развертывания:

spark-submit --master yarn --deploy-mode client --num-executors 4 --driver-memory 6g --executor-memory 20g --executor-cores 4 --files conf/application$env.conf --spark.driver.extraJavaOptions -Dconfig.file=conf/application$env.conf  --spark.executor.extraJavaOptions -Dconfig.file=conf/application$env.conf --class yourclass  lib/yourjar.jar

ваш configfactor.load будет загружаться из этого -Dconfig.file=conf/application$env.conf, но в кластере режима развертывания он может не загружаться из этого системного свойства, поскольку ваш драйвер не является локальным компьютером. это один из узлов в вашем кластере.

-- files передаст ваш файл во временный каталог вашего hdfs. --files вы можете просто ссылаться на имя файла без пути, который вам может понадобиться, чтобы использовать ConfigFactory.parseFile(configFile) вместо ConfigFactory.load() в режиме кластера. так как я заметил, что load загрузка \etc\spark\conf\spark-default.conf как я наблюдал в моем случае.

person Ram Ghadiyaram    schedule 31.07.2019
comment
просто попробуйте этот первый следующий шаг, который вы поймете автоматически. в кластерном режиме Config appConf = ConfigFactory.load(); может не работать. вам нужно передать фактический файл application.conf ... ConfigFactory.parseFile(configFile), так как драйвер будет одним из узлов в кластере, а не вашей локальной машиной - person Ram Ghadiyaram; 31.07.2019
comment
если вы в порядке, пожалуйста, примите ответ как владелец - person Ram Ghadiyaram; 31.07.2019
comment
спасибо, Рам, здесь файл свойств все еще находится внутри банки, т.е. conf/application$env.conf?? могу ли я указать на ./somefolder/application$env.conf ?? - person BdEngineer; 02.08.2019
comment
да, это то, что я говорил, не помещайте файл свойств в банку, см. Плагин сборки maven для интеграции вашего дистрибутива - person Ram Ghadiyaram; 02.08.2019
comment
Ram, я пробовал, как вы предложили, но он не работает. Думаю, я что-то упускаю... Пожалуйста, проверьте здесь один раз stackoverflow.com/questions/57330285/ - person BdEngineer; 02.08.2019
comment
скопируйте файл свойств в hdfs и попробуйте программно получить доступ - person Ram Ghadiyaram; 02.08.2019