首页 文章

将PySpark连接到AWS Redshift时出错

提问于
浏览
0

一直在尝试将我的EMR 5.11.0集群上的Spark 2.2.1连接到我们的Redshift商店 .

我遵循的方法是 -

  • 使用内置的Redshift JDBC
pyspark --jars /usr/share/aws/redshift/jdbc/RedshiftJDBC41.jar

from pyspark.sql import SQLContext
sc
sql_context = SQLContext(sc)

redshift_url = "jdbc:redshift://HOST:PORT/DATABASE?user=USER&password=PASSWORD"

redshift_query  = "select * from table;"

redshift_query_tempdir_storage = "s3://personal_warehouse/wip_dumps/"        

# Read data from a query
df_users = sql_context.read \
    .format("com.databricks.spark.redshift") \
    .option("url", redshift_url) \
    .option("query", redshift_query) \
    .option("tempdir", redshift_query_tempdir_storage) \
    .option("forward_spark_s3_credentials", "true") \
    .load()

这给了我以下错误 -

回溯(最近一次调用最后一次):文件“”,第7行,在文件“/usr/lib/spark/python/pyspark/sql/readwriter.py”,第165行,在加载返回self._df(self._jreader) .load())文件“/usr/lib/spark/python/lib/py4j-0.10.4-src.zip/py4j/java_gateway.py”,第1133行,在调用文件“/ usr / lib / spark / python中/pyspark/sql/utils.py“,第63行,在deco返回f(* a,kw)文件”/usr/lib/spark/python/lib/py4j-0.10.4-src.zip/py4j/protocol . py“,第319行,在get_return_value中*** py4j.protocol.Py4JJavaError:调用o63.load时发生错误 . :java.lang.ClassNotFoundException:无法找到数据源:com.databricks.spark.redshift . 请在orsp.apache的* org.apache.spark.sql.execution.datasources.DataSource $ .lookupDataSource(DataSource.scala:546)的http://spark.apache.org/third-party-projects.html上找到软件包 . 位于org.apache.spark的org.apache.spark.sql.execution.datasources.DataSource.providingClass(DataSource.scala:87)的.spark.sql.execution.datasources.DataSource.providingClass $ lzycompute(DataSource.scala:87) .sql.execution.datasources.DataSource.resolveRelation(DataSource.scala:302)org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:178)at org.apache.spark.sql.DataFrameReader.load(DataFrameReader) .scala:146)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)的sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method),位于java的sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) . lang.reflect.Method.invoke(Method.java:498)py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:244)at py4j.reflection.ReflectionEngine.invoke( ReflectionEngine.java:357)py4j.Gateway.invoke(Gateway.java:280)py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:132)py4j.commands.CallCommand.execute(CallCommand.java:79)at java.lang.Thread.run中的py4j.GatewayConnection.run(GatewayConnection.java:214)(Thread.java:748)由java.net中的java.lang.ClassNotFoundException:com.databricks.spark.redshift.DefaultSource引起 . 位于org.apache.spark.sql.execution的java.lang.ClassLoader.loadClass(ClassLoader.java:357)的java.lang.ClassLoader.loadClass(ClassLoader.java:424)中的URLClassLoader.findClass(URLClassLoader.java:381) .datasources.DataSource $$ anonfun $ 22 $$ anonfun $ apply $ 14.apply(DataSource.scala:530)at org.apache.spark.sql.execution.datasources.DataSource $$ anonfun $ 22 $$ anonfun $ apply $ 14.apply( DataSource.scala:530)在scala.util.Try $ .apply(Try.scala:192)org.apache.spark.sql.execution.datasources.DataSource $$ anonfun $ 22.apply(DataSource.scala:530)at at org.apache.spark.sql.execution.datasources.DataSource $$ anonfun $ 22.ap ply(DataSource.scala:530)位于org.apache.spark.sql.execution.datasources.DataSource $ .lookupDataSource(DataSource.scala:530)的scala.util.Try.orElse(Try.scala:84)...还有16个

有人可以帮忙告诉我哪里错过了什么/犯了一个愚蠢的错误?

谢谢!

3 回答

  • 1

    您需要将Spark Redshift数据源添加到 pyspark 命令:

    pyspark --jars /usr/share/aws/redshift/jdbc/RedshiftJDBC41.jar \
            --packages com.databricks:spark-redshift_2.11:2.0.1
    
  • 0

    我必须在EMR spark-submit选项中包含4个jar文件才能使其正常工作 .

    jar文件列表:

    1. RedshiftJDBC41-1.2.12.1017.jar

    2. spark-redshift_2.10-2.0.0.jar

    3. minimal-json-0.9.4.jar

    4. spark-avro_2.11-3.0.0.jar

    您可以下载jar文件并将它们存储在S3存储桶中,并在spark-submit选项中指向它:

    --jars s3://<pathToJarFile>/RedshiftJDBC41-1.2.10.1009.jar,s3://<pathToJarFile>/minimal-json-0.9.4.jar,s3://<pathToJarFile>/spark-avro_2.11-3.0.0.jar,s3://<pathToJarFile>/spark-redshift_2.10-2.0.0.jar
    

    然后最终像你的火花代码一样查询你的redshift:spark-redshift-example .

  • 0

    问题是火花在执行它的瞬间找不到必要的包 . 要在执行脚本.sh时执行此操作,启动python文件的执行,您不仅要添加驱动程序,还要添加必要的包 .

    脚本test.sh

    sudo pip install boto3
    
    spark-submit --jars RedshiftJDBC42-1.2.15.1025.jar --packages com.databricks:spark-redshift_2.11:2.0.1 test.py
    

    脚本test.py

    from pyspark.sql import SQLContext
    sc
    sql_context = SQLContext(sc)
    
    redshift_url = "jdbc:redshift://HOST:PORT/DATABASE?user=USER&password=PASSWORD"
    
    redshift_query  = "select * from table;"
    
    redshift_query_tempdir_storage = "s3://personal_warehouse/wip_dumps/" 
    
    
    
     # Read data from a query
    
    
    
    df_users = sql_context.read \
        .format("com.databricks.spark.redshift") \
        .option("url", redshift_url) \
        .option("query", redshift_query) \
        .option("tempdir", redshift_query_tempdir_storage) \
        .option("forward_spark_s3_credentials", "true") \
        .load()
    

    运行脚本test.sh

    sudo sh test.sh

    现在必须解决这个问题 .

相关问题