MongoDB Spark连接器py4j.protocol.Py4JJavaError:调用o50.load时出错

vcirk6k6  于 2023-06-29  发布在  Go
关注(0)|答案(2)|浏览(118)

我以前能够加载这个MongoDB数据库,但现在收到一个我无法弄清楚的错误。
以下是我如何开始Spark会话:

spark = SparkSession.builder \
        .master("local[*]") \
        .appName("collab_rec") \
        .config("spark.mongodb.input.uri", "mongodb://127.0.0.1/example.collection") \
        .config("spark.mongodb.output.uri", "mongodb://127.0.0.1/example.collection") \
        .getOrCreate()

我运行这个脚本,这样我就可以通过ipython与spark交互,ipython加载mongo spark连接器包:

#!/bin/bash
export PYSPARK_DRIVER_PYTHON=ipython

${SPARK_HOME}/bin/pyspark \
--master local[4] \
--executor-memory 1G \
--driver-memory 1G \
--conf spark.sql.warehouse.dir="file:///tmp/spark-warehouse" \
--packages com.databricks:spark-csv_2.11:1.5.0 \
--packages com.amazonaws:aws-java-sdk-pom:1.10.34 \
--packages org.apache.hadoop:hadoop-aws:2.7.3 \
--packages org.mongodb.spark:mongo-spark-connector_2.11:2.0.0\

Spark加载正常,并且看起来包也正确加载。
下面是我如何尝试将该数据库加载到dataframe中:

df = spark.read.format("com.mongodb.spark.sql.DefaultSource").load()

但是,在这一行,我收到以下错误:

Py4JJavaError: An error occurred while calling o46.load.
: org.apache.spark.SparkException: Job aborted due to stage failure: Task 0 in stage 0.0 failed 1 times, most recent failure: Lost task 0.0 in stage 0.0 (TID 0, localhost, executor driver): java.lang.NoSuchMethodError: org.apache.spark.sql.catalyst.analysis.TypeCoercion$.findTightestCommonTypeOfTwo()Lscala/Function2;
    at com.mongodb.spark.sql.MongoInferSchema$.com$mongodb$spark$sql$MongoInferSchema$$compatibleType(MongoInferSchema.scala:132)
    at com.mongodb.spark.sql.MongoInferSchema$$anonfun$3.apply(MongoInferSchema.scala:76)
    at com.mongodb.spark.sql.MongoInferSchema$$anonfun$3.apply(MongoInferSchema.scala:76)

从下面的文档/教程中可以看出,我正在尝试正确加载dataframe:
https://docs.mongodb.com/spark-connector/master/python-api/
我用的是Spark 2.2.0。请注意,我已经能够通过AWS在我的Mac和Linux上复制此错误。

trnvg8h3

trnvg8h31#

我找到了问题的答案。这是Mongo-Spark连接器和我升级到的Spark版本的兼容性问题。具体而言,在PR中重命名了findTightestCommonTypeOfTwo值:
https://github.com/apache/spark/pull/16786/files
对于Spark 2.2.0,兼容的Mongo-Spark连接器也是2.2.0,因此在我的示例中,包将像这样加载:

--packages org.mongodb.spark:mongo-spark-connector_2.11:2.2.0\

这可能会在未来发生变化,因此在使用连接器时,您应该检查与所使用的Spark版本的兼容性。

jv4diomz

jv4diomz2#

mongo-spark-connector JAR文件需要与所使用的Spark版本兼容。
可以从here下载不同版本的JAR文件。下载页面上的XML文件指出了

  • Apache-Spark
  • Scala
  • 和其他依赖包

确保这与本地环境中安装的内容匹配。
要检查安装的Spark版本,请在路径中添加Spark后运行spark-submit

相关问题