我尝试将Spark与Amazon Redshift连接,但收到以下错误:
代码如下:
from pyspark.sql import SQLContext
from pyspark import SparkContext
sc = SparkContext(appName="Connect Spark with Redshift")
sql_context = SQLContext(sc)
sc._jsc.hadoopConfiguration().set("fs.s3n.awsAccessKeyId", <ACCESSID>)
sc._jsc.hadoopConfiguration().set("fs.s3n.awsSecretAccessKey", <ACCESSKEY>)
df = sql_context.read \
.option("url", "jdbc:redshift://example.coyf2i236wts.eu-central- 1.redshift.amazonaws.com:5439/agcdb?user=user&password=pwd") \
.option("dbtable", "table_name") \
.option("tempdir", "bucket") \
.load()
7条答案
按热度按时间s71maibg1#
这里是一步一步地连接到红移的过程。
wr98u20j2#
如果您正在使用Spark 2.0.4并在AWS EMR集群上运行代码,请按照以下步骤操作:
1)使用以下命令下载Redshift JDBC jar:
参考:-AWS Document
2)将下面提到的代码复制到python文件中,然后将所需的值替换为您的AWS资源:
3)运行下面的spark-submit命令:
注:-
1)Reshift集群安全组入站规则中应允许EMR节点(spark-submit作业将在其上运行)的公网IP地址。
2)Redshift集群和在“tempdir”下使用的S3位置应该在相同的地理位置。在上面的示例中,两个资源都在us-west-1中。
3)如果数据敏感,请确保所有通道的安全。要确保连接安全,请按照此处配置中提到的步骤操作。
rkkpypqq3#
错误是由于缺少依赖项。
验证spark主目录中是否有这些jar文件:
1.(aws-java-sdk-s3-1.11.60.jar)(较新的版本,但不是所有的东西都能用)
将这些jar文件放在$SPARK_HOME/jars/中,然后启动spark
(SPARK_HOME应该是=“/usr/local/Cellar/apache-spark/$SPARK_VERSION/libexec”)
这将运行带有所有必要依赖项的Spark。请注意,如果使用awsAccessKeys,还需要指定身份验证类型'forward_spark_s3_credentials'= True。
之后的常见错误是:
.option("url", "jdbc:redshift://example.coyf2i236wts.eu-central- 1.redshift.amazonaws.com:5439/agcdb?user=user&password=pwd?ssl=true&sslfactory=org.postgresql.ssl.NonValidatingFactory")
csbfibhn4#
如果你正在使用数据块,我认为你不必创建一个新的sql Context,因为它们会这样做,因为你只需要使用sqlContext,试试下面的代码:
可能是铲斗没有安装
l5tcr1uw5#
这个问题我回答得有点晚了,但是我花了很多时间尝试将pyspark的本地示例连接到amazon Redshift。我使用的是Mac,所以您的配置可能会略有不同。我得出的结果假设如下:
为了连接,我需要url格式的凭据(我正在努力让IAM角色工作,这使用基本的身份验证):
最后
qnakjoqk6#
我认为
s3n://
URL样式已被弃用和/或删除。尝试将密钥定义为
"fs.s3.awsAccessKeyId"
。ltskdhd17#
我认为您需要将
.format("com.databricks.spark.redshift")
添加到sql_context.read
调用中;我的直觉是Spark不能推断出这个数据源的格式,所以你需要明确指定我们应该使用spark-redshift
连接器。有关此错误的详细信息,请参阅https://github.com/databricks/spark-redshift/issues/230