Gunakan SparkAmazon Redshift dengan konektor - Amazon EMR

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. --jarsOpsi 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 dalam dokumentasi Spark. --packagesOpsi 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 README di repositorispark-redshift Github. Repositori juga menyertakan tutorial bagi mereka yang baru mengenalAmazon Redshift.

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 klasifikasihadoop-env konfigurasi

  • Mengkodekan kunciAWS akses ditempdir URI

Pertimbangan dan batasan

  • Parametertempformat saat ini tidak mendukung format Parket.

  • tempdirURI 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 parameteraws_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 menggunakanpyspark:

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