Локальные данные не могут быть прочитаны в кластере Dataproc при использовании SparkNLP

Я пытаюсь создать кластер Dataproc с установленным в нем Spark NLP, а затем быстро протестировать его, прочитав некоторые данные CoNLL 2003. Во-первых, я использовал эту кодовую лабораторию в качестве вдохновения для создания своего собственного кластера меньшего размера (project имя было отредактировано в целях безопасности):

gcloud dataproc clusters create s17-sparknlp-experiments \
     --enable-component-gateway \
     --region us-west1 \
     --metadata 'PIP_PACKAGES=google-cloud-storage spark-nlp==2.5.5' \
     --zone us-west1-a \
     --single-node \
     --master-machine-type n1-standard-4 \
     --master-boot-disk-size 35 \
     --image-version 1.5-debian10 \
     --initialization-actions gs://dataproc-initialization-actions/python/pip-install.sh \
     --optional-components JUPYTER,ANACONDA \
     --project my-project

Я запустил предыдущий кластер через JupyterLab, затем загрузил эти файлы CoNLL 2003 в ~/original каталог, существующий в корневом каталоге. Если все сделано правильно, при выполнении этих команд:

cd / && head -n 5 original/eng.train

Должен получиться следующий результат:

-DOCSTART- -X- -X- O

EU NNP B-NP B-ORG
rejects VBZ B-VP O
German JJ B-NP B-MISC

Это означает, что эти файлы должны быть доступны для чтения в следующем коде Python, существующем в одноячейке Jupyter Notebook:

from pyspark.ml import Pipeline
from pyspark.sql import SparkSession
from sparknlp.annotator import *
from sparknlp.base import *
from sparknlp.common import *
from sparknlp.training import CoNLL
import sparknlp

spark = sparknlp.start()
print("Spark NLP version: ", sparknlp.version())  # 2.4.4
print("Apache Spark version: ", spark.version)    # 2.4.8

# Other info of possible interest:
# Python 3.6.13 :: Anaconda, Inc.
# openjdk version "1.8.0_312"
# OpenJDK Runtime Environment (Temurin)(build 1.8.0_312-b07)
# OpenJDK 64-Bit Server VM (Temurin)(build 25.312-b07, mixed mode)

training_data = CoNLL().readDataset(spark, 'original/eng.train')  # The exact same path used before...
training_data.show()

Вместо этого возникает следующая ошибка:

---------------------------------------------------------------------------
Py4JJavaError                             Traceback (most recent call last)
<ipython-input-4-2b145ab3b733> in <module>
----> 1 training_data = CoNLL().readDataset(spark, 'original/eng.train')
      2 training_data.show()

/opt/conda/anaconda/lib/python3.6/site-packages/sparknlp/training.py in readDataset(self, spark, path, read_as)
     32         jSession = spark._jsparkSession
     33 
---> 34         jdf = self._java_obj.readDataset(jSession, path, read_as)
     35         return DataFrame(jdf, spark._wrapped)
     36 

/opt/conda/anaconda/lib/python3.6/site-packages/py4j/java_gateway.py in __call__(self, *args)
   1255         answer = self.gateway_client.send_command(command)
   1256         return_value = get_return_value(
-> 1257             answer, self.gateway_client, self.target_id, self.name)
   1258 
   1259         for temp_arg in temp_args:

/usr/lib/spark/python/pyspark/sql/utils.py in deco(*a, **kw)
     61     def deco(*a, **kw):
     62         try:
---> 63             return f(*a, **kw)
     64         except py4j.protocol.Py4JJavaError as e:
     65             s = e.java_exception.toString()

/opt/conda/anaconda/lib/python3.6/site-packages/py4j/protocol.py in get_return_value(answer, gateway_client, target_id, name)
    326                 raise Py4JJavaError(
    327                     "An error occurred while calling {0}{1}{2}.\n".
--> 328                     format(target_id, ".", name), value)
    329             else:
    330                 raise Py4JError(

Py4JJavaError: An error occurred while calling o87.readDataset.
: java.io.FileNotFoundException: file or folder: original/eng.train not found
    at com.johnsnowlabs.nlp.util.io.ResourceHelper$SourceStream.<init>(ResourceHelper.scala:44)
    at com.johnsnowlabs.nlp.util.io.ResourceHelper$.parseLines(ResourceHelper.scala:215)
    at com.johnsnowlabs.nlp.training.CoNLL.readDocs(CoNLL.scala:31)
    at com.johnsnowlabs.nlp.training.CoNLL.readDataset(CoNLL.scala:198)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:244)
    at py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:357)
    at py4j.Gateway.invoke(Gateway.java:282)
    at py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:132)
    at py4j.commands.CallCommand.execute(CallCommand.java:79)
    at py4j.GatewayConnection.run(GatewayConnection.java:238)
    at java.lang.Thread.run(Thread.java:748)

ВОПРОС: Что здесь может быть не так?

вы можете прочитать их, когда они находятся на некоторых DBFS?

AlbertoAndreotti 17.11.2022 13:10
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
1
110
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я думаю, проблема связана с тем, что как вы можете видеть в исходном коде библиотеки (1 2) CoNLL().readDataset() считывается информация из HDFS.

Вы загрузили необходимые файлы и распаковали их в файловой системе главного узла кластера, но вам необходимо сделать этот контент доступным через HDFS.

Пожалуйста, попробуйте скопировать его в HDFS и повторите тест.

Ответ принят как подходящий

@jccampanero направил меня в правильном направлении, однако с некоторыми изменениями. В частности, вы должны хранить файлы, которые хотите импортировать, в какой-либо корзине Google Cloud Storage; затем используйте URI этого файла в readDataset:

training_data = CoNLL().readDataset(spark, 'gs://my-bucket/subfolders/eng.train')

Это не единственный верный вариант для достижения того, что я ищу, есть еще .

Я очень рад слышать, что вы смогли найти решение. Извините, приятель, я должен был указать на использование GCS в качестве возможного решения.

jccampanero 17.11.2022 23:25

Другие вопросы по теме