【问题标题】:Running Spark from bokeh server?从散景服务器运行 Spark?
【发布时间】:2017-03-09 16:34:51
【问题描述】:

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

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

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

为了更具体一点:

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

【问题讨论】:

    标签: python apache-spark server client bokeh


    【解决方案1】:

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

    我让 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)
    

    【讨论】:

    • 这种方法是否有效,如果我需要传递一些参数以应用于数据获取过程(通过 Spark 作业完成)
    • 我不明白为什么不这样做。
    猜你喜欢
    • 2015-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-14
    • 1970-01-01
    • 1970-01-01
    • 2017-08-14
    相关资源
    最近更新 更多