У меня есть многоузловой кластер Spark. Я создаю журналы, используя log4j. Журналы создаются, но все узлы в кластере. Они также создаются в каталоге /tmp, а не в каком-либо другом каталоге. Это
spark2-submit --master yarn --deploy-mode cluster --files /path/log4j.properties --conf "spark.driver.extraJavaOptions=-Dlog4j.configuration=log4j.properties" --conf "spark.executor.extraJavaOptions =-Dlog4j.configuration=log4j.properties" --class com.dataLoad.Load_WF /путь/LoadData.jar
Как добавить все журналы в один файл журнала вместо нескольких журналов? Как создавать журналы в каталоге, отличном от каталога /tmp в Linux? Пример кода будет очень полезен для понимания. Очень признателен.
В многоузловом искровом кластере журналы ваших приложений записываются искровым драйвером.
если вы выполняете в режиме клиента на узле A, журналы будут сохранены на узле А
если вы выполняете в режиме кластера, журналы будут сохранены на узле, где искровой драйвер работает.
У нас была та же проблема, решение, которое мы нашли, состоит в том, чтобы использовать системный журнал для централизации журналов каждого узла для всех наших приложений на одном узле.
На главном узле вы должны настроить системный журнал как сервер журналов. Внутри /etc/syslog-ng/ вам нужно отредактировать syslog-ng.conf, чтобы создать места назначения для сохранения файлов централизованного журнала:
пример :
@version: 3.5
@include "scl.conf"
@include "`scl-root`/system/tty10.conf"
options {
time-reap(30);
mark-freq(10);
keep-hostname(yes);
};
source s_local { system(); internal(); };
source s_network {
syslog(transport(udp) port(514));
};
destination df_local2 {
file(
"/var/log/MyClusterLogs/myAppLogs.$YEAR-$MONTH-$DAY.log"
owner("user")
group("user")
perm(0777)
); };
filter f_local2 { facility(local2); };
log { source(s_network); filter(f_local2); destination(df_local2); };
Затем измените конфигурацию в файле log4j.properties приложения spark, чтобы указать на сервер системного журнала:
log4j.rootCategory=INFO,FILE,SYSLOG
log4j.appender.SYSLOG=org.apache.log4j.net.SyslogAppender
log4j.appender.SYSLOG.syslogHost=<syslog_server_ip>
log4j.appender.SYSLOG.layout=org.apache.log4j.PatternLayout
log4j.appender.SYSLOG.layout.conversionPattern=%d{ISO8601} %-5p [%t] %c{2} %x - %m%n
log4j.appender.SYSLOG.Facility=LOCAL2
вам нужно установить syslog-ng: yum install syslog-ng. И да, вы должны сделать это на каждом узле
Спасибо, что поделились кодом. У меня есть еще одно сомнение. Я использую версию Centos Linux 7, в которой нет syslog-ng. Нужно ли устанавливать его на узел драйвера (главный узел) или на каждый узел в кластере?