2017-02-16 57 views
0

我有以下用於從Postgres數據庫將表加載到RDD的簡單代碼。Spark SQL RDD在pyspark中加載,但未在spark-submit中加載:「JDBCRDD:關閉連接」

# this setup is just for spark-submit, will be ignored in pyspark 
from pyspark import SparkConf, SparkContext 
from pyspark.sql import SQLContext 
conf = SparkConf().setAppName("GA")#.setMaster("localhost") 
sc = SparkContext(conf=conf) 
sqlContext = SQLContext(sc) 

# func for loading table 
def get_db_rdd(table): 
    url = "jdbc:postgresql://localhost:5432/harvest?user=postgres" 
    print(url) 
    lower = 0 
    upper = 1000 
    ret = sqlContext \ 
     .read \ 
     .format("jdbc") \ 
     .option("url", url) \ 
     .option("dbtable", table) \ 
     .option("partitionColumn", "id") \ 
     .option("numPartitions", 1024) \ 
     .option("lowerBound", lower) \ 
     .option("upperBound", upper) \ 
     .option("password", "password") \ 
     .load() 
    ret = ret.rdd 
    return ret 

# load table, and print results 
print(get_db_rdd("mytable").collect()) 

我跑./bin/pyspark然後粘貼到解釋器,它從我的表打印出來的數據符合市場預期。

現在,如果我的代碼保存到一個名爲test.py文件,然後做./bin/spark-submit test.py,它開始運行,但後來我看到這些的垃圾郵件我的控制檯永遠:

17/02/16 02:24:21 INFO Executor: Running task 45.0 in stage 0.0 (TID 45) 
17/02/16 02:24:21 INFO JDBCRDD: closed connection 
17/02/16 02:24:21 INFO Executor: Finished task 45.0 in stage 0.0 (TID 45). 1673 bytes result sent to driver 

編輯:這是一個機。我還沒有開始任何主人或奴隸;​​是我在系統啓動後運行的唯一命令。我用主/從設置嘗試了相同的結果。 我spark-env.sh文件看起來像這樣:

export SPARK_WORKER_INSTANCES=2 
export SPARK_WORKER_CORES=2 
export SPARK_WORKER_MEMORY=800m 
export SPARK_EXECUTOR_MEMORY=800m 
export SPARK_EXECUTOR_CORES=2 
export SPARK_CLASSPATH=/home/ubuntu/spark/pg_driver.jar # Postgres driver I need for SQLContext 
export PYTHONHASHSEED=1337 # have to make workers use same seed in Python3 

它的工作原理,如果我火花提交剛剛從列表或某事創建RDD Python文件。我嘗試使用JDBC RDD時只遇到問題。我錯過了什麼?

回答

1

當使用​​時,您應該向執行者提供jar

正如spark 2.1 JDBC documents提到:

要開始,你將需要包括JDBC驅動程序爲您的火花classpath中 特定的數據庫。例如,連接到 的Postgres從星火殼牌您將運行以下命令:

bin/spark-shell --driver-class-path postgresql-9.4.1207.jar --jars postgresql-9.4.1207.jar 

注:同樣應爲​​命令

故障排除

JDBC驅動程序類必須可見t o客戶端會話和所有執行者上的原始類加載器 。這是因爲Java的 DriverManager類執行安全檢查,導致它忽略 所有驅動程序在原始類裝入程序不可見時出現 以打開連接。 一個方便的方法是在所有工作節點上修改 compute_classpath.sh以包含驅動程序JAR。

+0

我的設置'$ SPARK_CLASSPATH'應該已經可以做到這一點,不過我仍然嘗試了您的建議。取消設置envvar並運行'spark-submit --driver-class-path pg_driver.jar --jars pg_driver.jar test.py',它有同樣的問題。我想如果它錯過了驅動程序,它會拋出一些其他錯誤,如「找不到合適的驅動程序」。順便說一下,這是在一臺機器上(更新我的問題)。 – sudo

0

這是一個可怕的黑客攻擊。我沒有考慮這個答案,但它確實有效。

好吧,只有pyspark的作品?好吧,那我們就用它。寫這個Bash腳本:

cat $1 | $SPARK_HOME/bin/pyspark # pipe the Python file into pyspark 

我在提交作業的Python腳本中運行該腳本。此外,我包括我使用的過程之間傳遞參數的代碼,在情況下,它可以幫助別人:

new_env = os.environ.copy() 
new_env["pyspark_argument_1"] = "some param I need in my Spark script" # etc... 
p = subprocess.Popen(["pyspark_wrapper.sh {}".format(py_fname)], shell=True, env=new_env) 

在我的星火腳本:

something_passed_from_submitter = os.environ["pyspark_argument_1"] 
# do stuff in Spark... 

我覺得像火花更好的支持和(如果這是一個bug)與Scala相比,使用Python 3的bug更少,所以現在可能是更好的解決方案。但我的腳本使用了我們在Python 3中編寫的一些文件,所以...

相關問題