如何解决如何在AWS Glue中使用Spark软件包?
我想在AWS Glue中使用Datastax的spark-cassandra-connector。如果我在本地运行pyspark,则命令如下所示:
path/to/spark-3.0.1-bin-hadoop2.7/bin/spark-submit \
--conf spark.cassandra.connection.host=XXX \
--conf spark.cassandra.auth.username=XXX \
--conf spark.cassandra.auth.password=XXX \
--packages com.datastax.spark:spark-cassandra-connector_2.12:2.5.1 \
~/my_script.py
如何在Glue中运行此脚本?
我尝试过的事情
-
How to import Spark packages in AWS Glue?看起来与我的问题相似。可接受的答案是关于添加压缩的python模块作为参数的。但是
spark-cassandra-connector
不是python模块。
错误:
File "/tmp/delta_on_s3_spark.py",line 75,in _write_df_to_cassandra
df.write.format(format_).mode('append').options(table=table,keyspace=keyspace).save()
File "/opt/amazon/spark/python/lib/pyspark.zip/pyspark/sql/readwriter.py",line 732,in save
self._jwrite.save()
File "/opt/amazon/spark/python/lib/py4j-0.10.7-src.zip/py4j/java_gateway.py",line 1257,in __call__
answer,self.gateway_client,self.target_id,self.name)
File "/opt/amazon/spark/python/lib/pyspark.zip/pyspark/sql/utils.py",line 63,in deco
return f(*a,**kw)
File "/opt/amazon/spark/python/lib/py4j-0.10.7-src.zip/py4j/protocol.py",line 328,in get_return_value
format(target_id,".",name),value)
py4j.protocol.Py4JJavaError: An error occurred while calling o84.save.
: java.lang.NoSuchMethodError: scala.Product.$init$(Lscala/Product;)V
at com.datastax.spark.connector.TableRef.<init>(TableRef.scala:4)
at org.apache.spark.sql.cassandra.DefaultSource$.TableRefAndOptions(DefaultSource.scala:142)
at org.apache.spark.sql.cassandra.DefaultSource.createRelation(DefaultSource.scala:83)
......
- (根据@alex的评论)将
spark.jars.packages = com.datastax.spark:spark-cassandra-connector_2.12:2.5.1
放入胶水工作的job parameter
错误:
File "/tmp/delta_on_s3_spark.py",value)
py4j.protocol.Py4JJavaError: An error occurred while calling o83.save.
: java.lang.ClassNotFoundException: Failed to find data source: org.apache.spark.sql.cassandra. Please find packages at http://spark.apache.org/third-party-projects.html
at org.apache.spark.sql.execution.datasources.DataSource$.lookupDataSource(DataSource.scala:657)
at org.apache.spark.sql.DataFrameWriter.save(DataFrameWriter.scala:245)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
......
解决方法
推荐的方法是将--packages
或--conf spark.jars.packages
与Maven坐标一起使用,因此Spark将正确提取Spark Cassandra Connector(Java驱动程序等)使用的所有必要依赖项-如果使用--jars
只有SCC jar,那么您的工作将会失败。
从SCC 2.5.1开始,还有一个新工件-spark-cassandra-connector-assembly,其中包含所有必要的依赖项。有了它,您可以避免依赖项冲突的问题,并且可以将其与--jars
或Glue job的Jar lib路径一起使用。
P.S。对于Spark 3.0,建议使用SCC 3.0.0-beta,因为Spark SQL的内部结构发生了重大变化。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。