通过JDBC从Spark提取表数据时出现PostgreSQL错误

通过JDBC从Spark提取表数据时出现PostgreSQL错误,postgresql,jdbc,pyspark,hawq,Postgresql,Jdbc,Pyspark,Hawq,我的Spark-to-HAWQ JDBC连接工作正常,但两天后,从表中提取数据时出现了问题。Spark配置上没有任何更改 简单步骤#1-从HAWQ中的简单表打印模式 我可以创建SQLContext数据帧并连接到HAWQ db: df = sqlContext.read.format('jdbc').options(url=db_url, dbtable=db_table).load() df.printSchema() 其中打印: root |-- product_no: integer (

我的Spark-to-HAWQ JDBC连接工作正常,但两天后,从表中提取数据时出现了问题。Spark配置上没有任何更改

简单步骤#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)
org.apache.spark.sparkeexception:作业因阶段失败而中止:阶段0.0中的任务0失败1次,最近的失败:阶段0.0中的任务0.0丢失(TID 0,本地主机):
org.postgresql.util.psqleexception:错误:无法将3124字节写入临时文件:设备上没有剩余空间(buffile.c:408)(seg33 adnpivhdwapda04.gphd.local:40003 pid=544124)(cdbdisp.c:1571)
位于org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2182)
位于org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1911)
位于org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:173)
位于org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:615)
位于org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:465)
位于org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:350)
位于org.apache.spark.sql.jdbc.JDBCRDD$$anon$1(JDBCRDD.scala:372)
位于org.apache.spark.sql.jdbc.JDBCRDD.compute(JDBCRDD.scala:350)
在org.apache.spark.rdd.rdd.computeOrReadCheckpoint(rdd.scala:277)
位于org.apache.spark.rdd.rdd.iterator(rdd.scala:244)
在org.apache.spark.rdd.MapPartitionsRDD.compute上(MapPartitionsRDD.scala:35)
在org.apache.spark.rdd.rdd.computeOrReadCheckpoint(rdd.scala:277)
位于org.apache.spark.rdd.rdd.iterator(rdd.scala:244)
在org.apache.spark.rdd.MapPartitionsRDD.compute上(MapPartitionsRDD.scala:35)
在org.apache.spark.rdd.rdd.computeOrReadCheckpoint(rdd.scala:277)
位于org.apache.spark.rdd.rdd.iterator(rdd.scala:244)
在org.apache.spark.rdd.MapPartitionsRDD.compute上(MapPartitionsRDD.scala:35)
在org.apache.spark.rdd.rdd.computeOrReadCheckpoint(rdd.scala:277)
位于org.apache.spark.rdd.rdd.iterator(rdd.scala:244)
位于org.apache.spark.api.PythonRDD$WriterThread$$anonfun$run$3.apply(PythonRDD.scala:248)
位于org.apache.spark.util.Utils$.logUncaughtExceptions(Utils.scala:1772)
位于org.apache.spark.api.python.PythonRDD$WriterThread.run(PythonRDD.scala:208)
我尝试过的事情(但如果有更精确的步骤,我愿意再试一次):

  • 在HAWQ主节点上尝试了“df-i”,但只有1%的利用率
  • 在HAWQ数据库上尝试了dbvacuum(不建议使用真空全部 关于HAWQ)
  • 尝试创建这个微小的新db(使用单个表,3 没有运气
这不可能是一个实际的内存不足,所以在哪里和什么是绊倒了这个

无法将3124字节写入临时文件:设备上没有剩余空间

用于临时文件的卷已满。然后,临时文件将在出现错误时被删除,因此在
df
中实际上看不到完整的卷

在大多数Linux系统上,这可能是一个tempfs,如
/tmp
。如果是这样,它将由虚拟内存支持。要确认,请检查
mount
并检查PostgreSQL的
temp_表空间的设置(
SHOW temp_表空间
)。如果为空,PostgreSQL将使用默认表空间,这不太可能是tempfs,但如果设置了,则检查该表空间的位置。如果是临时性的,你可能需要移动它

它也可能以某种方式填满主表空间,但如果目前只有1%的利用率,这是极不可能的。也许大规模失控的递归CTE可以做到这一点,但可能性不大


配额管理也是一种可能。可能配置了文件系统配额?

可能是权限问题。请查看postgres日志;你在泥水里游泳。戴着太阳镜/或者简单地显示
df-h
mount
的完整、未修改的输出,以及
psql
中的
show temp_表空间
。还有+1,谢谢你显示完整的堆栈跟踪。你说得对@Craig Ringer,谢谢!我没有看到/tmp被填满。果然,它的利用率达到了100%。不知道那里写了什么,但是HAWQ不能更新表,所以它只创建新的表(…和更多的新表,谁知道是否有引用?)。最后一点注意:一般管理员帐户没有显示100%的利用率,只是在以root用户身份运行
df
之后,问题才暴露出来。