我已經在自己的Linux服務器上使用Apache Spark和PostgreSQL JDBC驅動程序,但沒有問題,但我無法使其工作在Amazon EMR上以同樣的方式執行。Amazon EMR w/Spark w/Postgres:「無法啓動數據庫'metastore_db'」
我先下載Postgres的驅動程序和設置我pyspark類路徑是這樣的:Adding postgresql jar though spark-submit on amazon EMR
我執行在Amazon EMR實例設置了Spark在pyspark
下,類似於如何我通常做我自己服務器。 「myhost的」正在運行的PostgreSQL,這我能夠從我的EMR實例與psql
連接到我的亞馬遜RDS實例的主機名,所以我知道它應該工作:
# helper, gets RDD from database
def get_db_rdd(table, lower=0, upper=1000):
db_connection = {
"host": "myhost",
"port": 5432,
"database": "mydb",
"user": "postgres",
"password": "mypassword"
}
url = "jdbc:postgresql://{}:{}/{}?user={}".format(db_connection["host"],
db_connection["port"],
db_connection["database"],
db_connection["user"])
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", db_connection["password"]) \
.load()
ret = ret.rdd
return ret
from pyspark.sql import SQLContext
sqlContext = SQLContext(sc)
rdd = get_db_rdd("test", 0, 3) # table exists, has columns (`id bigserial, string text`)
我立即得到一個崩潰與此異常:
17/04/21 19:34:07 ERROR Schema: Failed initialising database.
Unable to open a test connection to the given database. JDBC url = jdbc:derby:;databaseName=metastore_db;create=true, username = APP. Terminating connection pool (set lazyInit to true if you expect to start your database after your app). Original Exception: ------
java.sql.SQLException: Failed to start database 'metastore_db' with class loader [email protected]a157b0, see the next exception for details.
at org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(Unknown Source)
at org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(Unknown Source)
[...]
環顧在線,這與Apache Hive有關...不知道爲什麼這裏涉及到,但我可能會誤解。我在我的家裏看到metastore_db
。所有提出的解決方案都涉及到編輯一些Hive配置,我甚至沒有在我的實例上創建該配置或創建該目錄。我的EMR實例具有完全默認設置。更熟悉這種環境的人能否指出我正確的方向?
編輯:我沒有整個堆棧跟蹤方便,但有一些留在我的GNU屏幕。下面是更多的,提到德比:
Caused by: ERROR XJ040: Failed to start database 'metastore_db' with class loader [email protected]a157b0, see the next exception for details.
at org.apache.derby.iapi.error.StandardException.newException(Unknown Source)
at org.apache.derby.impl.jdbc.SQLExceptionFactory.wrapArgsForTransportAcrossDRDA(Unknown Source)
... 113 more
Caused by: ERROR XSDB6: Another instance of Derby may have already booted the database /home/hadoop/metastore_db.
at org.apache.derby.iapi.error.StandardException.newException(Unknown Source)
at org.apache.derby.iapi.error.StandardException.newException(Unknown Source)
at org.apache.derby.impl.store.raw.data.BaseDataFileFactory.privGetJBMSLockOnDB(Unknown Source)
編輯2:使用其他RDDS像以下工作:sc.parallelize([1, 2, 3]).map(lambda r: r * 2).collect()
。問題僅在於連接到Postgres的RDD。
編輯3:
>>> spark.range(5).show()
+---+
| id|
+---+
| 0|
| 1|
| 2|
| 3|
| 4|
+---+
「無法啓動數據庫'metastore_db'」通常在您已經有一個Spark實例正在運行時發生,並且默認Metastore在封面下使用Derby,因此是異常。你能發佈整個堆棧跟蹤嗎?我期望Derby的錯誤落在堆棧跟蹤的底部。 –
是的,我看到德比的錯誤。但據我所知,我只有一個Spark實例在運行。星期一,我會再試一次,並捕獲整個堆棧跟蹤。 – sudo
變得更好!認爲我們可以儘快整理出來。我相信當你僅僅使用'spark-shell'並執行'spark.range(5).show'並且啓動Spark底層基礎架構時,你會得到相同的堆棧跟蹤。 –