无法在Apache Spark中使用hibernate类

时间:2015-03-16 10:06:49

标签: hibernate apache-spark

我正在尝试使用Apache Spark进行高速计算。此计算的结果需要存储在Oracle中。

我正在使用hibernate来做这件事。但是由于hibernate中的某些类(JDBCTransaction)不可序列化 - 当它们被使用时会抛出java.io.NotSerializableException:org.hibernate.transaction.JDBCTransaction),spark集群不支持使用hibernate。

有没有什么工作可以使用hibernate来处理spark?

我尝试使用字节码注入将JDBCTransaction类标记为可序列化,但它会抛出java.lang.IllegalStateException:未读块数据异常。

1 个答案:

答案 0 :(得分:1)

听起来您正在尝试在驱动程序中创建Transaction对象,并在RDD分区上执行事务。这就是你得到可序列化异常的原因; spark执行试图将事务对象发送到远程进程,这显然不起作用。即使您可以对其进行序列化,在多个远程并行事务中使用相同的事务对象也是无效的。

如果您需要并行地向数据库写入数据,您应该查看RDD.foreachPartition(),这将允许您在本地为每个单独的paritition /进程创建数据库连接和事务。

如果要写入数据库的数据相对较小,您可以改为收集()它,将其作为驱动程序本地对象返回,然后您可以从那里写入数据库。