任何人都可以就这个简单的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')
提前致谢。
答案 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
。