Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Gunakan SparkAmazon Redshift dengan konektor
Dengan rilis Amazon EMR versi 6.4.0 dan yang lebih baru, setiap klaster Amazon EMR yang dibuat dengan Apache Spark menyertakan konektor antara Spark danAmazon Redshift. Konektor ini didasarkan pada konektorspark-redshift
sumber terbuka dan memungkinkan Anda menggunakan Spark di Amazon EMR untuk memproses data yang disimpan di dalamnyaAmazon Redshift.
Mulai dari rilis Amazon EMR versi 6.6.0, Anda harus menggunakan--packages
opsi--jars
atau untuk menentukan file JAR berikut yang ingin Anda gunakan. --jars
Opsi menentukan dependensi yang disimpan secara lokal, dalam HDFS, atau menggunakan HTTP/S.Untuk melihat lokasi file lain yang didukung oleh--jars
opsi, lihat Manajemen Ketergantungan Lanjutan--packages
Opsi menentukan dependensi disimpan dalam repo Maven publik.
-
spark-redshift.jar
-
spark-avro.jar
-
RedshiftJDBC.jar
-
minimal-json.jar
Guci ini sudah diinstal pada setiap klaster secara default di semua rilis Amazon EMR versi 6.4.0 dan yang lebih tinggi, tetapi Anda tidak perlu menentukannya dalam versi 6.4.0 dan 6.5.0. Contoh berikut menunjukkan cara meluncurkan aplikasi Spark denganspark-redshift
konektor dengan versi 6.4.0 dan 6.5.0.
spark-submit my_script.py
Untuk meluncurkan aplikasi Spark denganspark-redshift
konektor pada rilis Amazon EMR versi 6.6.0 atau yang lebih tinggi, Anda harus menggunakan--packages
opsi--jars
atau, seperti yang ditunjukkan contoh berikut. Perhatikan bahwa jalur yang tercantum dengan--jars
opsi adalah jalur default untuk file 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
Untuk memulai dengan konektor ini dan mempelajari tentang parameter yang didukung, lihat file READMEspark-redshift
Github. Repositori juga menyertakan tutorial
Amazon EMR selalu meninjau kode sumber terbuka saat mengimpornya ke klaster Anda. Karena masalah keamanan, kami tidak mendukung metode autentikasi berikut dari Spark ke Amazon S3:
-
Mengatur kunciAWS akses dalam klasifikasi
hadoop-env
konfigurasi -
Mengkodekan kunciAWS akses di
tempdir
URI
Pertimbangan dan batasan
-
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. Kami merekomendasikan penggunaan kebijakan siklus hidup Amazon S3 untuk menentukan aturan retensi untuk bucket Amazon S3. -
Kami merekomendasikan menggunakan enkripsi sisi server Amazon S3 untuk mengenkripsi bucket Amazon S3 yang digunakan.
-
Kami menyarankan untuk memblokir akses publik ke bucket Amazon S3.
-
Kami menyarankan bahwa klaster Amazon Redshift tidak boleh diakses publik.
-
Sebaiknya aktifkan pencatatan audit Amazon Redshift.
-
Sebaiknya aktifkan enkripsi saat istirahat Amazon Redshift.
-
Sebaiknya aktifkan SSL untuk koneksi JDBC dari Spark di Amazon EMR ke Amazon Redshift.
-
Kami menyarankan untuk meneruskan peran IAM menggunakan parameter
aws_iam_role
untuk parameter autentikasi Amazon Redshift. -
Kami merekomendasikan untuk mengelola kredensi Amazon Redshift (nama pengguna dan kata sandi untuk klaster Amazon Redshift)AWS Secrets Manager sebagai praktik terbaik. Contoh kode di bawah ini menunjukkan bagaimana Anda dapat menggunakanAWS Secrets Manager untuk mengambil kredensi untuk terhubung ke klaster Amazon Redshift menggunakan
pyspark
:from pyspark.sql import SQLContext import boto3 sc = # existing SparkContext sql_context = SQLContext(sc) secretsmanager_client = boto3.client('secretsmanager') 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 # Read data from a table df = sql_context.read \ .format("io.github.spark_redshift_community.spark.redshift") \ .option("url", url) \ .option("dbtable", "my_table") \ .option("tempdir", "s3://path/for/temp/data") \ .load()