【问题标题】:Does the default EMR Spark come preconfigured to directly access redshift tables?默认 EMR Spark 是否已预先配置为直接访问 redshift 表?
【发布时间】:2017-01-17 22:37:08
【问题描述】:

EMR Spark集群和redshift之间的读/写操作绝对可以通过。 intermediary data dump 到 s3。

不过有 spark 库,可以直接将 redshift 当作数据源:https://github.com/databricks/spark-redshift

EMR 5.0 Spark 集群是否预配置了用于 redshift 访问的库和访问凭证?

【问题讨论】:

  • 查看更新的答案。我昨天刚刚完成了所有这些工作,并决定重写我的答案以更具体。

标签: amazon-web-services apache-spark amazon-redshift emr


【解决方案1】:

EMR 5.0 Spark 集群是否预配置了库和 用于 redshift 访问的访问凭据?

不,EMR 不从数据块中提供此库。

访问 Redshift: 与 Redshift 的连接不需要任何基于 IAM 的身份验证。它只需要在 Redshift 安全组的默认端口 5439 上列入白名单的 EMR 集群(主/从 IP 或 EMR 主/从 SG)。

现在,由于 Spark 执行程序基于 spark 命令运行 C​​OPY / LOAD 命令,并且这些命令需要访问 S3,因此您需要配置此处提到的 IAM 凭证:https://github.com/databricks/spark-redshift#aws-credentials

从 EMR 访问 S3:

默认情况下,EMR 节点假定一个名为 EMR_EC2_DefaultRole 的 IAM 实例配置文件角色,该角色的权限定义了 EMR 节点及其实体(使用 InstanceProfileCredentialsProvider)可以访问的内容。所以你可以使用文档中提到的第四种方式。 (AccessKey , SecretKey , Tokens) 可以像下面这样检索并且可以用作选项或参数(temporary_aws_access_key_id ,temporary_aws_secret_access_key ,temporary_aws_session_token )

https://github.com/databricks/spark-redshift#parameters

//Get cred's from IAM instance profile
val provider = new InstanceProfileCredentialsProvider()
val credentials: AWSSessionCredentials = provider.getCredentials.asInstanceOf[AWSSessionCredentials]
val token = credentials.getSessionToken
val awsAccessKey = credentials.getAWSAccessKeyId
val awsSecretKey = credentials.getAWSSecretKey

EMR_EC2_DefaultRole 应具有 permissions 以在用作 tempdir 的 S3 对象上读取/写入。

最后,EMR 确实在 /usr/share/aws/redshift/jdbc 上包含 Redshift 的 JDBC 驱动程序,可用于 spark 的驱动程序和执行程序类路径 (--jars)。

【讨论】:

  • 我已经找了好几个星期了,你的答案似乎很可靠。但是,我仍然感到困惑:为了在 RedShift 和 EMR 集群之间来回移动数据,我是否需要使用/拥有 S3?
  • 如果您使用这个 spark-redshift 库来移动数据,它确实需要 S3 作为中间人在读取或写入 Redshift 时存储大量数据。 github.com/databricks/…
  • 如果你不想使用这个库,在 EMR 集群上,你也可以下载 psql 客户端并运行一些 COPY 命令来加载数据。这可能需要也可能不需要 S3 作为源。 docs.aws.amazon.com/redshift/latest/dg/… 对于 UNLOAD ,您可能需要一个 S3 docs.aws.amazon.com/redshift/latest/dg/c_unloading_data.html
  • 我给他们看看。谢谢!
  • 应该注意,Databricks spark-redshift 驱动程序已被移入他们的商业产品中。所以不再支持他们 GitHub 存储库中的那个
【解决方案2】:

为了允许 EMR 和任何其他 AWS 资源之间的访问,您需要编辑应用于主/核心节点的角色(识别和访问管理,又名“IAM”),并添加使用权限您需要的服务,即 S3(已默认启用)、Redshift 等。

旁注,在某些情况下,您可以在应用程序中使用 AWS 开发工具包与其他服务的 API 进行交互。

要让 Spark 成功与 redshift 对话,您必须做一些具体的事情:

  1. 获取 redshift jdbc,将其包含在您的 spark 类路径中,并包含带有 --jars 标志的 jar。

  2. 在 IAM 中为 redshift 创建一个特殊角色。这意味着首先创建角色,然后在开始时选择 redshift 类/选项,因此主要资源实际上是 redshift,然后从那里添加您的附加权限。

  3. 进入 redshift 并将新角色添加到您的 redshift 集群

  4. 在您的 spark 应用程序中提供角色的 ARN

  5. 确保 S3 被授予该新角色的权限,因为当 spark 和 redshift 通过 JDBC 相互通信时,所有数据都存储为 s3 中的中间文件集......就像S3 中的临时交换文件一样。

    注意:如果您收到有关 S3 的权限错误,请尝试将文件路径中的协议从 s3:// 更改为 s3a:// -- 对于某些 以某种方式绕过该安全性的原因。 Source

完成所有这些操作后,redshift 和 spark 就可以相互交流了。它有很多东西。

【讨论】:

  • 它有点像数据传输的幕后机制......显然。 :)
  • 能否指定如何实现第 4 点:“在您的 spark 应用程序中提供角色的 ARN”
猜你喜欢
  • 2019-11-19
  • 1970-01-01
  • 1970-01-01
  • 2019-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多