我目前正在迁移配置单元表。我面临的问题是,当我尝试将其加载到Spark中的数据帧中并写回Hive时,它给了我一个序列化错误,如所附的屏幕快照所示。但是,当我尝试执行约60列的数据框转换时,效果很好。在表格的1800列中,我们大约需要200列。我认为是由于表格大小导致此错误。
我认为序列化错误是由“ Spark版本2.2.0”(在我们的开发集群中使用)引起的。此版本中存在一个与“ org.apache.spark.unsafe.types.UTF8String $ IntWrapper”相关的错误。在Spark版本2.2.1和更高版本中,此错误已根据问题报告解决。为了解决这个问题,我尝试用已更新的依赖项包装我部署的jar。我仍然面临同样的问题,因为我认为它仍在使用开发环境中的默认jar。如果有其他选择可以运行它,我将非常感激。
链接到apache bug = https://issues.apache.org/jira/browse/SPARK-21445
链接到解决方案= https://github.com/apache/spark/pull/18660/commits/d2202903518b3dfa0f4a719a0b9cb5431088ed66
在解决问题的方法中,他们用Java编写了代码,我在Scala中编写了我的代码。我想知道如何从UTF8String库导入“ IntWrapper”和“ LongWrapper”类,并让程序使用我声明的变量。为此,我编写了一些类,以链接中的类为参考,并在spark中使用KryoRegistrator将这些类称为“火花会话”。它是否正确? bsTst3.scala
import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.types._
import org.apache.spark.sql.functions._
import org.apache.spark.sql.Column
import org.apache.spark.sql.sources.IsNotNull
import org.apache.spark.serializer.KryoSerializer
import org.apache.spark.SerializableWritable
import java.io._
@SerialVersionUID(0L)
class IntWrapper extends Serializable{
@transient var value:Int=0
}
@SerialVersionUID(1L)
class LongWrapper extends Serializable{
@transient var value:Long=0
}
object bsTst3 {
def main(args: Array[String]): Unit = {
val spark = SparkSession.builder().appName("DrfApp")
.config("spark.kryo.registrator", "bsKryoRegistrator")
.config("spark.kryoserializer.buffer", "1024k")
.config("spark.kryoserializer.buffer.max", "1024m")
.enableHiveSupport().getOrCreate()
val bDRF = spark.sql("select * from global.table_partition1 limit 10")
import spark.implicits._
bDRF.write.saveAsTable("katukuri.sample3")
}
}
这是scala类,这是我从主对象中调用的 bsKryoRegistrator.scala
import org.apache.spark.serializer.KryoRegistrator
import com.esotericsoftware.kryo.Kryo;
import org.apache.hadoop.io.NullWritable
class bsKryoRegistrator extends KryoRegistrator {
override def registerClasses(kryo: Kryo) {
kryo.register(classOf[Byte])
kryo.register(classOf[Short])
//kryo.register(classOf[Int])
//kryo.register(classOf[Long])
kryo.register(classOf[IntWrapper])
kryo.register(classOf[LongWrapper])
kryo.register(classOf[Float])
kryo.register(classOf[Double])
kryo.register(classOf[String])
kryo.register(classOf[Boolean])
kryo.register(classOf[Char])
kryo.register(classOf[Null])
kryo.register(classOf[Nothing])
//kryo.register(classOf[None])
kryo.register(classOf[NullWritable])
}
}
我用来在开发集群上运行的命令
spark2-submit --class bsTst3 --master yarn --queue root.default --deploy-mode client BSDrdTest3-0.0.1-SNAPSHOT.jar
我遇到的错误,与错误链接中的错误类似
19/02/27 18:06:14 INFO spark.SparkContext: Starting job: saveAsTable at bsTst3.scala:37
19/02/27 18:06:14 INFO scheduler.DAGScheduler: Registering RDD 6 (saveAsTable at bsTst3.scala:37)
19/02/27 18:06:14 INFO scheduler.DAGScheduler: Got job 0 (saveAsTable at bsTst3.scala:37) with 1 output partitions
19/02/27 18:06:14 INFO scheduler.DAGScheduler: Final stage: ResultStage 1 (saveAsTable at bsTst3.scala:37)
19/02/27 18:06:14 INFO scheduler.DAGScheduler: Parents of final stage: List(ShuffleMapStage 0)
19/02/27 18:06:14 INFO scheduler.DAGScheduler: Missing parents: List(ShuffleMapStage 0)
19/02/27 18:06:14 INFO scheduler.DAGScheduler: Submitting ShuffleMapStage 0 (MapPartitionsRDD[6] at saveAsTable at bsTst3.scala:37), which has no missing parents
19/02/27 18:06:14 INFO cluster.YarnScheduler: Cancelling stage 0
19/02/27 18:06:14 INFO scheduler.DAGScheduler: ShuffleMapStage 0 (saveAsTable at bsTst3.scala:37) failed in Unknown s due to Job aborted due to stage failure: Task not serializable: java.io.NotSerializableException: org.apache.spark.unsafe.types.UTF8String$IntWrapper
Serialization stack:
- object not serializable (class: org.apache.spark.unsafe.types.UTF8String$IntWrapper, value: org.apache.spark.unsafe.types.UTF8String$IntWrapper@63ec9c06)
- field (class: org.apache.spark.sql.catalyst.expressions.Cast$$anonfun$castToInt$1, name: result$2, type: class org.apache.spark.unsafe.types.UTF8String$IntWrapper)