镶木地板写入期间的 Spark ClosedChannelException 异常

Posted

技术标签:

【中文标题】镶木地板写入期间的 Spark ClosedChannelException 异常【英文标题】:Spark ClosedChannelException exception during parquet write 【发布时间】:2016-08-12 02:25:37 【问题描述】:

我们有这个庞大的遗留 sql 表,我们需要从中提取数据并将其推送到 s3。下面是我如何查询部分数据并写入输出。

  def writeTableInParts(tableName: String, numIdsPerParquet: Long, numPartitionsAtATime: Int, startFrom : Long = -1, endTo : Long = -1, filePrefix : String = s3Prefix) = 
    val minId : Long = if (startFrom > 0) startFrom else findMinCol(tableName, "id")
    val maxId : Long = if (endTo > 0) endTo else findMaxCol(tableName, "id")

    (minId until maxId by numIdsPerParquet).toList.sliding(numPartitionsAtATime, numPartitionsAtATime).toList.foreach(list => 
      list.map(start => 
          val end = math.min(start + numIdsPerParquet, maxId)

          sqlContext.read.jdbc(mysqlConStr,
            s"(SELECT * FROM $tableName WHERE id >= $start AND id < $end) as tmpTable",
            Map[String, String]())
        ).reduce((left, right) => 
          left.unionAll(right)
        )
        .write
        .parquet(s"$filePrefix/$tableName/$list.head-$list.last + numIdsPerParquet")
    )
  

这对许多不同的表格都有效,但无论出于何种原因,表格都会继续获得java.nio.channels.ClosedChannelException,无论我减少多少扫描窗口或大小。

基于this 的回答我想我的代码中某处有异常,但我不确定它会在哪里,因为它是一个相当简单的代码。如何进一步调试此异常?日志没有任何帮助,也没有揭示原因。

【问题讨论】:

【参考方案1】:

问题是由于以下错误引起的,与火花无关...追查这个非常麻烦,因为火花不太擅长显示错误。该死……

'0000-00-00 00:00:00' can not be represented as java.sql.Timestamp error

【讨论】:

以上是关于镶木地板写入期间的 Spark ClosedChannelException 异常的主要内容,如果未能解决你的问题,请参考以下文章

在 Spark 2.0 中从 AVRO 写入镶木地板时出现 NullPointerException

从 Spark 写入镶木地板时如何处理空值

Apache Spark 数据帧在写入镶木地板时不会重新分区

将大型 Spark 数据帧作为镶木地板写入 s3 存储桶

Spark - 如果已经存在,则更新记录(在镶木地板文件中)

spark sql 无法在 S3 中查询镶木地板分区