Amazon web services 如何连接到Amazon Redshift或其他DB';什么在阿帕奇星火?

Amazon web services 如何连接到Amazon Redshift或其他DB';什么在阿帕奇星火?,amazon-web-services,amazon-s3,apache-spark,amazon-redshift,Amazon Web Services,Amazon S3,Apache Spark,Amazon Redshift,我正试图通过Spark连接到Amazon Redshift,这样我就可以将S3上的数据与RS集群上的数据连接起来。我在这里找到了一些非常简洁的文档,用于连接JDBC: load命令看起来相当简单(虽然我不知道如何在这里输入AWS凭据,可能在选项中?) 我不完全确定如何处理SPARK_类路径变量。我现在通过iPython笔记本在本地运行Spark(作为Spark分发的一部分)。我在哪里定义它以便Spark加载它 无论如何,现在,当我试着运行这些命令时,我会遇到一大堆无法解释的错误,所以我现在有点

我正试图通过Spark连接到Amazon Redshift,这样我就可以将S3上的数据与RS集群上的数据连接起来。我在这里找到了一些非常简洁的文档,用于连接JDBC:

load命令看起来相当简单(虽然我不知道如何在这里输入AWS凭据,可能在选项中?)

我不完全确定如何处理SPARK_类路径变量。我现在通过iPython笔记本在本地运行Spark(作为Spark分发的一部分)。我在哪里定义它以便Spark加载它


无论如何,现在,当我试着运行这些命令时,我会遇到一大堆无法解释的错误,所以我现在有点困了。非常感谢您的帮助或详细教程的指导。

您首先需要下载Postgres JDBC驱动程序。你可以在这里找到它:

您可以在
.bashrc
、conf/SPARK-env.sh或类似文件中定义环境变量SPARK\u CLASSPATH,或者在运行IPython笔记本之前在脚本中指定它

您还可以在conf/spark-defaults.conf中按以下方式定义它:

spark.driver.extraClassPath  /path/to/file/postgresql-9.4-1201.jdbc41.jar
确保它反映在Spark WebUI的环境选项卡中

您还需要通过以下方式设置适当的AWS凭据:

sparkContext.hadoopConfiguration.set("fs.s3n.awsAccessKeyId", "***")
sparkContext.hadoopConfiguration.set("fs.s3n.awsSecretAccessKey", "***")

事实证明,您只需要用户名/pwd就可以访问Spark中的红移,操作如下(使用Python API):


希望这对别人有帮助

如果您使用的是Spark 1.4.0或更新版本,请查看一个库,它支持将数据从红移加载到Spark SQL数据帧,并将数据帧保存回红移。如果要查询大量数据,这种方法的性能应该比JDBC更好,因为它能够并行地卸载和查询数据

如果您仍然想使用JDBC,请查看Spark 1.4+中的新版本


披露:我是《星火红移》(spark redshift)的作者之一,虽然这似乎是一篇非常古老的文章,但任何仍在寻找答案的人,下面的步骤都为我工作

启动包含jar的shell

bin/pyspark --driver-class-path /path_to_postgresql-42.1.4.jar --jars /path_to_postgresql-42.1.4.jar
通过提供适当的详细信息创建df:

myDF = spark.read \
    .format("jdbc") \
    .option("url", "jdbc:redshift://host:port/db_name") \
    .option("dbtable", "table_name") \
    .option("user", "user_name") \
    .option("password", "password") \
    .load()

Spark版本:2.2

这在使用Spark 2.4的AWS胶水的Scala中适用:

The simplest way to make a jdbc connection to Redshift using python is as follows:

# -*- coding: utf-8 -*-
from pyspark.sql import SparkSession

jdbc_url = "jdbc:redshift://xxx.xxx.redshift.amazonaws.com:5439/xxx"
jdbc_user = "xxx"
jdbc_password = "xxx"
jdbc_driver = "com.databricks.spark.redshift"

spark = SparkSession.builder.master("yarn") \
.config("hive.metastore.client.factory.class", "com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory") \
.enableHiveSupport().getOrCreate()

# Read data from a query
df = spark.read \
    .format(jdbc_driver) \
    .option("url", jdbc_url + "?user="+ jdbc_user +"&password="+ jdbc_password) \
    .option("query", "your query") \
    .load()
val spark: SparkContext = new SparkContext()
val glueContext: GlueContext = new GlueContext(spark)
Job.init(args("JOB_NAME"), glueContext, args.asJava)

val sqlContext = new org.apache.spark.sql.SQLContext(spark)
val jdbcDF = sqlContext.read.format("jdbc").options(
  Map("url" -> "jdbc:postgresql://HOST:PORT/DBNAME?user=USERNAME&password=PASSWORD",
  "dbtable" -> "(SELECT a.row_name FROM schema_name.table_name a) as from_redshift")).load()

// back to DynamicFrame
val datasource0 = DynamicFrame(jdbcDF, glueContext)

可用于任何SQL查询。

谢谢!我现在可以在Environment选项卡中看到postgres类,所以这似乎起到了作用。但是,在尝试运行AWS seetings之后,我遇到了以下错误:“AttributeError:‘SparkContext’对象没有属性‘hadoopConfiguration’”——可能有更新的设置吗?因此,在进行一些研究后,我发现hadoopConfiguration仅在Scala API中可用。我正在使用Python。有什么解决方法吗?通常最好保持SparkContext不可变,所以在创建SparkContext时传递所有配置。但是,在Ipython笔记本电脑中,您可能需要更改它,因为sc是为您创建的。在这种情况下,您可以通过
sc.\u jsc
访问sc的java方法。HTH@JoseRosen我可以知道spark redshift是否支持更新几行吗?在红移中只更新几行最好的方法是什么?@santhosh:
spark-redshift
目前不支持upserts;请参见注释:不再公开维护。Databricks选择将其完全私有化,并且不在其集群映像之外发布任何进一步的更新。有关当前使用Postgres驱动程序的方法,请参见@Sumit的答案。我不使用Scala api,但我认为它没有那么大的不同。我尝试了上述解决方案,但由于找不到驱动程序而失败。有特殊的postgresql驱动程序吗?我使用的是42.2.5。
The simplest way to make a jdbc connection to Redshift using python is as follows:

# -*- coding: utf-8 -*-
from pyspark.sql import SparkSession

jdbc_url = "jdbc:redshift://xxx.xxx.redshift.amazonaws.com:5439/xxx"
jdbc_user = "xxx"
jdbc_password = "xxx"
jdbc_driver = "com.databricks.spark.redshift"

spark = SparkSession.builder.master("yarn") \
.config("hive.metastore.client.factory.class", "com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory") \
.enableHiveSupport().getOrCreate()

# Read data from a query
df = spark.read \
    .format(jdbc_driver) \
    .option("url", jdbc_url + "?user="+ jdbc_user +"&password="+ jdbc_password) \
    .option("query", "your query") \
    .load()
val spark: SparkContext = new SparkContext()
val glueContext: GlueContext = new GlueContext(spark)
Job.init(args("JOB_NAME"), glueContext, args.asJava)

val sqlContext = new org.apache.spark.sql.SQLContext(spark)
val jdbcDF = sqlContext.read.format("jdbc").options(
  Map("url" -> "jdbc:postgresql://HOST:PORT/DBNAME?user=USERNAME&password=PASSWORD",
  "dbtable" -> "(SELECT a.row_name FROM schema_name.table_name a) as from_redshift")).load()

// back to DynamicFrame
val datasource0 = DynamicFrame(jdbcDF, glueContext)