使用适用于 Apache Spark 的 Amazon Redshift 集成进行身份验证 - Amazon EMR
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用适用于 Apache Spark 的 Amazon Redshift 集成进行身份验证

Amazon Secrets Manager 用于检索凭证并连接亚马逊 Redshift

以下代码示例显示了如何使用检索凭证, Amazon Secrets Manager 以便通过 Python 中的 Apache Spark PySpark 接口连接到 Amazon Redshift 集群。

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

IAM用于检索凭证并连接亚马逊 Redshift

你可以使用 Amazon Redshift 提供的第 2 JDBC 版驱动程序通过 Spark 连接器连接到亚马逊 Redshift。要使用 Amazon Identity and Access Management (IAM),请将您的配置JDBCURL为使用IAM身份验证。要从亚马逊连接到 Redshift 集群EMR,您必须向您的IAM角色授予检索临时IAM证书的权限。为您的IAM角色分配以下权限,使其可以检索证书并运行 Amazon S3 操作。

有关 GetClusterCredentials 的更多信息,请参阅 GetClusterCredentials 的资源策略

您还必须确保 Amazon Redshift 可以在COPYUNLOAD操作期间担任该IAM角色。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "redshift.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }

以下示例使用了 Spark 和 Amazon Redshift 之间的IAM身份验证:

from pyspark.sql import SQLContext import boto3 sc = # existing SparkContext sql_context = SQLContext(sc) url = "jdbc:redshift:iam//redshift-host:redshift-port/db-name" iam_role_arn = "arn:aws:iam::account-id:role/role-name" # Read data from a table df = sql_context.read \ .format("io.github.spark_redshift_community.spark.redshift") \ .option("url", url) \ .option("aws_iam_role", iam_role_arn) \ .option("dbtable", "my_table") \ .option("tempdir", "s3a://path/for/temp/data") \ .mode("error") \ .load()