【问题标题】:Access to Spark from Flask app从 Flask 应用程序访问 Spark
【发布时间】:2016-12-13 11:12:12
【问题描述】:

我编写了一个简单的 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。

编辑

按照大卫主义的建议,我现在转而使用复杂度越来越高的简单程序来定位错误。

首先,我仅使用以下答案中的脚本创建了 .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,再次没有成功......

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

【问题讨论】:

  • 请注意,我在 iPython Notebook 上使用 Firefox 上的 restclient 扩展在我的机器上发布,它按预期工作

标签: python flask apache-spark pyspark


【解决方案1】:

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

编辑代码: 我确实需要通过在代码的序言中附加以下内容来初始化 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/

【讨论】:

  • 嗨@Matt,我面临着类似的问题。我对此有点困惑。为什么必须将项目放在 spark 目录下?那么主机地址中的这个XX呢?
  • 嘿@Larissa 自从我写这篇文章以来已经有一段时间了,所以我有点生疏了。您需要将项目放在 spark 目录中才能运行命令。如果你将 ./bin/spark-submit 添加到你的 spark bash 中,你可以解决这个问题,你可以从任何地方运行它,但我不想让这个答案过于复杂。至于作为盒子本地IP的XX,也许我应该直接写0.0.0.0,这样就可以了。不过,您应该能够通过邮递员从同一网络上的另一台机器发送 POST 请求。希望这会有所帮助!
  • 如何在 Windows 上执行此操作? ./bin/spark-submit yourfilename.py
  • 我试过这样做,我得到了错误,而不是能够访问烧瓶应用程序
【解决方案2】:

我可以通过将 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

【讨论】:

    【解决方案3】:

    修改您的 .py 文件,如链接指南“将 IPython Notebook 与 Spark 一起使用”部分第二点中所示。安装 sys.path.insert 使用 sys.path.append。尝试插入这个 sn-p:

    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)
    

    【讨论】:

    • 感谢您回复我。我尝试创建一个尽可能简单的程序,首先只包含上面的代码。当我运行它时,我得到“成功......”,这很棒。然后,我制作了一个简单的程序,将其添加为问题的编辑。结果是一个异常:“Java gateway process exited before sent the driver its port number”
    • 如果您已经初始化了变量“sc”,那么您必须使用相同的实例而不是重新初始化变量。
    猜你喜欢
    • 1970-01-01
    • 2021-06-06
    • 2023-03-03
    • 2020-05-09
    • 1970-01-01
    • 2021-02-15
    • 2016-06-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多