【问题标题】:Accessing Spark and/or PySpark from Flask Web App从 Flask Web App 访问 Spark 和/或 PySpark
【发布时间】:2018-01-17 19:27:45
【问题描述】:

我在/home/ubuntu/spark-2.2.1-bin-hadoop2.7' 中安装了 Apache Spark

我在/home/ubuntu/flaskapp 有一个烧瓶应用程序

我还安装了一个 jupyter 笔记本。我还安装了一个模块名称findspark,以便更轻松地查找 Spark 安装。

在 Jupyter 笔记本中,它按预期工作。如果我只是跳进去输入 import pyspark 它会抛出一个错误,即没有名为 pyspark 的模块。这是意料之中的。所以我必须使用findspark。因此,如果我这样做,它只会按预期工作:

import findspark
findspark.init('home/ubuntu/spark-2.2.1-bin-hadoop2.7')
import pyspark

但是,使用flaskapp,它不起作用。如果我只是为 Hello World 做基本文件,它工作得很好,我可以从它的指定 URL 看到网页。所以这很好用:

from flask import Flask

@app = Flask(__name__)
def hello():
    return "Hello World"

if __name__ == '__main__':
    app.run()

但是,如果我尝试通过 findspark(我在全局安装 pip)使用 pyspark,它将不起作用。网页吐出500 internal server error。所以这里这个简单的代码不起作用:

import findspark
findspark.init('/home/ubuntu/spark-2.2.1-bin-hadoop2.7')

import pyspark
from pyspark import SparkContext

from flask import Flask
app = Flask(__name__)

sc = SparkContext()
data = range(0,100)
rdd = sc.parallelize(data)
a = rdd.take(2)


@app.route('/')
def hello_world():
    return "List items are {} and {}".format(a[0], a[1])

if __name__ == '__main__':
    app.run()

所以我的问题是:

1) 为什么它不起作用?

2) 让脚本连接到pyspark 的最简单方法是什么?

编辑

调试器输出:

ubuntu@ip-172-31-11-55:~/flaskapp$ FLASK_DEBUG=1 flask run
 * Serving Flask app "flaskapp"
 * Forcing debug mode on
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 156-406-059
Using Spark's default log4j profile: org/apache/spark/log4j-defaults.properties
Setting default log level to "WARN".
To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).
Using Spark's default log4j profile: org/apache/spark/log4j-defaults.properties
Setting default log level to "WARN".
To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).
18/01/17 19:40:35 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
18/01/17 19:40:36 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
18/01/17 19:40:37 WARN Utils: Service 'SparkUI' could not bind on port 4040. Attempting port 4041.
18/01/17 19:40:38 WARN Utils: Service 'SparkUI' could not bind on port 4040. Attempting port 4041.
18/01/17 19:40:38 WARN Utils: Service 'SparkUI' could not bind on port 4041. Attempting port 4042.

【问题讨论】:

  • 启用 Flask 调试器并检查错误?总的来说,将 SparkConext 嵌入 Web 应用程序是一个非常糟糕的主意。
  • @user6910411 我将如何使用调试器?现在,我不必运行flask runpython flaskapp.py。我将文件夹符号链接到我的/var/www/html,然后对apache.conf 进行了一些更改。基本上,我按照这些说明创建了烧瓶应用程序,因此我不必运行 py 文件。 datasciencebytes.com/bytes/2015/02/24/… 无论如何,我确实尝试按照您的要求运行,使用 FLASK_DEBUG=1 flask run 并且所有输出都在这个要点中。 gist.github.com/anonymous/23d69e92e332b83307a6f5fa989f5100
  • 无法绑定端口 - 确保端口可访问或手动设置空闲端口 (spark.ui.port),看看是否能解决问题。
  • 这里的愚蠢问题......我该怎么做?
  • 可能建议从 Spark 101 开始? :) 例如编辑SPARK_HOME/conf/spark-defaults.conf。但是先检查端口是否被占用。使用netcat 或类似工具。

标签: python apache-spark flask web-applications pyspark


【解决方案1】:

我刚刚参与了一个在与 Flask Web 服务器相同的服务器上运行本地 Spark 集群的项目。我遇到了与您完全相同的错误,但不记得到底是什么问题...

很确定这与初始化时缺少向 SparkContext 提供的参数有关。需要提供 SparkConf 对象,或主 url 的明确详细信息等。

python 2.7 中的以下函数,在您的服务器上可用的尽可能多的内核上运行本地 spark 集群。让我知道这是否运行,或者是否有其他错误。

from pyspark import SparkContext

_sc = SparkContext('local[*]', 'nameOfYourSparkContext')
_data = range(0,100)
_rdd = _sc.parallelize(data)
"""Perform your operations on _rdd such as .map(), .collect()
"""
_sc.close()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-18
    • 1970-01-01
    • 2015-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多