从Flask app

时间:2015-09-22 14:42:13

标签: python flask apache-spark pyspark

我写了一个简单的Flask应用程序来将一些数据传递给Spark。该脚本适用于IPython Notebook,但是当我尝试在它自己的服务器中运行它时。我不认为Spark上下文在脚本中运行。如何在以下示例中使用Spark?

from flask import Flask, request
from pyspark import SparkConf, SparkContext

app = Flask(__name__)

conf = SparkConf()
conf.setMaster("local")
conf.setAppName("SparkContext1")
conf.set("spark.executor.memory", "1g")
sc = SparkContext(conf=conf)

@app.route('/accessFunction', methods=['POST'])
def toyFunction():
    posted_data = sc.parallelize([request.get_data()])
    return str(posted_data.collect()[0])

if __name__ == '__main_':
    app.run(port=8080)

在IPython Notebook中,我没有定义SparkContext,因为它是自动配置的。我不记得我是怎么做到的,我跟着一些博客。

在Linux服务器上,我已经设置.py始终运行并安装了最新的Spark,方法是执行this guide的第5步。

修改

根据davidism的建议,我现在改为使用复杂程度越来越高的简单程序来本地化错误。

首先,我使用下面答案中的脚本创建了.py(在适当调整链接之后):

import sys
try:
    sys.path.append("your/spark/home/python")
    from pyspark import context
    print ("Successfully imported Spark Modules")
except ImportError as e:
    print ("Can not import Spark Modules", e)

返回“成功导入的Spark模块”。但是,我创建的下一个.py文件返回一个异常:

from pyspark import SparkContext
sc = SparkContext('local')
rdd = sc.parallelize([0])
print rdd.count()

这会返回异常:

“在向驱动程序发送端口号”

之前退出Java网关进程

搜索类似的问题我发现this page但是当我运行此代码时没有任何反应,控制台上没有打印,也没有错误消息。同样,this也没有帮助,我得到与上面相同的Java网关例外。我也安装了anaconda,因为我听说这可能有助于联合python和java,再次没有成功......

有关下一步尝试的建议吗?我很茫然。

3 个答案:

答案 0 :(得分:8)

好的,所以我要回答我自己的问题,希望那里的人不会遭遇同样的挫折!事实证明这是缺少代码和糟糕设置的组合。

编辑代码: 我确实需要通过在我的代码的前言中附加以下内容来初始化Spark Context:

from pyspark import SparkContext
sc = SparkContext('local')

所以完整的代码将是:

from pyspark import SparkContext
sc = SparkContext('local')

from flask import Flask, request
app = Flask(__name__)

@app.route('/whateverYouWant', methods=['POST'])  #can set first param to '/'

def toyFunction():
    posted_data = sc.parallelize([request.get_data()])
    return str(posted_data.collect()[0])

if __name__ == '__main_':
    app.run(port=8080)    #note set to 8080!

编辑设置: 文件(yourrfilename.py)必须保存在正确的目录中,即必须保存到文件夹/home/ubuntu/spark-1.5.0-bin-hadoop2.6。

然后在目录中发出以下命令:

./bin/spark-submit yourfilename.py

在10.0.0.XX:8080 / accessFunction /启动服务。

请注意,端口必须设置为8080或8081:默认情况下,Spark仅为主服务器和工作服务器允许这些端口的Web UI

您可以使用restful服务测试服务,或者打开新终端并使用cURL命令发送POST请求:

curl --data "DATA YOU WANT TO POST" http://10.0.0.XX/8080/accessFunction/

答案 1 :(得分:1)

我能够通过将pySpark和py4j的位置添加到我的flaskapp.wsgi文件中的路径来解决此问题。以下是完整内容:

import sys
sys.path.insert(0, '/var/www/html/flaskapp')
sys.path.insert(1, '/usr/local/spark-2.0.2-bin-hadoop2.7/python')
sys.path.insert(2, '/usr/local/spark-2.0.2-bin-hadoop2.7/python/lib/py4j-0.10.3-src.zip')

from flaskapp import app as application

答案 2 :(得分:0)

修改.py文件,如链接指南'使用带有Spark的IPython Notebook'部分第二点所示。 insted sys.path.insert使用sys.path.append。尝试插入此代码段:

import sys
try:
    sys.path.append("your/spark/home/python")
    from pyspark import context
    print ("Successfully imported Spark Modules")
except ImportError as e:
    print ("Can not import Spark Modules", e)