通过连接器在 Amazon Redshift 上使用 Spark - Amazon EMR
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

通过连接器在 Amazon Redshift 上使用 Spark

在 Amazon EMR 6.4.0 及更高版本中,使用 Apache Spark 创建的每个 Amazon EMR 集群都包含 Spark 和 Amazon Redshift 之间的连接器。此连接器基于 spark-redshift 开源连接器,允许您在 Amazon EMR 上使用 Spark 以处理存储在 Amazon Redshift 中的数据。

从 Amazon EMR 发行版 6.6.0 开始,您必须使用 --jars--packages 选项来指定要使用以下哪个 JAR 文件。--jars 选项指定存储在本地、HDFS 中或使用 HTTP/S 的依赖项。要查看 --jars 选项支持的其他文件位置,请参阅 Spark 文档中的高级依赖管理--packages 选项指定存储在公共 Maven 存储库中的依赖项。

  • spark-redshift.jar

  • spark-avro.jar

  • RedshiftJDBC.jar

  • minimal-json.jar

在所有 Amazon EMR 发行版 6.4.0 及更高版本中,这些 jar 已默认安装在每个集群上,但您无需在版本 6.4.0 和 6.5.0 中进行指定。以下示例显示了如何在版本 6.4.0 和 6.5.0 上通过 spark-redshift 连接器启动 Spark 应用程序。

spark-submit my_script.py

要在 Amazon EMR 发行版 6.6.0 或更高版本上通过 spark-redshift 连接器启动 Spark 应用程序,必须使用 --jars--packages 选项,如下例所示。请注意,--jars 选项列出的路径是 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

要开始使用此连接器并了解支持的参数,请参阅 spark-redshift GitHub 存储库上的自述文件。存储库还包括面向 Amazon Redshift 新手的教程

当将开源代码导入集群时,Amazon EMR 始终会对其进行审查。出于安全考虑,我们不支持从 Spark 到 Amazon S3 的以下身份验证方法:

  • hadoop-env 配置分类中设置 Amazon 访问密钥

  • tempdir URI 中编码 Amazon 访问密钥

注意事项和限制

  • 参数 tempformat 目前不支持 Parquet 格式。

  • tempdir URI 指向 Amazon S3 位置。此临时目录不会自动清理,因此可能会增加额外的成本。我们建议使用 Amazon S3 生命周期策略定义 Amazon S3 存储桶的保留规则。

  • 我们建议使用 Amazon S3 服务器端加密以加密使用的 Amazon S3 存储桶。

  • 我们建议阻止对 Amazon S3 存储桶的公开访问

  • 我们建议不要公开访问 Amazon Redshift 集群。

  • 我们建议启用 Amazon Redshift 审核日志记录

  • 我们建议启用 Amazon Redshift 静态加密

  • 我们建议为从 Spark on Amazon EMR 到 Amazon Redshift 的 JDBC 连接启用 SSL。

  • 我们建议使用参数 aws_iam_role 为 Amazon Redshift 身份验证参数传递 IAM 角色。

  • 我们建议的最佳实践是在 Amazon Secrets Manager 中管理 Amazon Redshift 凭证(Amazon Redshift 集群的用户名和密码)。以下代码示例显示了如何使用 Amazon Secrets Manager 检索凭证,以使用 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()