我想在我的 Amazon EMR 叢集中使用 Spark 來連線到 Amazon Redshift 叢集。
解決方法
**注意:**在開始之前,請確定您已設定 Amazon Redshift 叢集。然後,使用 Spark 啟動 Amazon EMR 6.4 或更高版本的叢集。
若要在 Amazon EMR 叢集中使用 Spark 連線至 Amazon Redshift 叢集,請完成下列步驟:
測試 Amazon EMR 叢集與 Amazon Redshift 叢集之間的連線
-
確認 Amazon Redshift 叢集的安全性群組傳入規則是否允許在 TCP 連接埠 5439 上使用 Amazon EMR 主要、核心和工作安全性群組。
**注意:**如果您的叢集部署在兩個不同的 Amazon Virtual Private Cloud (Amazon VPC) 中,請設定 Amazon VPC 對等互連。
-
若要連線到 Amazon EMR 主節點,請使用 SSH。然後,執行下列 telnet 命令:
telnet example-redshift-endpoint 5439
**注意:**請使用 Amazon Redshift 叢集端點取代 example-redshift-endpoint。
範例輸出結果:
telnet redshift-cluster-1.XXXXX.us-east-1.redshift.amazonaws.com 5439
Trying 172.31.48.21...
Connected to redshift-cluster-1.XXXXX.us-east-1.redshift.amazonaws.com.
Escape character is '^]'.
請在 Amazon EMR 6.4.0 或更高版本中使用 Spark,以連線到您的 Amazon Redshift 叢集
請完成下列步驟:
- 若要連線到 Amazon EMR 主節點,請使用 SSH。
- 若要讀取 Amazon Redshift 資料表,請使用 JDBC 連接器。如需詳細資訊,請參閱連接器參數。
PySpark 範例:
[hadoop@ip-10-10-10-10 ~]$ pyspark
>>> from pyspark.sql import SQLContext
>>> sql_context = SQLContext(sc)
>>> url = "jdbc:redshift://<redshift-endpoint>:5439/dev?user=<user>&password=<password>"
>>> df = sql_context.read \
.format("io.github.spark_redshift_community.spark.redshift") \
.option("url", url) \
.option("query", "select * from table") \
.option("tempdir", "<tempdir>") \
.option("aws_iam_role", "<iam_role>") \
.load()
>>> df.show(2)
Spark-shell example:
[hadoop@ip-192-168-1-113 ~]$ spark-shell
scala> import org.apache.spark.sql._
scala> val sql_context = new SQLContext(sc)
scala> val url = "jdbc:redshift://<redshift-endpoint>:5439/dev?user=<user>&password=<password>"
scala> val df = sql_context.read.format("io.github.spark_redshift_community.spark.redshift").option("url", url).option("query", "select * from table").option("tempdir", "<tempdir>").option("aws_iam_role", "<iam_role>").load()
scala> df.show(2)
注意: 如需管理 JDBC 連線中使用之使用者憑證的其他安全選項,請參閱 Amazon Redshift 中的身分識別與存取管理。
相關資訊
透過 Amazon EMR 使用適用於 Apache Spark 的 Amazon Redshift 整合