此JVM中只能运行一个SparkContext - Flask

时间:2015-09-11 15:10:55

标签: apache-spark pyspark

任何人都可以就这个简单的Flask应用抱怨Only one SparkContext may be running in this JVM的原因提供指导。显然,我并没有尝试加载多个上下文。 代码:

import flask
from pyspark  import SparkContext
from operator import itemgetter

app = flask.Flask(__name__)

@app.route('/')
def homepage():
    return 'Example: /dt/140'

@app.route('/dt/<int:delaythreshold>')
def dt(delaythreshold):
    global flights_rdd

    flights_dict =                                         \
        flights_rdd                                        \
        .filter( lambda (day, delay): delay >= threshold ) \
        .countByValue()
    sorted_flight_tuples = \
        sorted( flights_dict.items(), key=itemgetter(1), reverse=True )

    return render_template('delays.html', tuples=sorted_flight_tuples[:5])

if __name__ == '__main__':
    global flights_rdd

    sc = SparkContext()
    flights_rdd =                                     \
        sc.textFile('/tmp/flights.csv', 4)            \
          .map( lambda s: s.split(',') )              \
          .map( lambda l: ( l[0][:4], int(lst[1]) ) ) \
          .cache()

    app.config['DEBUG'] = True
    app.run(host='0.0.0.0')

提前致谢。

1 个答案:

答案 0 :(得分:4)

您可能不应该在__main__部分创建“全局”资源,例如SparkContext。

特别是,如果您在调试模式下运行应用程序,模块会在启动时立即重新加载 - 因此尝试创建第二个SparkContext。 (在创建print 'creating sparkcontext'之前,将__main__添加到SparkContext部分 - 您会看到它两次。)

查看烧瓶文档,了解有关如何缓存全局资源的建议。 关注http://flask.pocoo.org/docs/0.10/appcontext/#context-usage您可以例如检索SparkContext,如下所示:

from flask import g

def get_flights():
    flights_rdd = getattr(g, '_flights_rdd', None)
    if flights_rdd is None:
        # create flights_rdd on the fly
        sc = g._sc = SparkContext()
        flights_rdd =                                     \
            sc.textFile('/tmp/flights.csv', 4)            \
              .map( lambda s: s.split(',') )              \
              .map( lambda l: ( l[0][:4], int(lst[1]) ) ) \
              .cache()
        g._flights_rdd = flights_rdd
    return flights_rdd

@app.teardown_appcontext
def teardown_sparkcontext(exception):
    sc = getattr(g, '_sc', None)
    if sc is not None:
        sc.close()

然后使用flights_rdd = get_flights()代替global flights_rdd