【发布时间】: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 run或python 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