

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

# Amazon EMR Serverless에서 Apache Spark용 Amazon Redshift 통합 사용
<a name="emr-spark-redshift"></a>

Amazon EMR 릴리스 6.9.0 이상에서 모든 릴리스 이미지에 [Apache Spark](https://aws.amazon.com/emr/features/spark/)와 Amazon Redshift 간 커넥터가 포함됩니다. 이 커넥터를 사용하면 Amazon EMR Serverless에서 Spark를 사용하여 Amazon Redshift에 저장된 데이터를 처리할 수 있습니다. 통합은 [`spark-redshift` 오픈 소스 커넥터](https://github.com/spark-redshift-community/spark-redshift#readme)를 기반으로 합니다. Amazon EMR Serverless의 경우 [Apache Spark용 Amazon Redshift 통합](https://docs.aws.amazon.com/redshift/latest/mgmt/spark-redshift-connector.html)이 기본 통합으로 포함됩니다.

**Topics**
+ [Apache Spark용 Amazon Redshift 통합을 사용하여 Spark 애플리케이션 시작](emr-spark-redshift-launch.md)
+ [Apache Spark용 Amazon Redshift 통합으로 인증](emr-spark-redshift-auth.md)
+ [Amazon Redshift에서 읽고 쓰기](emr-spark-redshift-readwrite.md)
+ [Spark 커넥터 사용 시 고려 사항 및 제한 사항](emr-spark-redshift-considerations.md)

# Apache Spark용 Amazon Redshift 통합을 사용하여 Spark 애플리케이션 시작
<a name="emr-spark-redshift-launch"></a>

EMR Serverless 6.9.0과의 통합을 사용하려면 필수 Spark-Redshift 종속 항목을 Spark 작업과 함께 전달합니다. Redshift 커넥터 관련 라이브러리를 포함하려면 `--jars`를 사용합니다. `--jars` 옵션에서 지원하는 다른 파일 위치에 액세스하려면 Apache Spark 설명서에서 [Advanced Dependency Management](https://spark.apache.org/docs/latest/submitting-applications.html#advanced-dependency-management) 섹션을 참조하세요.
+ `spark-redshift.jar`
+ `spark-avro.jar`
+ `RedshiftJDBC.jar`
+ `minimal-json.jar`

Amazon EMR 릴리스 6.10.0 이상에서는 `minimal-json.jar` 종속성이 필요하지 않으며 기본적으로 다른 종속성을 각 클러스터에 자동으로 설치합니다. 다음 예제에서는 Apache Spark용 Amazon Redshift 통합을 사용하여 Spark 애플리케이션을 시작하는 방법을 보여줍니다.

------
#### [ Amazon EMR 6.10.0 \$1 ]

EMR Serverless 릴리스 6.10.0 이상에서 Apache Spark용 Amazon Redshift 통합을 사용해 Amazon EMR Serverless에서 Spark 작업을 시작합니다.

```
spark-submit my_script.py
```

------
#### [ Amazon EMR 6.9.0 ]

EMR Serverless 릴리스 6.9.0에서 Apache Spark에 대한 Amazon Redshift 통합을 통해 Amazon EMR Serverless에서 Spark 작업을 시작하려면 다음 예제와 같이 `--jars` 옵션을 사용합니다. `--jars` 옵션과 함께 나열된 경로는 JAR 파일의 기본 경로입니다.

```
--jars 
    /usr/share/aws/redshift/jdbc/RedshiftJDBC.jar,
    /usr/share/aws/redshift/spark-redshift/lib/spark-redshift.jar,
    /usr/share/aws/redshift/spark-redshift/lib/spark-avro.jar,
    /usr/share/aws/redshift/spark-redshift/lib/minimal-json.jar
```

```
spark-submit \
  --jars /usr/share/aws/redshift/jdbc/RedshiftJDBC.jar,/usr/share/aws/redshift/spark-redshift/lib/spark-redshift.jar,/usr/share/aws/redshift/spark-redshift/lib/spark-avro.jar,/usr/share/aws/redshift/spark-redshift/lib/minimal-json.jar \
  my_script.py
```

------

# Apache Spark용 Amazon Redshift 통합으로 인증
<a name="emr-spark-redshift-auth"></a>

## AWS Secrets Manager 를 사용하여 자격 증명을 검색하고 Amazon Redshift에 연결
<a name="emr-spark-redshift-secrets"></a>

자격 증명을 Secrets Manager에 저장하여 Amazon Redshift에 대해 안전하게 인증한 후 Spark 작업에서 `GetSecretValue` API를 직접 호출하여 가져올 수 있습니다.

```
from pyspark.sql import SQLContextimport boto3

sc = # existing SparkContext
sql_context = SQLContext(sc)

secretsmanager_client = boto3.client('secretsmanager', region_name=os.getenv('AWS_REGION'))
secret_manager_response = secretsmanager_client.get_secret_value(
    SecretId='string',
    VersionId='string',
    VersionStage='string'
)
username = # get username from secret_manager_response
password = # get password from secret_manager_response
url = "jdbc:redshift://redshifthost:5439/database?user=" + username + "&password=" + password

# Access to Redshift cluster using Spark
```

## JDBC 드라이버를 사용하여 Amazon Redshift에 인증
<a name="emr-spark-redshift-jdbc"></a>

**JDBC URL에서 사용자 이름 및 암호 설정**

JDBC URL에서 Amazon Redshift 데이터베이스 이름과 암호를 지정하여 Amazon Redshift 클러스터에 대해 Spark 작업을 인증할 수 있습니다.

**참고**  
URL에 데이터베이스 보안 인증을 전달하면 URL에 액세스할 수 있는 모든 사용자도 보안 인증에 액세스할 수 있습니다. 이 방법은 안전한 옵션이 아니므로 일반적으로 권장되지 않습니다.

애플리케이션의 보안이 문제가 아닌 경우 다음 형식을 사용하여 JDBC URL에서 사용자 이름과 암호를 설정할 수 있습니다.

```
jdbc:redshift://redshifthost:5439/database?user=username&password=password
```

## Amazon EMR Serverless 작업 실행 역할로 IAM 기반 인증 사용
<a name="emr-spark-redshift-iam"></a>

Amazon EMR Serverless 릴리스 6.9.0부터 Amazon Redshift JDBC 드라이버 버전 2.1 이상이 환경에 함께 패키지로 제공됩니다. JDBC 드라이버 2.1 이상을 사용하면 JDBC URL을 지정하고 원시 사용자 이름과 암호는 포함하지 않을 수 있습니다.

대신, `jdbc:redshift:iam://` 스키마를 지정합니다. 이를 통해 EMR Serverless 작업 실행 역할을 사용하여 자격 증명을 자동으로 가져오도록 JDBC 드라이버에 지시합니다. 자세한 내용은 *Amazon Redshift 관리 안내서*에서 [IAM 보안 인증을 사용하도록 JDBC 또는 ODBC 연결 구성](https://docs.aws.amazon.com/redshift/latest/mgmt/generating-iam-credentials-configure-jdbc-odbc.html)을 참조하세요. 이 URL의 예제는 다음과 같습니다.

```
jdbc:redshift:iam://examplecluster.abc123xyz789.us-west-2.redshift.amazonaws.com:5439/dev
```

제공된 조건을 충족하는 경우 작업 실행 역할에 다음 권한이 필요합니다.


| 권한 | 작업 실행 역할에 필요한 경우 조건 | 
| --- | --- | 
|  redshift:GetClusterCredentials  | JDBC 드라이버가 Amazon Redshift에서 보안 인증을 가져오는 데 필요함 | 
|  redshift:DescribeCluster  | Amazon Redshift 클러스터를 지정하고 엔드포인트 대신 JDBC URL에 AWS 리전 을 지정하는 경우 필요함 | 
|  redshift-serverless:GetCredentials  | JDBC 드라이버가 Amazon Redshift Serverless에서 보안 인증을 가져오는 데 필요함 | 
|  redshift-serverless:GetWorkgroup  | Amazon Redshift Serverless를 사용하고 있고 작업 그룹 이름 및 리전 측면에서 URL을 지정하는 경우 필요함 | 

## 다른 VPC 내에서 Amazon Redshift에 연결
<a name="emr-spark-redshift-vpc"></a>

VPC에서 프로비저닝된 Amazon Redshift 클러스터 또는 Amazon Redshift Serverless 작업 그룹을 설정하는 경우 Amazon EMR Serverless 애플리케이션이 리소스에 액세스하도록 VPC 연결을 구성합니다. EMR Serverless 애플리케이션에서 VPC 연결을 구성하는 방법에 대한 자세한 내용은 [데이터에 연결하도록 EMR Serverless 애플리케이션에 대한 VPC 액세스 구성](vpc-access.md) 섹션을 참조하세요.
+ 프로비저닝된 Amazon Redshift 클러스터 또는 Amazon Redshift Serverless 작업 그룹에 대한 퍼블릭 액세스가 가능한 경우 EMR Serverless 애플리케이션을 생성할 때 NAT 게이트웨이가 연결된 하나 이상의 프라이빗 서브넷을 지정할 수 있습니다.
+ 프로비저닝된 Amazon Redshift 클러스터 또는 Amazon Redshift Serverless 작업 그룹에 대한 퍼블릭 액세스가 불가능한 경우 [데이터에 연결하도록 EMR Serverless 애플리케이션에 대한 VPC 액세스 구성](vpc-access.md)에 설명된 대로 Amazon Redshift 클러스터에 대한 Amazon Redshift 관리형 VPC 엔드포인트를 생성해야 합니다. 또는 **Amazon Redshift 관리 안내서의 [Amazon Redshift Serverless에 연결](https://docs.aws.amazon.com/redshift/latest/mgmt/serverless-connecting.html)에 설명된 대로 Amazon Redshift Serverless 작업 그룹을 생성할 수 있습니다. 클러스터 또는 하위 그룹을 EMR Serverless 애플리케이션을 생성하는 경우 사용자가 지정한 프라이빗 서브넷에 연결해야 합니다.

**참고**  
IAM 기반 인증을 사용하고 EMR Serverless 애플리케이션의 프라이빗 서브넷에 연결된 NAT 게이트웨이가 없는 경우 Amazon Redshift 또는 Amazon Redshift Serverless의 해당 서브넷에서도 VPC 엔드포인트를 생성해야 합니다. 이렇게 하면 JDBC 드라이버가 자격 증명을 가져올 수 있습니다.

# Amazon Redshift에서 읽고 쓰기
<a name="emr-spark-redshift-readwrite"></a>

다음 코드 예제는 데이터 소스 API와 SparkSQL을 통해 Amazon Redshift 데이터베이스에서 샘플 데이터를 읽고 쓰는 데 PySpark를 사용합니다.

------
#### [ Data source API ]

PySpark를 사용하여 데이터 소스 API를 통해 Amazon Redshift 데이터베이스에서 샘플 데이터를 읽고 씁니다.

```
import boto3
from pyspark.sql import SQLContext

sc = # existing SparkContext
sql_context = SQLContext(sc)

url = "jdbc:redshift:iam://redshifthost:5439/database"
aws_iam_role_arn = "arn:aws:iam::account-id:role/role-name"

df = sql_context.read \
    .format("io.github.spark_redshift_community.spark.redshift") \
    .option("url", url) \
    .option("dbtable", "table-name") \
    .option("tempdir", "s3://path/for/temp/data") \
    .option("aws_iam_role", "aws-iam-role-arn") \
    .load()

df.write \
    .format("io.github.spark_redshift_community.spark.redshift") \
    .option("url", url) \
    .option("dbtable", "table-name-copy") \
    .option("tempdir", "s3://path/for/temp/data") \
    .option("aws_iam_role", "aws-iam-role-arn") \
    .mode("error") \
    .save()
```

------
#### [ SparkSQL ]

PySpark를 사용하여 SparkSQL을 통해 Amazon Redshift 데이터베이스에서 샘플 데이터를 읽고 씁니다.

```
import boto3
import json
import sys
import os
from pyspark.sql import SparkSession

spark = SparkSession \
    .builder \
    .enableHiveSupport() \
    .getOrCreate()
    
url = "jdbc:redshift:iam://redshifthost:5439/database"
aws_iam_role_arn = "arn:aws:iam::account-id:role/role-name"
    
bucket = "s3://path/for/temp/data"
tableName = "table-name" # Redshift table name

s = f"""CREATE TABLE IF NOT EXISTS {table-name} (country string, data string) 
    USING io.github.spark_redshift_community.spark.redshift 
    OPTIONS (dbtable '{table-name}', tempdir '{bucket}', url '{url}', aws_iam_role '{aws-iam-role-arn}' ); """

spark.sql(s)
         
columns = ["country" ,"data"]
data = [("test-country","test-data")]
df = spark.sparkContext.parallelize(data).toDF(columns)

# Insert data into table
df.write.insertInto(table-name, overwrite=False)
df = spark.sql(f"SELECT * FROM {table-name}")
df.show()
```

------

# Spark 커넥터 사용 시 고려 사항 및 제한 사항
<a name="emr-spark-redshift-considerations"></a>
+ Amazon EMR의 Spark에서 Amazon Redshift로의 JDBC 연결을 위해 SSL을 켜는 것이 좋습니다.
+ 모범 사례로 AWS Secrets Manager 에서 Amazon Redshift 클러스터의 보안 인증을 관리하는 것이 좋습니다. 예제는 [AWS Secrets Manager 를 사용하여 Amazon Redshift에 연결하기 위한 자격 증명을 검색](https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-secrets-manager-integration.html)하기를 참조하세요.
+ Amazon Redshift 인증 파라미터에 대해 `aws_iam_role` 파라미터를 사용하여 IAM 역할을 전달하는 것이 좋습니다.
+ 현재 `tempformat` 파라미터는 Parquet 형식을 지원하지 않습니다.
+ `tempdir` URI는 Amazon S3 위치를 가리킵니다. 이 임시 디렉터리는 자동으로 정리되지 않으므로, 추가 비용이 발생할 수 있습니다.
+ Amazon Redshift에 대한 다음 권장 사항을 고려합니다.
  + Amazon Redshift 클러스터에 대한 퍼블릭 액세스를 차단하는 것이 좋습니다.
  + [Amazon Redshift 감사 로깅](https://docs.aws.amazon.com/redshift/latest/mgmt/db-auditing.html)을 켜는 것이 좋습니다.
  + [Amazon Redshift 저장 데이터 암호화](https://docs.aws.amazon.com/redshift/latest/mgmt/security-server-side-encryption.html)를 켜는 것이 좋습니다.
+ Amazon S3에 대한 다음 권장 사항을 고려합니다.
  + [Amazon S3 버킷에 대한 퍼블릭 액세스를 차단](https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-control-block-public-access.html)하는 것이 좋습니다.
  + [Amazon S3 서버 측 암호화](https://docs.aws.amazon.com/AmazonS3/latest/userguide/serv-side-encryption.html)를 사용하여 사용된 Amazon S3 버킷을 암호화하는 것이 좋습니다.
  + [Amazon S3 수명 주기 정책](https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lifecycle-mgmt.html)을 사용하여 Amazon S3 버킷에 대한 보존 규칙을 정의하는 것이 좋습니다.
  + Amazon EMR은 오픈 소스에서 이미지로 가져온 코드를 항상 확인합니다. 보안을 위해 Spark에서 Amazon S3로의 다음 인증 방법은 지원되지 않습니다.
    + `hadoop-env` 구성 분류에서 AWS 액세스 키 설정
    + `tempdir` URI에서 AWS 액세스 키 인코딩

커넥터 사용 및 지원되는 파라미터에 대한 자세한 내용은 다음 리소스를 참조하세요.
+ *Amazon Redshift 관리 안내서*의 [Apache Spark용 Amazon Redshift 통합](https://docs.aws.amazon.com/redshift/latest/mgmt/spark-redshift-connector.html)
+ Github의 [`spark-redshift` community repository](https://github.com/spark-redshift-community/spark-redshift#readme)