Dataproc - установка driverLogLevels приводит к ошибке log4j - PullRequest
0 голосов
/ 24 мая 2018

Я пытаюсь установить уровни журнала драйверов при запуске заданий в Dataproc (https://cloud.google.com/dataproc/docs/reference/rest/v1/projects.regions.jobs#LoggingConfig). Запуск выполняется с помощью программы на Java с использованием dataproc SDK.

LoggingConfig loggingConfig = new LoggingConfig();
loggingConfig.put("driverLogLevels", Collections.singletonMap("root", "ERROR"));

com.google.api.services.dataproc.model.SparkJob sparkJob = new com.google.api.services.dataproc.model.SparkJob().setMainClass(mainClass).setJarFileUris(jarFileUris).setArgs(args).setProperties(properties).setLoggingConfig(loggingConfig);

Job job = new Job().setPlacement(new JobPlacement().setClusterName(clusterName)).setSparkJob(sparkJob);

// ommitted irrelevant code

Dataproc dp = new Dataproc.Builder(httpTransport, jsonFactory, credential).setApplicationName(jobName).build();
SubmitJobRequest request = new SubmitJobRequest().setJob(job);
return dp.projects().regions().jobs().submit(googleProject, "global", request).execute();

Это запускается успешно, ноне удается установить конфигурацию log4j:

log4j:ERROR Could not read configuration file from URL [file:/tmp/[guid]/driver_log4j.properties].
java.io.FileNotFoundException: /tmp/[guid]/driver_log4j.properties (No such file or directory)
    at java.io.FileInputStream.open0(Native Method)
    at java.io.FileInputStream.open(FileInputStream.java:195)
    at java.io.FileInputStream.<init>(FileInputStream.java:138)
    at java.io.FileInputStream.<init>(FileInputStream.java:93)
    at sun.net.www.protocol.file.FileURLConnection.connect(FileURLConnection.java:90)
    at sun.net.www.protocol.file.FileURLConnection.getInputStream(FileURLConnection.java:188)
    at org.apache.log4j.PropertyConfigurator.doConfigure(PropertyConfigurator.java:557)
    at org.apache.log4j.helpers.OptionConverter.selectAndConfigure(OptionConverter.java:526)
    at org.apache.log4j.LogManager.<clinit>(LogManager.java:127)
    at org.apache.spark.internal.Logging$class.initializeLogging(Logging.scala:117)
    at org.apache.spark.internal.Logging$class.initializeLogIfNecessary(Logging.scala:102)
    at org.apache.spark.deploy.yarn.ApplicationMaster$.initializeLogIfNecessary(ApplicationMaster.scala:736)
    at org.apache.spark.internal.Logging$class.log(Logging.scala:46)
    at org.apache.spark.deploy.yarn.ApplicationMaster$.log(ApplicationMaster.scala:736)
    at org.apache.spark.deploy.yarn.ApplicationMaster$.main(ApplicationMaster.scala:751)
    at org.apache.spark.deploy.yarn.ApplicationMaster.main(ApplicationMaster.scala)
log4j:ERROR Ignoring configuration file [file:/tmp/[guid]/driver_log4j.properties].
Using Spark's default log4j profile: org/apache/spark/log4j-defaults.properties

, где [guid] - это GUID, который отличается для каждого задания. Ведение журнала осуществляется с помощью (подробной) конфигурации по умолчанию.

Как успешно установить конфигурацию? Какой самый элегантный и надежный способ для dataproc настроить уровни журналов для Spark? был бы запасным вариантом, но я бы предпочел использовать метод, который не подлежит изменению из-под меня.

1 Ответ

0 голосов
/ 19 июля 2018

Официальным способом установки уровня журнала является метод, описанный в вашей ссылке .См. dataproc docs .

, поэтому я считаю, что вызвать это из Java SDK в течение setArgs(...) срока вашего строителя.Так что в вашем случае вы хотели бы добавить:

args.add("--driver-log-levels");
args.add("root=ERROR");

примерно так:

args.add("--driver-log-levels");
args.add("root=ERROR");

com.google.api.services.dataproc.model.SparkJob sparkJob = new com.google.api.services.dataproc.model.SparkJob().setMainClass(mainClass).setJarFileUris(jarFileUris).setArgs(args).setProperties(properties).setLoggingConfig(loggingConfig);

Job job = new Job().setPlacement(new JobPlacement().setClusterName(clusterName)).setSparkJob(sparkJob);

// ommitted irrelevant code

Dataproc dp = new Dataproc.Builder(httpTransport, jsonFactory, credential).setApplicationName(jobName).build();
SubmitJobRequest request = new SubmitJobRequest().setJob(job);
return dp.projects().regions().jobs().submit(googleProject, "global", request).execute();

Я не уверен, что вы имеете в виду, когда называете эту функцию, которую можно изменитьиз-под тебя.Это должна быть стабильная функция.

...