Вы можете последовательно запустить несколько заданий зажигания на одном EMR, то есть следующее задание будет запущено после завершения предыдущего.Это делается с помощью EMR шагов .
Я использовал Java SDK для запуска этого, но вы можете увидеть в этой документации как добавить шаг, используя только CLI .
Мой код ниже использует spark-submit,но он не запускается напрямую, как в CLI.Вместо этого я запустил его как сценарий оболочки и включил переменную среды для HADOOP_USER_NAME, чтобы задание spark запускалось под указанным мной именем пользователя.Вы можете пропустить его, если хотите запустить задание под именем пользователя, которое вы вошли в свой EMR ( hadoop , по умолчанию).
В фрагменте кода ниже объект emr
имеетвведите AmazonElasticMapReduce
, предоставленный в SDK.Если вы используете подход CLI, он вам не понадобится.
Некоторые вспомогательные методы, такие как uploadConfFile
, говорят сами за себя.Я использовал расширенную конфигурацию для приложения spark, и в отличие от files
и jars
, которые могут быть локальными или в s3 / hdfs, файл конфигурации должен находиться в локальном файле самой EMR.
Когда вы закончите, вы создадите шаг в своем кластере EMR, который запустит новое искровое приложение.Вы можете указать в EMR много шагов, которые будут выполняться один за другим.
//Upload the spark configuration you wish to use to a local file
uploadConfFile(clusterId, sparkConf, confFileName);
//create a list of arguments - which is the complete command for spark-submit
List<String> stepargs = new ArrayList<String>();
//start with an envelope to specify the hadoop user name
stepargs.add("/bin/sh");
stepargs.add("-c");
//call to spark-submit with the incantation stating its arguments are provided next.
stepargs.add("HADOOP_USER_NAME="+task.getUserName()+" spark-submit \"$@\"");
stepargs.add("sh");
//add the spark-submit arguments
stepargs.add("--class");
stepargs.add(mainClass);
stepargs.add("--deploy-mode");
stepargs.add("cluster");
stepargs.add("--master");
stepargs.add("yarn");
stepargs.add("--files");
//a comma-separated list of file paths in s3
stepargs.add(files);
stepargs.add("--jars");
//a comma-separated list of file paths in s3
stepargs.add(jars);
stepargs.add("--properties-file");
//the file we uploaded to the EMR, with its full path
stepargs.add(confFileName);
stepargs.add(jar);
//add the jar specific arguments in here
AddJobFlowStepsResult result = emr.addJobFlowSteps(new AddJobFlowStepsRequest()
.withJobFlowId(clusterId)
.withSteps(new StepConfig()
.withName(name)
.withActionOnFailure(ActionOnFailure.CONTINUE)
.withHadoopJarStep(new HadoopJarStepConfig()
.withJar("command-runner.jar")
.withArgs(stepargs))));