Ошибка при вызове сюжета init_notebook_mode с Jupyter (Apache Toree PySpark)
Я использую Jupyter (v4.2.1) с Apache Toree - PySpark. Когда я пытаюсь вызвать функцию plot_ init_notebook_mode, я сталкиваюсь со следующей ошибкой:
import numpy as np
import pandas as pd
import plotly.plotly as py
import plotly.graph_objs as go
from plotly import tools
from plotly.offline import iplot, init_notebook_mode
init_notebook_mode()
Ошибка:
Name: org.apache.toree.interpreter.broker.BrokerException
Message: Traceback (most recent call last):
File "/tmp/kernel-PySpark-6415c581-01c4-4c90-b4d9-81773c2bc03f/pyspark_runner.py", line 134, in <module>
eval(compiled_code)
File "<string>", line 7, in <module>
File "/usr/local/lib/python3.4/dist-packages/plotly/offline/offline.py", line 151, in init_notebook_mode
display(HTML(script_inject))
File "/usr/local/lib/python3.4/dist-packages/IPython/core/display.py", line 158, in display
format = InteractiveShell.instance().display_formatter.format
File "/usr/local/lib/python3.4/dist-packages/traitlets/config/configurable.py", line 412, in instance
inst = cls(*args, **kwargs)
File "/usr/local/lib/python3.4/dist-packages/IPython/core/interactiveshell.py", line 499, in __init__
self.init_io()
File "/usr/local/lib/python3.4/dist-packages/IPython/core/interactiveshell.py", line 658, in init_io
io.stdout = io.IOStream(sys.stdout)
File "/usr/local/lib/python3.4/dist-packages/IPython/utils/io.py", line 34, in __init__
raise ValueError("fallback required, but not specified")
ValueError: fallback required, but not specified
StackTrace: org.apache.toree.interpreter.broker.BrokerState$$anonfun$markFailure$1.apply(BrokerState.scala:140)
org.apache.toree.interpreter.broker.BrokerState$$anonfun$markFailure$1.apply(BrokerState.scala:140)
scala.Option.foreach(Option.scala:236)
org.apache.toree.interpreter.broker.BrokerState.markFailure(BrokerState.scala:139)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:498)
py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:231)
py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:381)
py4j.Gateway.invoke(Gateway.java:259)
py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:133)
py4j.commands.CallCommand.execute(CallCommand.java:79)
py4j.GatewayConnection.run(GatewayConnection.java:209)
java.lang.Thread.run(Thread.java:745)
Я не могу найти какую-либо информацию об этом в Интернете. Когда я копался в коде, где это не работает - io.py в утилитах IPython, я вижу, что передаваемый поток должен иметь как атрибуты - write, так и flush. Но по какой-то причине поток, переданный в этом случае - sys.stdout имеет только атрибут "write", а не атрибут "flush".
1 ответ
Я полагаю, что это происходит потому, что режим ноутбука plotly предполагает, что он работает внутри ядра IPython jupyter, осуществляющего взаимодействие с ноутбуком; вы видите в трассировке стека, что он пытается вызвать пакеты IPython.
Toree, однако, является другим ядром jupyter и имеет собственную обработку протокола для связи с сервером ноутбука. Даже когда вы используете toree для запуска интерпретатора PySpark, вы получаете "простой" PySpark (как и при запуске из оболочки), и toree управляет вводом / выводом этого интерпретатора.
Таким образом, механизм IPython не настроен, и вызов init_notebook_mode() в этой среде не удастся, как если бы вы работали в PySpark, запущенном непосредственно из оболочки, которая ничего не знает о ноутбуках.
Насколько мне известно, в настоящее время нет способа получить результаты печати из сеанса PySpark, запущенного через toree - недавно мы столкнулись с той же проблемой. Вместо того, чтобы запускать python через toree, вам нужно запустить ядро IPython, импортировать туда библиотеки PySpark и подключиться к вашему кластеру Spark. См. https://github.com/jupyter/docker-stacks/tree/master/pyspark-notebook для докернизированного примера, чтобы сделать это.