python - 从 Flask 应用访问 Spark

标签 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 设置为始终运行,并按照 this guide 的第 5 步安装了最新的 Spark。 .

编辑:

听从 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,但还是没有成功...

关于接下来要尝试什么有什么建议吗?我很茫然。

最佳答案

好的,所以我要回答我自己的问题,希望外面的人不会遭受同样的挫折!事实证明这是缺少代码和错误设置的结合。

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

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 仅分别针对 master 和 worker 允许这些端口的 web UI

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

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

关于python - 从 Flask 应用访问 Spark,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32719920/

相关文章:

python - 如何在 Jupyter Notebook 中正确设置 SparkContext 的配置?

scala - Spark Scala:无法导入sqlContext.implicits._

python - Windows 上的 Flask Web 服务器如何使用来自 Windows 证书存储的 SSL 证书?

python - 如何在IIS中部署Flask应用程序?

python - Repl.it 和 FFmpeg

python - 使用 praw,我如何遍历所有用户的评论?

python - 在 Docker 容器中连接 Postgres DB 和模型(Django 和 Flask)

apache-spark - 带有多个 JDBC jar 的 EMR 上的 Spark

python - 在 puppet 上运行 python 脚本

python - 如何配置python环境