分享

Spark读取Hbase后转换重新写入Hbase其他表报错

唐运 发表于 2014-12-30 13:37:38 [显示全部楼层] 只看大图 回帖奖励 阅读模式 关闭右栏 2 53521
最近在研究Spark SQL,Spark将Hbase表中数据读取出来后映射为Table,使用SparkSQL查询转换后写入Hbase时报一下错误。

Exception in thread "main" org.apache.spark.SparkException: Task not serializable
        at org.apache.spark.util.ClosureCleaner$.ensureSerializable(ClosureCleaner.scala:166)
        at org.apache.spark.util.ClosureCleaner$.clean(ClosureCleaner.scala:158)
        at org.apache.spark.SparkContext.clean(SparkContext.scala:1264)
        at org.apache.spark.rdd.RDD.map(RDD.scala:270)
        at com.hbase.HbaseTest$.main(HbaseTest.scala:100)
        at com.hbase.HbaseTest.main(HbaseTest.scala)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:622)
        at org.apache.spark.deploy.SparkSubmit$.launch(SparkSubmit.scala:329)
        at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:75)
        at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)
Caused by: java.io.NotSerializableException: org.apache.hadoop.hbase.client.HTable
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1183)
        at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1547)
        at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1508)
        at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1431)
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1177)
        at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:347)
        at org.apache.spark.serializer.JavaSerializationStream.writeObject(JavaSerializer.scala:42)
        at org.apache.spark.serializer.JavaSerializerInstance.serialize(JavaSerializer.scala:73)
        at org.apache.spark.util.ClosureCleaner$.ensureSerializable(ClosureCleaner.scala:164)
        ... 12 more

已有(2)人评论

跳转到指定楼层
tntzbzc 发表于 2014-12-30 14:12:20

问题原因:


所生成的任务对象需要序列化,以便的不同的节点进行传输,保证数据的正确性。


下面是一个解决方案,可以根据下面原理解决自己的问题。



解决方案:
Scala的object和class需要实现接口 Serializable

/**
* constructor the object
*/
objectLewa_device_report extends Serializable {}

/**
* @author Administrator
* filepath    : String
* originalfileRDD      : org.apache.spark.rdd.RDD[StringBuffer]
* sqlcontext  :org.apache.spark.sql.SQLContext
*/
class Lewa_device_report( var filepath:String, val sparkcontext:org.apache.spark.SparkContext,val sqlcontext:org.apache.spark.sql.SQLContext)extends Serializable{}


查看一下API文档

关于SparkContext

1.jpg


关于SQLconntext

2.jpg

问题出在了SparkContext上,该类没有序列化

解决:转换思路,传递的参数不要包含SparkContext 参数

3.jpg






回复

使用道具 举报

june_fu 发表于 2016-1-13 09:38:14
能否说下是怎么Spark将Hbase表中数据读取出来的?谢谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条