

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

# Menggunakan integrasi Amazon Redshift untuk Apache Spark di Amazon EMR Tanpa Server
<a name="emr-spark-redshift"></a>

Dengan Amazon EMR rilis 6.9.0 dan yang lebih baru, setiap gambar rilis menyertakan konektor antara [Apache](https://aws.amazon.com/emr/features/spark/) Spark dan Amazon Redshift. Dengan konektor ini, gunakan Spark di Amazon EMR Serverless untuk memproses data yang disimpan di Amazon Redshift. Integrasi ini didasarkan pada [konektor `spark-redshift` open-source](https://github.com/spark-redshift-community/spark-redshift#readme). Untuk Amazon EMR Tanpa Server, integrasi Amazon Redshift [untuk Apache Spark disertakan sebagai integrasi](https://docs.aws.amazon.com/redshift/latest/mgmt/spark-redshift-connector.html) asli.

**Topics**
+ [Meluncurkan aplikasi Spark dengan integrasi Amazon Redshift untuk Apache Spark](emr-spark-redshift-launch.md)
+ [Mengautentikasi dengan integrasi Amazon Redshift untuk Apache Spark](emr-spark-redshift-auth.md)
+ [Membaca dan menulis dari dan ke Amazon Redshift](emr-spark-redshift-readwrite.md)
+ [Pertimbangan dan batasan saat menggunakan konektor Spark](emr-spark-redshift-considerations.md)

# Meluncurkan aplikasi Spark dengan integrasi Amazon Redshift untuk Apache Spark
<a name="emr-spark-redshift-launch"></a>

Untuk menggunakan integrasi dengan EMR Serverless 6.9.0, teruskan dependensi Spark-Redshift yang diperlukan dengan pekerjaan Spark Anda. Gunakan `--jars` untuk menyertakan pustaka terkait konektor Redshift. Untuk mengakses lokasi file lain yang didukung oleh `--jars` opsi, lihat bagian [Advanced Dependency Management](https://spark.apache.org/docs/latest/submitting-applications.html#advanced-dependency-management) dari dokumentasi Apache Spark. 
+ `spark-redshift.jar`
+ `spark-avro.jar`
+ `RedshiftJDBC.jar`
+ `minimal-json.jar`

Amazon EMR merilis 6.10.0 dan yang lebih tinggi tidak memerlukan ketergantungan, dan secara otomatis menginstal `minimal-json.jar` dependensi lain ke setiap cluster secara default. Contoh berikut menunjukkan cara meluncurkan aplikasi Spark dengan integrasi Amazon Redshift untuk Apache Spark.

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

Luncurkan pekerjaan Spark di Amazon EMR Tanpa Server dengan integrasi Amazon Redshift untuk Apache Spark pada rilis EMR Tanpa Server 6.10.0 dan yang lebih tinggi.

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

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

Untuk meluncurkan pekerjaan Spark di Amazon EMR Tanpa Server dengan integrasi Amazon Redshift untuk Apache Spark pada rilis EMR Tanpa Server 6.9.0, gunakan opsi seperti yang ditunjukkan pada contoh berikut. `--jars` Perhatikan bahwa jalur yang tercantum dengan `--jars` opsi adalah jalur default untuk file 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
```

------

# Mengautentikasi dengan integrasi Amazon Redshift untuk Apache Spark
<a name="emr-spark-redshift-auth"></a>

## Gunakan AWS Secrets Manager untuk mengambil kredensil dan terhubung ke Amazon Redshift
<a name="emr-spark-redshift-secrets"></a>

Anda dapat melakukan autentikasi dengan aman ke Amazon Redshift dengan menyimpan kredensialnya di Secrets Manager dan meminta `GetSecretValue` pekerjaan Spark memanggil API untuk mengambilnya:

```
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
```

## Otentikasi ke Amazon Redshift dengan driver JDBC
<a name="emr-spark-redshift-jdbc"></a>

**Tetapkan nama pengguna dan kata sandi di dalam URL JDBC**

Anda dapat mengautentikasi pekerjaan Spark ke cluster Amazon Redshift dengan menentukan nama database Amazon Redshift dan kata sandi di URL JDBC.

**catatan**  
Jika Anda meneruskan kredensi database di URL, siapa pun yang memiliki akses ke URL juga dapat mengakses kredensialnya. Metode ini umumnya tidak disarankan karena ini bukan opsi yang aman.

Jika keamanan tidak menjadi perhatian aplikasi Anda, gunakan format berikut untuk mengatur nama pengguna dan kata sandi di URL JDBC:

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

## Gunakan otentikasi berbasis IAM dengan peran eksekusi pekerjaan Amazon EMR Tanpa Server
<a name="emr-spark-redshift-iam"></a>

Dimulai dengan rilis Amazon EMR Tanpa Server 6.9.0, driver Amazon Redshift JDBC 2.1 atau yang lebih tinggi dikemas ke lingkungan. Dengan driver JDBC 2.1 dan yang lebih tinggi, Anda dapat menentukan URL JDBC dan tidak menyertakan nama pengguna dan kata sandi mentah. 

Sebaliknya, tentukan `jdbc:redshift:iam://` skema. Ini memerintahkan driver JDBC untuk menggunakan peran eksekusi pekerjaan EMR Tanpa Server Anda untuk mengambil kredensil secara otomatis. Lihat [Mengonfigurasi koneksi JDBC atau ODBC untuk menggunakan kredenal IAM di](https://docs.aws.amazon.com/redshift/latest/mgmt/generating-iam-credentials-configure-jdbc-odbc.html) Panduan Manajemen Amazon *Redshift* untuk informasi selengkapnya. Contoh URL ini adalah:

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

Izin berikut diperlukan untuk peran pelaksanaan pekerjaan Anda ketika kondisi yang disediakan terpenuhi:


| Izin | Kondisi bila diperlukan untuk peran pelaksanaan pekerjaan | 
| --- | --- | 
|  redshift:GetClusterCredentials  | Diperlukan untuk driver JDBC untuk mengambil kredensil dari Amazon Redshift | 
|  redshift:DescribeCluster  | Diperlukan jika Anda menentukan cluster Amazon Redshift dan Wilayah AWS di URL JDBC, bukan titik akhir | 
|  redshift-serverless:GetCredentials  | Diperlukan untuk driver JDBC untuk mengambil kredensional dari Amazon Redshift Serverless | 
|  redshift-serverless:GetWorkgroup  | Diperlukan jika Anda menggunakan Amazon Redshift Tanpa Server dan Anda menentukan URL dalam hal nama grup kerja dan Wilayah | 

## Menghubungkan ke Amazon Redshift dalam VPC yang berbeda
<a name="emr-spark-redshift-vpc"></a>

Saat Anda menyiapkan klaster Amazon Redshift yang disediakan atau workgroup Amazon Redshift Tanpa Server di bawah VPC, konfigurasikan konektivitas VPC untuk aplikasi Amazon EMR Tanpa Server untuk mengakses sumber daya. Untuk informasi lebih lanjut tentang cara mengkonfigurasi konektivitas VPC pada aplikasi EMR Tanpa Server, lihat. [Mengkonfigurasi akses VPC untuk aplikasi EMR Tanpa Server untuk terhubung ke data](vpc-access.md)
+ Jika klaster Amazon Redshift atau grup kerja Amazon Redshift Serverless yang disediakan dapat diakses publik, tentukan satu atau beberapa subnet pribadi yang memiliki gateway NAT terpasang saat Anda membuat aplikasi EMR Tanpa Server.
+ Jika klaster Amazon Redshift atau grup kerja Tanpa Server Amazon Redshift yang disediakan tidak dapat diakses publik, Anda harus membuat titik akhir VPC terkelola Amazon Redshift untuk klaster Amazon Redshift seperti yang dijelaskan dalam. [Mengkonfigurasi akses VPC untuk aplikasi EMR Tanpa Server untuk terhubung ke data](vpc-access.md) *Atau, Anda dapat membuat grup kerja Amazon Redshift Tanpa Server seperti yang dijelaskan dalam Menghubungkan ke [Amazon Redshift Tanpa Server di Panduan Manajemen Pergeseran Merah Amazon](https://docs.aws.amazon.com/redshift/latest/mgmt/serverless-connecting.html).* Anda harus mengaitkan klaster atau subgrup Anda ke subnet pribadi yang Anda tentukan saat membuat aplikasi EMR Tanpa Server.

**catatan**  
Jika Anda menggunakan otentikasi berbasis IAM, dan subnet pribadi Anda untuk aplikasi EMR Tanpa Server tidak memiliki gateway NAT yang terpasang, maka Anda juga harus membuat titik akhir VPC pada subnet tersebut untuk Amazon Redshift atau Amazon Redshift Tanpa Server. Dengan cara ini, driver JDBC dapat mengambil kredensialnya.

# Membaca dan menulis dari dan ke Amazon Redshift
<a name="emr-spark-redshift-readwrite"></a>

Contoh kode berikut digunakan PySpark untuk membaca dan menulis data sampel dari dan ke database Amazon Redshift dengan API sumber data dan dengan SparkSQL.

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

Gunakan PySpark untuk membaca dan menulis data sampel dari dan ke database Amazon Redshift dengan API sumber data.

```
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 ]

Gunakan PySpark untuk membaca dan menulis data sampel dari dan ke database Amazon Redshift dengan SparkSQL.

```
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()
```

------

# Pertimbangan dan batasan saat menggunakan konektor Spark
<a name="emr-spark-redshift-considerations"></a>
+ Kami menyarankan Anda mengaktifkan SSL untuk koneksi JDBC dari Spark di Amazon EMR ke Amazon Redshift.
+ Kami menyarankan Anda mengelola kredensil untuk cluster Amazon Redshift sebagai praktik AWS Secrets Manager terbaik. Lihat [Menggunakan AWS Secrets Manager untuk mengambil kredensil untuk menghubungkan ke Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-secrets-manager-integration.html) sebagai contoh.
+ Kami menyarankan agar Anda meneruskan peran IAM dengan parameter `aws_iam_role` untuk parameter autentikasi Amazon Redshift.
+ Parameter `tempformat` saat ini tidak mendukung format Parket.
+ `tempdir`URI menunjuk ke lokasi Amazon S3. Direktori temp ini tidak dibersihkan secara otomatis dan karenanya dapat menambah biaya tambahan. 
+ Pertimbangkan rekomendasi berikut untuk Amazon Redshift:
  + Kami menyarankan Anda memblokir akses publik ke cluster Amazon Redshift.
  + Kami menyarankan Anda mengaktifkan pencatatan [audit Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/mgmt/db-auditing.html).
  + Kami menyarankan Anda mengaktifkan enkripsi saat [istirahat Amazon Redshift.](https://docs.aws.amazon.com/redshift/latest/mgmt/security-server-side-encryption.html)
+ Pertimbangkan rekomendasi berikut untuk Amazon S3:
  + Kami menyarankan Anda [memblokir akses publik ke bucket Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-control-block-public-access.html).
  + Kami menyarankan Anda menggunakan [enkripsi sisi server Amazon S3 untuk mengenkripsi bucket](https://docs.aws.amazon.com/AmazonS3/latest/userguide/serv-side-encryption.html) Amazon S3 yang digunakan.
  + Sebaiknya gunakan [kebijakan siklus hidup Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lifecycle-mgmt.html) untuk menentukan aturan retensi bucket Amazon S3.
  + Amazon EMR selalu memverifikasi kode yang diimpor dari sumber terbuka ke dalam gambar. Demi keamanan, kami tidak mendukung metode otentikasi berikut dari Spark ke Amazon S3:
    + Mengatur kunci AWS akses dalam klasifikasi `hadoop-env` konfigurasi
    + Pengkodean kunci AWS akses di URI `tempdir`

Untuk informasi selengkapnya tentang penggunaan konektor dan parameter yang didukung, lihat sumber daya berikut:
+ [Integrasi Amazon Redshift untuk Apache Spark di Panduan Manajemen](https://docs.aws.amazon.com/redshift/latest/mgmt/spark-redshift-connector.html) *Amazon Redshift*
+ [Repositori `spark-redshift` komunitas](https://github.com/spark-redshift-community/spark-redshift#readme) di Github