

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# Amazon EMR Serverless에 대한 Apache Log4j2 속성 구성
<a name="log4j2"></a>

이 페이지에서는 `StartJobRun`에서 EMR Serverless 작업에 대한 사용자 지정 [Apache Log4j 2.x](https://logging.apache.org/log4j/2.x/) 속성을 구성하는 방법을 설명합니다. 애플리케이션 수준에서 Log4j 분류를 구성하려면 [EMR Serverless에 대한 기본 애플리케이션 구성](default-configs.md) 섹션을 참조하세요.

## Amazon EMR Serverless에 대한 Spark Log4j2 속성 구성
<a name="log4j2-spark"></a>

Amazon EMR 릴리스 6.8.0 이상에서는 [Apache Log4j 2.x](https://logging.apache.org/log4j/2.x/) 속성을 사용자 지정하여 세분화된 로그 구성을 지정할 수 있습니다. 그러면 EMR Serverless에서 Spark 작업의 문제 해결이 간소화됩니다. 이러한 속성을 구성하려면 `spark-driver-log4j2` 및 `spark-executor-log4j2` 분류를 사용합니다.

**Topics**
+ [Spark에 대한 Log4j2 분류](#log4j2-spark-class)
+ [Spark에 대한 Log4j2 구성 예제](#log4j2-spark-example)
+ [샘플 Spark 작업의 Log4j2](#log4j2-spark-jobs)
+ [Spark에 대한 Log4j2 고려 사항](#log4j2-spark-considerations)

### Spark에 대한 Log4j2 분류
<a name="log4j2-spark-class"></a>

Spark 로그 구성을 사용자 지정하려면 [https://docs.aws.amazon.com/emr-serverless/latest/APIReference/API_ConfigurationOverrides.html#emrserverless-Type-ConfigurationOverrides-applicationConfiguration](https://docs.aws.amazon.com/emr-serverless/latest/APIReference/API_ConfigurationOverrides.html#emrserverless-Type-ConfigurationOverrides-applicationConfiguration)에서 다음 분류를 사용합니다. Log4j 2.x 속성을 구성하려면 다음 [https://docs.aws.amazon.com/emr-serverless/latest/APIReference/API_Configuration.html#emrserverless-Type-Configuration-properties](https://docs.aws.amazon.com/emr-serverless/latest/APIReference/API_Configuration.html#emrserverless-Type-Configuration-properties)를 사용합니다.

**`spark-driver-log4j2`**  
이 분류는 드라이버에 대한 `log4j2.properties` 파일의 값을 설정합니다.

**`spark-executor-log4j2`**  
이 분류는 실행기에 대한 `log4j2.properties` 파일의 값을 설정합니다.

### Spark에 대한 Log4j2 구성 예제
<a name="log4j2-spark-example"></a>

다음 예제에서는 Spark 드라이버 및 실행기에 대한 Log4j2 구성을 사용자 지정하기 위해 `applicationConfiguration`을 사용해 Spark 작업을 제출하는 방법을 보여줍니다.

작업을 제출할 때 대신 애플리케이션 수준에서 Log4j 분류를 구성하려면 [EMR Serverless에 대한 기본 애플리케이션 구성](default-configs.md) 섹션을 참조하세요.

```
aws emr-serverless start-job-run \
    --application-id application-id \
    --execution-role-arn job-role-arn \
    --job-driver '{
        "sparkSubmit": {
            "entryPoint": "/usr/lib/spark/examples/jars/spark-examples.jar",
            "entryPointArguments": ["1"],
            "sparkSubmitParameters": "--class org.apache.spark.examples.SparkPi --conf spark.executor.cores=4 --conf spark.executor.memory=20g --conf spark.driver.cores=4 --conf spark.driver.memory=8g --conf spark.executor.instances=1"
        }
    }'
    --configuration-overrides '{
        "applicationConfiguration": [
             {
                "classification": "spark-driver-log4j2",
                "properties": {
                    "rootLogger.level":"error", // will only display Spark error logs
                    "logger.{{IdentifierForClass}}.name": "{{classpath for setting logger}}",
                    "logger.{{IdentifierForClass}}.level": "info"
                   
                }
            },
            {
                "classification": "spark-executor-log4j2",
                "properties": {
                    "rootLogger.level":"error", // will only display Spark error logs
                    "logger.{{IdentifierForClass}}.name": "{{classpath for setting logger}}",
                    "logger.{{IdentifierForClass}}.level": "info"
                }
            }
       ]
    }'
```

### 샘플 Spark 작업의 Log4j2
<a name="log4j2-spark-jobs"></a>

다음 코드 샘플에서는 애플리케이션에 대한 사용자 지정 Log4j2 구성을 초기화하는 동안 Spark 애플리케이션을 생성하는 방법을 보여줍니다.

------
#### [ Python ]

**Example - Python에서 Spark 작업에 Log4j2 사용**  

```
import os
import sys

from pyspark import SparkConf, SparkContext
from pyspark.sql import SparkSession

app_name = "{{PySparkApp}}"
if __name__ == "__main__":
    spark = SparkSession\
        .builder\
        .appName(app_name)\
        .getOrCreate()
    
    spark.sparkContext._conf.getAll()
    sc = spark.sparkContext
    log4jLogger = sc._jvm.org.apache.log4j
    LOGGER = log4jLogger.LogManager.getLogger(app_name)

    LOGGER.info("pyspark script logger info")
    LOGGER.warn("pyspark script logger warn")
    LOGGER.error("pyspark script logger error")
    
    // {{your code here}}
    
    spark.stop()
```
Spark 작업을 실행하는 경우 드라이버에 대해 Log4j2를 사용자 지정하려면 다음 구성을 사용할 수 있습니다.  

```
{
   "classification": "spark-driver-log4j2",
      "properties": {
          "rootLogger.level":"error", // only display Spark error logs
          "logger.PySparkApp.level": "info", 
          "logger.PySparkApp.name": "{{PySparkApp}}"
      }
}
```

------
#### [ Scala ]

**Example - Scala에서 Spark 작업에 Log4j2 사용**  

```
import org.apache.log4j.Logger
import org.apache.spark.sql.SparkSession

object ExampleClass {
  def main(args: Array[String]): Unit = {
    val spark = SparkSession
    .builder
    .appName(this.getClass.getName)
    .getOrCreate()

    val logger = Logger.getLogger(this.getClass);
    logger.info("script logging info logs")
    logger.warn("script logging warn logs")
    logger.error("script logging error logs")

// {{your code here}}
    spark.stop()
  }
}
```
Spark 작업을 실행하는 경우 드라이버에 대해 Log4j2를 사용자 지정하려면 다음 구성을 사용할 수 있습니다.  

```
{
   "classification": "spark-driver-log4j2",
      "properties": {
          "rootLogger.level":"error", // only display Spark error logs
          "logger.ExampleClass.level": "info", 
          "logger.ExampleClass.name": "ExampleClass"
      }
}
```

------

### Spark에 대한 Log4j2 고려 사항
<a name="log4j2-spark-considerations"></a>

다음 Log4j2.x 속성은 Spark 프로세스에 대해 구성할 수 없습니다.
+ `rootLogger.appenderRef.stdout.ref`
+ `appender.console.type`
+ `appender.console.name`
+ `appender.console.target`
+ `appender.console.layout.type`
+ `appender.console.layout.pattern`

구성할 수 있는 Log4j2.x 속성에 대한 자세한 내용은 GitHub의 [`log4j2.properties.template` 파일](https://github.com/apache/spark/blob/v3.3.0/conf/log4j2.properties.template)을 참조하세요.