Wszystkie metody zebrane z przykładami
Intro
Właściwie jest na to wiele sposobów . Niektóre są trudniejsze od innych, ale od Ciebie zależy, który z nich najbardziej Ci odpowiada. Postaram się je wszystkie pokazać.
# 1 Programowo w Twojej aplikacji
Wydaje się, że jest to najłatwiejsze, ale musisz ponownie skompilować aplikację, aby zmienić te ustawienia. Osobiście mi się to nie podoba, ale działa dobrze.
Przykład:
import org.apache.log4j.{Level, Logger}
val rootLogger = Logger.getRootLogger()
rootLogger.setLevel(Level.ERROR)
Logger.getLogger("org.apache.spark").setLevel(Level.WARN)
Logger.getLogger("org.spark-project").setLevel(Level.WARN)
Dzięki log4j
API możesz osiągnąć znacznie więcej .
Źródło: [ Log4J Configuration Docs , Configuration section]
# 2 Pass w log4j.properties
trakciespark-submit
To jest bardzo trudne, ale nie niemożliwe. I mój ulubiony.
Log4J podczas uruchamiania aplikacji zawsze szuka i ładuje log4j.properties
plik ze ścieżki klasy.
Jednak w przypadku korzystania spark-submit
ze ścieżki klas Spark Clustera ma pierwszeństwo przed ścieżką klas aplikacji! Dlatego umieszczenie tego pliku w Twoim fat-jar nie nadpisuje ustawień klastra!
Dodaj -Dlog4j.configuration=<location of configuration file>
do
spark.driver.extraJavaOptions
(dla sterownika) lub
spark.executor.extraJavaOptions
(dla wykonawców) .
Zauważ, że jeśli używasz pliku, file:
protokół powinien być jawnie dostarczony, a plik musi istnieć lokalnie na wszystkich węzłach .
Aby spełnić ostatni warunek, możesz przesłać plik do lokalizacji dostępnej dla węzłów (np. hdfs
) Lub uzyskać do niego dostęp lokalnie za pomocą sterownika, jeśli używasz deploy-mode client
. Inaczej:
przesłać niestandardowy log4j.properties
przy użyciu funkcji spark-submit, dodając go do --files
listy plików do przesłania wraz z aplikacją.
Źródło: dokumentacja Spark, debugowanie
Kroki:
Przykład log4j.properties
:
# Blacklist all to warn level
log4j.rootCategory=WARN, console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.target=System.err
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{1}: %m%n
# Whitelist our app to info :)
log4j.logger.com.github.atais=INFO
Wykonywanie spark-submit
, dla trybu klastra:
spark-submit \
--master yarn \
--deploy-mode cluster \
--conf "spark.driver.extraJavaOptions=-Dlog4j.configuration=file:log4j.properties" \
--conf "spark.executor.extraJavaOptions=-Dlog4j.configuration=file:log4j.properties" \
--files "/absolute/path/to/your/log4j.properties" \
--class com.github.atais.Main \
"SparkApp.jar"
Pamiętaj, że musisz użyć, --driver-java-options
jeśli używasz client
trybu.Spark docs, środowisko wykonawcze środowiska uruchomieniowego
Wykonywanie spark-submit
, dla trybu klienta:
spark-submit \
--master yarn \
--deploy-mode client \
--driver-java-options "-Dlog4j.configuration=file:/absolute/path/to/your/log4j.properties \
--conf "spark.executor.extraJavaOptions=-Dlog4j.configuration=file:log4j.properties" \
--files "/absolute/path/to/your/log4j.properties" \
--class com.github.atais.Main \
"SparkApp.jar"
Uwagi:
- Pliki przesłane do
spark-cluster
z--files
będą dostępne w głównym katalogu, więc nie ma potrzeby, aby dodać dowolną ścieżkęfile:log4j.properties
.
- Pliki wymienione w
--files
muszą mieć bezwzględną ścieżkę!
file:
prefiks w identyfikatorze URI konfiguracji jest obowiązkowy.
# 3 Edytuj klaster conf/log4j.properties
Spowoduje to zmianę pliku konfiguracji globalnego rejestrowania .
zaktualizuj $SPARK_CONF_DIR/log4j.properties
plik, a zostanie on automatycznie przesłany wraz z innymi konfiguracjami.
Źródło: dokumentacja Spark, debugowanie
Aby znaleźć swój SPARK_CONF_DIR
, możesz użyć spark-shell
:
atais@cluster:~$ spark-shell
Welcome to
____ __
/ __/__ ___ _____/ /__
_\ \/ _ \/ _ `/ __/ '_/
/___/ .__/\_,_/_/ /_/\_\ version 2.1.1
/_/
scala> System.getenv("SPARK_CONF_DIR")
res0: String = /var/lib/spark/latest/conf
Teraz po prostu edytuj /var/lib/spark/latest/conf/log4j.properties
(przykład z metody nr 2), a wszystkie Twoje aplikacje będą współdzielić tę konfigurację.
# 4 Zastąp katalog konfiguracji
Jeśli podoba Ci się rozwiązanie nr 3, ale chcesz dostosować je do poszczególnych aplikacji, możesz skopiować conf
folder, edytować jego zawartość i określić jako konfigurację główną podczas spark-submit
.
Aby określić inny katalog konfiguracji niż domyślny “SPARK_HOME/conf”
, możesz ustawić SPARK_CONF_DIR
. Spark będzie korzystać z plików konfiguracyjnych ( spark-defaults.conf
, spark-env.sh
, log4j.properties
, etc ) z tego katalogu.
Źródło: dokumentacja Spark, konfiguracja
Kroki:
- Skopiuj plik klastra
conf
folder (więcej informacji, metoda nr 3)
- Edytuj
log4j.properties
w tym folderze (przykład w metodzie nr 2)
Ustaw SPARK_CONF_DIR
na ten folder, przed wykonaniem spark-submit
,
przykład:
export SPARK_CONF_DIR=/absolute/path/to/custom/conf
spark-submit \
--master yarn \
--deploy-mode cluster \
--class com.github.atais.Main \
"SparkApp.jar"
Wniosek
Nie jestem pewien, czy istnieje inna metoda, ale mam nadzieję, że obejmuje ona temat od A do Z. Jeśli nie, pisz do mnie w komentarzach!
Ciesz się swoją drogą!