运行 来自散景服务器的 Spark?

Running Spark from bokeh server?

bokeh 服务器允许用户在回调时执行几乎任何 python 代码。

我想知道它是否也可以用于 运行 Spark 作业。

到目前为止,我在这里找到了一些想法(Best Practice to launch Spark Applications via Web Application?),但我不确定。

为了让它更具体一点:

  1. Bokeh 服务器是一个带有 2 个按钮的 Web 应用程序。
  2. 如果单击按钮 1,将执行 spark 作业 1(例如数据集 1 上的词频)并在页面上显示一些结果数据。
  3. 如果单击按钮 2,将执行 spark 作业 2(例如数据集 2 上的词频)并在页面上显示一些结果数据。

我知道这个帖子太老了,但我最近也有同样的问题。

我在散景应用程序中安装了 Spark 运行。我所做的不是生产级部署,但它确实有效并让人们自助服务。需要注意的几件事使它对我有用:

  1. 我需要实例化 Spark,以便拥有自己的散景会​​话的不同用户可以正确访问 spark
  2. 我使回调成为非阻塞的,这样用户就可以在他们的 spark 作业处于 运行 时继续进行交互
    1. 我还非常粗略地显示了 spark 作业的状态(还有很多不足之处)

这是我的散景服务器 main.py 的简化视图(它是开源的,您可以在此处查看 - https://github.com/mozilla/overscripted-explorer/blob/22feeedaf655bd7058331a5217900b0d2f41448b/text_search/main.py

实例化火花。 getOrCreate 在这里很重要:

from pyspark import SparkContext, SQLContext

sc = SparkContext.getOrCreate()
spark = SQLContext(sc)

....

def do_spark_computation():
    ....
    df = spark.read.parquet(DATA_FILE)
    frac = sample_frac.value / 100  # sample_frac is a bokeh widget
    sample = df.sample(False, frac)
    ....

....

对于非阻塞,我抄袭了散景文档中的这个例子:https://docs.bokeh.org/en/latest/docs/user_guide/server.html#updating-from-unlocked-callbacks

from concurrent.futures import ThreadPoolExecutor
from functools import partial    

from bokeh.document import without_document_lock
from bokeh.io import curdoc
from tornado.gen import coroutine


EXECUTOR = ThreadPoolExecutor(max_workers=2)
doc = curdoc()  # It was important to set this up globally

def do_spark_computation():
    ....
    df = spark.read.parquet(DATA_FILE)
    frac = sample_frac.value / 100  # sample_frac is a bokeh widget
    sample = df.sample(False, frac)
    ....

@coroutine
@without_document_lock
def get_new_data():
    doc.add_next_tick_callback(function_updates_bokeh_models)
    results = yield EXECUTOR.submit(do_spark_computation)
    doc.add_next_tick_callback(partial(function_updates_bokeh_models, results))


apply_button.on_click(get_new_data)