簡體   English   中英

將 Spark 與 Flask 與 JDBC 結合使用

[英]Using Spark with Flask with JDBC

我在做什么?

我想使用 Flask 構建一個 API 服務,從一個數據庫中提取數據,進行一些數據分析,然后將新數據加載到一個單獨的數據庫中。

怎么了?

如果我自己運行 Spark,我可以訪問數據庫,執行分析並加載到數據庫。 但是在 Flask 應用程序(api 路由)中使用它們時,相同的功能將不起作用。

我是怎么做的?

首先我啟動 Spark master 和 worker。 我可以看到我在localhost:8080的主人下有一個工人。

export JAVA_HOME=$(/usr/libexec/java_home -v 1.8)

../sbin/start-master.sh
../sbin/start-slave.sh spark://xxx.local:7077

對於 Flask 應用程序:

app = Flask(__name__)

spark = SparkSession\
    .builder\
    .appName("Flark - Flask on Spark")\
    .getOrCreate()
spark.sparkContext.setLogLevel("ERROR")


@app.route("/")
def hello():
    dataframe = spark.read.format("jdbc").options(
        url="jdbc:postgresql://localhost/foodnome_dev?user=postgres&password=''",
        database="foodnome_test",
        dbtable='"Dishes"'
    ).load()

    print([row["description"]
           for row in dataframe.select('description').collect()])

    return "hello"

為了運行這個應用程序,我使用帶有spark-submit JDBC 驅動程序:

../bin/spark-submit --master spark://Leos-MacBook-Pro.local:7077 --driver-class-path postgresql-42.2.5.jar server.py

我得到什么錯誤?

在 Flask 方面,錯誤是內部服務器錯誤。 在 Spark 方面,

File "/Users/leoqiu/Desktop/spark-2.4.0-bin-hadoop2.7/python/lib/py4j-0.10.7-src.zip/py4j/protocol.py", line 328, in get_return_value
    format(target_id, ".", name), value)
py4j.protocol.Py4JJavaError: An error occurred while calling o36.collectToPython.
: org.apache.spark.SparkException: Job aborted due to stage failure: Task 0 in stage 0.0 failed 4 times, most recent failure: Lost task 0.3 in stage 0.0 (TID 3, 10.0.0.67, executor 0): java.lang.ClassNotFoundException: org.postgresql.Driver
    at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at org.apache.spark.sql.execution.datasources.jdbc.DriverRegistry$.register(DriverRegistry.scala:45)
    at org.apache.spark.sql.execution.datasources.jdbc.JdbcUtils$$anonfun$createConnectionFactory$1.apply(JdbcUtils.scala:55)
    at org.apache.spark.sql.execution.datasources.jdbc.JdbcUtils$$anonfun$createConnectionFactory$1.apply(JdbcUtils.scala:54)
    at org.apache.spark.sql.execution.datasources.jdbc.JDBCRDD.compute(JDBCRDD.scala:272)

--driver-class-path在這里是不夠的。 驅動程序 jar 也應該添加到執行程序類路徑中。 這通常使用以下方法一起處理:

  • spark.jars.packages / --packages
  • spark.jars / --jars

盡管您仍然可以使用spark.executor.extraClassPath

說明

帶有 JDBC 源驅動程序負責讀取元數據(schema)和用於實際數據檢索過程的執行程序。

這種行為對於不同的外部數據源是通用的,因此無論何時使用非內置格式,都應該在整個集群中分發相應的 jar。

也可以看看

如何使用JDBC源在(Py)Spark中讀寫數據?

正如建議的那樣,這對我有用。 它需要--jars

../bin/spark-submit --master spark://Leos-MacBook-Pro.local:7077 --driver-class-path postgresql-42.2.5.jar --jars postgresql-42.2.5.jar server.py

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM