0

我正在使用 Apache Toree - PySpark 运行 Jupyter (v4.2.1)。当我尝试调用 plotly 的 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)

我无法在网上找到有关此的任何信息。当我深入研究失败的代码时 - IPython utils 中的 io.py ,我看到正在传递的流必须具有两个属性 - 写入和刷新。但由于某种原因,在这种情况下传递的流 - sys.stdout 只有“write”属性,没有“flush”属性。

4

1 回答 1

0

我相信这是因为 plotly 的 notebook 模式假设它在 IPython jupyter 内核中运行,进行 notebook 通信;您在堆栈跟踪中看到它正在尝试调用 IPython 包。

然而,Toree 是一个不同的 jupyter 内核,并且有自己的协议处理来与笔记本服务器进行通信。即使您使用 toree 运行 PySpark 解释器,您也会得到一个“普通”的 PySpark(就像从 shell 启动它时一样),并且 toree 驱动该解释器的输入/输出。

因此,没有设置 IPython 机器,在该环境中调用 init_notebook_mode() 将失败,就像在直接从 shell 启动的 PySpark 中运行时一样,它对笔记本一无所知。

据我所知,目前无法从通过 toree 运行的 PySpark 会话中获取绘图输出——我们最近遇到了同样的问题。你需要运行一个 IPython 内核,在那里导入 PySpark 库并连接到你的 Spark 集群,而不是通过 toree 运行 python。请参阅https://github.com/jupyter/docker-stacks/tree/master/pyspark-notebook以获取执行此操作的 dockerized 示例。

于 2016-12-15T09:52:35.707 回答