2015-09-24 65 views
1

提取表數據時,我有火花HAWQ JDBC連接的工作,但現在兩天後有一個與從表中提取數據的問題。沒什麼改變在Spark配置...PostgreSQL的誤差通過JDBC從星火

簡單步驟#1 - 打印從一個簡單的表的模式在HAWQ 我可以創建一個SQLContext數據幀,並連接到HAWQ DB:

df = sqlContext.read.format('jdbc').options(url=db_url, dbtable=db_table).load() 
df.printSchema() 

它打印:

root 
|-- product_no: integer (nullable = true) 
|-- name: string (nullable = true) 
|-- price: decimal (nullable = true) 

但是,當真正試圖提取數據:

df.select("product_no").show() 

這些錯誤彈出...

org.apache.spark.SparkException: Job aborted due to stage failure: Task 0 in stage 0.0 failed 1 times, most recent failure: Lost task 0.0 in stage 0.0 (TID 0, localhost): 
org.postgresql.util.PSQLException: ERROR: could not write 3124 bytes to temporary file: No space left on device (buffile.c:408) (seg33 adnpivhdwapda04.gphd.local:40003 pid=544124) (cdbdisp.c:1571) 
    at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2182) 
    at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1911) 
    at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:173) 
    at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:615) 
    at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:465) 
    at org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:350) 
    at org.apache.spark.sql.jdbc.JDBCRDD$$anon$1.<init>(JDBCRDD.scala:372) 
    at org.apache.spark.sql.jdbc.JDBCRDD.compute(JDBCRDD.scala:350) 
    at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:277) 
    at org.apache.spark.rdd.RDD.iterator(RDD.scala:244) 
    at org.apache.spark.rdd.MapPartitionsRDD.compute(MapPartitionsRDD.scala:35) 
    at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:277) 
    at org.apache.spark.rdd.RDD.iterator(RDD.scala:244) 
    at org.apache.spark.rdd.MapPartitionsRDD.compute(MapPartitionsRDD.scala:35) 
    at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:277) 
    at org.apache.spark.rdd.RDD.iterator(RDD.scala:244) 
    at org.apache.spark.rdd.MapPartitionsRDD.compute(MapPartitionsRDD.scala:35) 
    at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:277) 
    at org.apache.spark.rdd.RDD.iterator(RDD.scala:244) 
    at org.apache.spark.api.python.PythonRDD$WriterThread$$anonfun$run$3.apply(PythonRDD.scala:248) 
    at org.apache.spark.util.Utils$.logUncaughtExceptions(Utils.scala:1772) 
    at org.apache.spark.api.python.PythonRDD$WriterThread.run(PythonRDD.scala:208) 

事情我已經嘗試過(但願意,如果有更精確的步驟重試):

  • 在HAWQ嘗試了「DF -i」主節點和有隻有1%的利用率
  • 試過HAWQ數據庫上dbvacuum(真空ALL不建議 上HAWQ)
  • 嘗試創建這個小小的新的DB(與單表,3 列),無運氣

這不可能是真正的內存不足,以便在那裏的,什麼是跳閘這件事?

+0

可能是一個權限問題。請檢查postgres日誌;你在渾水中游泳。帶着太陽鏡。/ORM – wildplasser

+0

請顯示'df -h'和'mount'的完整,未修改的輸出,以及'psql'中的'SHOW temp_tablespaces'。還+1,並感謝您顯示完整的堆棧跟蹤。 –

回答

1

寫不出3124個字節的臨時文件:在設備上留下任何空間

用於臨時文件的體積填滿。然後,臨時文件將被錯誤地刪除,因此您實際上看不到df中的完整卷。

這可能是一個tempfs,像/tmp,在大多數Linux系統。如果是這樣,它由虛擬內存支持。要確認,請檢查mount並檢查PostgreSQL的設置temp_tablespacesSHOW temp_tablespaces)。如果它是空白的,PostgreSQL將使用默認的表空間,這不太可能是一個臨時表,但是如果它設置了,檢查表空間的位置。如果這是一個臨時工,你可能需要移動它。

它也可能是某種程度上填補了主表,但是這是非常不可能,如果它只是在目前1點%的使用率是。也許大規模失控的遞歸CTE可以做到,但這不太可能。

配額管理也是一種可能性。也許配置文件系統配額?

+0

你說得對@Craig Ringer,謝謝!我沒有看到/ tmp被填滿。果然,它的利用率達到了100%。不知道那裏寫了什麼,但HAWQ無法更新表,所以它只是創建新的表(...和更多的新的,誰知道是否有任何引用?)。最後一個注意事項:一般管理員帳戶沒有顯示100%的利用率,只有在以root身份運行'df'後,問題纔會顯露出來。 – WaveRider