【问题标题】:spark-nlp : DocumentAssembler initializing failing with 'java.lang.NoClassDefFoundError: org/apache/spark/ml/util/MLWritable$class'spark-nlp:DocumentAssembler 初始化失败,出现“java.lang.NoClassDefFoundError: org/apache/spark/ml/util/MLWritable$class”
【发布时间】:2020-12-03 11:29:23
【问题描述】:

我正在试用 https://medium.com/spark-nlp/applying-context-aware-spell-checking-in-spark-nlp-3c29c46963bc 中提供的 ContenxtAwareSpellChecker

管道中的第一个组件是DocumentAssembler

from sparknlp.annotator import *
from sparknlp.base import *
import sparknlp


spark = sparknlp.start()
documentAssembler = DocumentAssembler()\
    .setInputCol("text")\
    .setOutputCol("document")

上面的代码运行失败如下

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Users\pab\AppData\Local\Continuum\anaconda3.7\envs\MailChecker\lib\site-packages\pyspark\__init__.py", line 110, in wrapper
    return func(self, **kwargs)
  File "C:\Users\pab\AppData\Local\Continuum\anaconda3.7\envs\MailChecker\lib\site-packages\sparknlp\base.py", line 148, in __init__
    super(DocumentAssembler, self).__init__(classname="com.johnsnowlabs.nlp.DocumentAssembler")
  File "C:\Users\pab\AppData\Local\Continuum\anaconda3.7\envs\MailChecker\lib\site-packages\pyspark\__init__.py", line 110, in wrapper
    return func(self, **kwargs)
  File "C:\Users\pab\AppData\Local\Continuum\anaconda3.7\envs\MailChecker\lib\site-packages\sparknlp\internal.py", line 72, in __init__
    self._java_obj = self._new_java_obj(classname, self.uid)
  File "C:\Users\pab\AppData\Local\Continuum\anaconda3.7\envs\MailChecker\lib\site-packages\pyspark\ml\wrapper.py", line 69, in _new_java_obj
    return java_obj(*java_args)
  File "C:\Users\pab\AppData\Local\Continuum\anaconda3.7\envs\MailChecker\lib\site-packages\pyspark\python\lib\py4j-0.10.9-src.zip\py4j\java_gateway.py", line 1569, in __call__
  File "C:\Users\pab\AppData\Local\Continuum\anaconda3.7\envs\MailChecker\lib\site-packages\pyspark\sql\utils.py", line 131, in deco
    return f(*a, **kw)
  File "C:\Users\pab\AppData\Local\Continuum\anaconda3.7\envs\MailChecker\lib\site-packages\pyspark\python\lib\py4j-0.10.9-src.zip\py4j\protocol.py", line 328, in get_return_value
py4j.protocol.Py4JJavaError: An error occurred while calling None.com.johnsnowlabs.nlp.DocumentAssembler.
: java.lang.NoClassDefFoundError: org/apache/spark/ml/util/MLWritable$class
        at com.johnsnowlabs.nlp.DocumentAssembler.<init>(DocumentAssembler.scala:16)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
        at py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:247)
        at py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:357)
        at py4j.Gateway.invoke(Gateway.java:238)
        at py4j.commands.ConstructorCommand.invokeConstructor(ConstructorCommand.java:80)
        at py4j.commands.ConstructorCommand.execute(ConstructorCommand.java:69)
        at py4j.GatewayConnection.run(GatewayConnection.java:238)
        at java.lang.Thread.run(Thread.java:748)

编辑:Apache Spark 版本是 2.4.6

【问题讨论】:

  • 在 MacOS 上使用 Spark 2.4.6 运行良好,从 Conda 安装软件包,然后以 pyspark --packages com.johnsnowlabs.nlp:spark-nlp_2.11:2.5.5 运行 pyspark

标签: python apache-spark pyspark johnsnowlabs-spark-nlp


【解决方案1】:

我在从 spark 2.45 升级到 spark 3+ 时遇到了这个问题(尽管在带有 Scala 的 Databricks 上)。尝试降级您的 spark 版本。

【讨论】:

  • 嗨杰米,看起来我错过了提到问题中的版本(我会更正)。我的 spark 版本是 2.4.6 而不是 3。你还建议降级吗?
  • 不会有伤害的。作为完整参考,我在 Databricks 6.6、Spark 2.45、Scala 2.11 上运行。您是否尝试过使用 Scala API 查看它是否有效?
  • 我正在使用 spark2.4.4。还是一样的问题
【解决方案2】:

Apache Spark 中的MLReadableMLWritable 错误总是与 Spark 主要版本不匹配有关。 (更准确地说,有些东西是用一个 Scala 版本(如 2.11.x)编译/交付的,现在正在另一个版本(如 2.12.x)中使用——就像你使用本应在 PySpark 3.x 中使用的 Spark NLP 人工制品时一样,但它是在 PySpark 2.4.x 中,反之亦然)

Spark NLP 支持 Apache Spark 的所有主要版本(取决于您使用的 spark-nlp 版本)。但截至今天,兼容性矩阵如下:

Spark NLP Apache Spark 2.3.x Apache Spark 2.4.x Apache Spark 3.0.x Apache Spark 3.1.x
3.3.x YES YES YES YES
3.2.x YES YES YES YES
3.1.x YES YES YES YES
3.0.x YES YES YES YES
2.7.x YES YES NO NO
2.6.x YES YES NO NO
2.5.x YES YES NO NO
2.4.x Partially YES NO NO
1.8.x Partially YES NO NO
1.7.x YES NO NO NO
1.6.x YES NO NO NO
1.5.x YES NO NO NO

正如您所见,自 Spark NLP 3.0.x 以来,所有主要的 Apache Spark 版本都受支持。主要版本,例如 2.3.x(针对那些困在旧 Hortonworks 中的人)、2.4.x(针对那些困在 Cloudera 5.x/6.x 中的人)、3.0.x3.1.x(在 Databricks 上) 、EMR 和任何其他提供新 Spark/PySpark 版本的地方)。

因此,您无需降级/升级(如果可以的话,这很酷!)您的 Apache Spark/PySpark 即可使用任何高于 3.0.x 的 Spark NLP 版本。这里的关键是找到正确的 Maven 包以包含在您的 SparkSession 中。

手动创建 SparkSession

例如,如果你想使用 Spark NLP 3.3.4 发布:

  • 在 Spark/PySpark 3.0.x/3.1.x 中:com.johnsnowlabs.nlp:spark-nlp_2.12:3.3.4
  • 在 Spark/PySpark 2.4.x 中:com.johnsnowlabs.nlp:spark-nlp-spark24_2.11:3.3.4
  • 在 Spark/PySpark 2.3.x 中:com.johnsnowlabs.nlp:spark-nlp-spark23_2.11:3.3.4

实际名称发生变化,PySpark 3.0.x 和 3.1.x 的默认名称为 spark-nlp_2.12,但对于 PySpark 2.4.x,它变为 spark-nlp-spark24_2.11,因为它基于 Scala 2.11。

自动创建 SparkSession

如果您希望使用sparknlp.start() 函数,您可以添加以下标志以使用正确的 Maven 包自动启动 SparkSession:

import sparknlp

# for PySpark 3.0.x and 3.1.x
spark = sparknlp.start()

# for PySpark 2.4.x
spark = sparknlp.start(spark24=True)

# or for PySpark 2.3.x
spark = sparknlp.start(spark23=True)

我还想指出这个关于MLReadableMLWritable 错误的讨论:

Why do I see serialVersionUID or MLReadable or MLWritable errors

完全披露:我是 Spark NLP 的维护者之一。

【讨论】:

    猜你喜欢
    • 2015-08-20
    • 2017-03-10
    • 2020-08-31
    • 1970-01-01
    • 1970-01-01
    • 2019-06-01
    • 2018-03-10
    • 1970-01-01
    相关资源
    最近更新 更多