Как использовать Pandas UDFs в macOS Mojave? (возможно, выполнялся сбой из-за [__NSPlaceholderDictionary initialize] …)

#apache-spark #pyspark #pyspark-sql #pyarrow

#apache-spark #pyspark #apache-spark-sql #pyarrow

Вопрос:

Я пытаюсь использовать Pandas UDFs (он же векторизованный UDFS) в Apache Spark 2.4.0 в macOS 10.14.3 (macOS Mojave).

Я установил pandas и pyarrow использую pip (и более поздние pip3 версии).

Всякий раз, когда я выполняю пример кода из официальной документации Spark SQL, я получаю следующее исключение.

 import pandas as pd

from pyspark.sql.functions import col, pandas_udf
from pyspark.sql.types import LongType

def multiply_func(a, b):
    return a * b

multiply = pandas_udf(multiply_func, returnType=LongType())

x = pd.Series([1, 2, 3])
print(multiply_func(x, x))
df = spark.createDataFrame(pd.DataFrame(x, columns=["x"]))

# Execute function as a Spark vectorized UDF
df.select(multiply(col("x"), col("x"))).show()
  

Исключение заключается в следующем:

 objc[97883]:  [__NSPlaceholderDictionary initialize] may have been in progress in another thread when fork() was called.
objc[97883]:  [__NSPlaceholderDictionary initialize] may have been in progress in another thread when fork() was called. We cannot safely call it or ignore it in the fork() child process. Crashing instead. Set a breakpoint on objc_initializeAfterForkError to debug.
19/03/27 15:01:20 ERROR Executor: Exception in task 0.0 in stage 0.0 (TID 0)
org.apache.spark.SparkException: Python worker exited unexpectedly (crashed)
    at org.apache.spark.api.python.BasePythonRunner$ReaderIterator$$anonfun$1.applyOrElse(PythonRunner.scala:486)
    at org.apache.spark.api.python.BasePythonRunner$ReaderIterator$$anonfun$1.applyOrElse(PythonRunner.scala:475)
    at scala.runtime.AbstractPartialFunction.apply(AbstractPartialFunction.scala:34)
    at org.apache.spark.sql.execution.python.ArrowPythonRunner$$anon$1.read(ArrowPythonRunner.scala:178)
    at org.apache.spark.sql.execution.python.ArrowPythonRunner$$anon$1.read(ArrowPythonRunner.scala:122)
    at org.apache.spark.api.python.BasePythonRunner$ReaderIterator.hasNext(PythonRunner.scala:406)
    at org.apache.spark.InterruptibleIterator.hasNext(InterruptibleIterator.scala:37)
    at org.apache.spark.sql.execution.python.ArrowEvalPythonExec$$anon$2.<init>(ArrowEvalPythonExec.scala:98)
    at org.apache.spark.sql.execution.python.ArrowEvalPythonExec.evaluate(ArrowEvalPythonExec.scala:96)
    at org.apache.spark.sql.execution.python.EvalPythonExec.$anonfun$doExecute$2(EvalPythonExec.scala:128)
    ...
Caused by: java.io.EOFException
    at java.io.DataInputStream.readInt(DataInputStream.java:392)
    at org.apache.spark.sql.execution.python.ArrowPythonRunner$$anon$1.read(ArrowPythonRunner.scala:159)
    ... 28 more
  

Ответ №1:

Я нашел решение в Не работает на macOS High Sierra # 69 и подумал, что опубликую его в StackOverflow.


Вы должны убедиться, что инструменты командной строки Xcode уже установлены. Если нет, выполните следующее:

 xcode-select --install
  

Что оказалось очень важным, так это экспортировать OBJC_DISABLE_INITIALIZE_FORK_SAFETY env var:

 export OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES
  

С двумя приведенными выше кодами все работало нормально:

 >>> # Execute function as a Spark vectorized UDF
... df.select(multiply(col("x"), col("x"))).show()
[Stage 0:>                                                          (0   1) / 1]/usr/local/lib/python3.7/site-packages/pyarrow/__init__.py:159: UserWarning: pyarrow.open_stream is deprecated, please use pyarrow.ipc.open_stream
  warnings.warn("pyarrow.open_stream is deprecated, please use "
/usr/local/lib/python3.7/site-packages/pyarrow/__init__.py:159: UserWarning: pyarrow.open_stream is deprecated, please use pyarrow.ipc.open_stream
  warnings.warn("pyarrow.open_stream is deprecated, please use "
/usr/local/lib/python3.7/site-packages/pyarrow/__init__.py:159: UserWarning: pyarrow.open_stream is deprecated, please use pyarrow.ipc.open_stream
  warnings.warn("pyarrow.open_stream is deprecated, please use "
/usr/local/lib/python3.7/site-packages/pyarrow/__init__.py:159: UserWarning: pyarrow.open_stream is deprecated, please use pyarrow.ipc.open_stream
  warnings.warn("pyarrow.open_stream is deprecated, please use "
 ------------------- 
|multiply_func(x, x)|
 ------------------- 
|                  1|
|                  4|
|                  9|
 ------------------- 
  

Комментарии:

1. Возможно, вопрос с дампом, но вы ссылаетесь на проект ruby. Почему при использовании pandas udfs важно установить эту переменную среды в macOS High Sierra. И ожидает ответа.

2. Могу я попросить вас указать мне на «вы ссылаетесь на проект ruby»? Где этот «ruby»?

3. Ссылка не работает в macOS High Sierra # 69 на поток в проекте GitHub, который использует язык программирования Ruby. Это то, что я имел в виду под «проектом Ruby». Я просто не понимаю, как вы подключили этот поток к Pandas UDF 🙂

4. Ах, хорошо, понял. Еще раз спасибо! 🙂

5. Важно упомянуть: если вы запускаете его из IDE, вам следует установить переменную среды, конечно, в IDE. Это то, что у меня не работало.