Tag: kryo

SPARK到HBase写作

我的SPARK计划的流程如下: 驱动程序 – >创建Hbase连接 – >广播Hbase句柄现在从执行程序,我们获取此句柄并尝试写入hbase 在Driver程序中,我正在创建HBase conf对象和Connection Object,然后通过JavaSPARK Context广播它,如下所示: SparkConf sparkConf = JobConfigHelper.getSparkConfig(); Configuration conf = new Configuration(); UserGroupInformation.setConfiguration(conf); jsc = new JavaStreamingContext(sparkConf, Durations.milliseconds(Long.parseLong(batchDuration))); Configuration hconf=HBaseConfiguration.create(); hconf.addResource(new Path(“/etc/hbase/conf/core-site.xml”)); hconf.addResource(new Path(“/etc/hbase/conf/hbase-site.xml”)); UserGroupInformation.setConfiguration(hconf); JavaSparkContext js = jsc.sparkContext(); Connection connection = ConnectionFactory.createConnection(hconf); connectionbroadcast=js.broadcast(connection); 执行器的内部call()方法, Table table = connectionbroadcast.getValue().getTable(TableName.valueOf(“gfttsdgn:FRESHHBaseRushi”)) ; Put p = new Put(Bytes.toBytes(“row1”)); p.add(Bytes.toBytes(“c1”), Bytes.toBytes(“output”), Bytes.toBytes(“rohan”)); […]

Kryo反序列化失败,出现“KryoException:Buffer underflow”

我使用Kryo将对象写入字节数组。 它工作正常。 但是当字节数组转换为对象时,它会抛出, com.esotericsoftware.kryo.KryoException: Buffer underflow. 例外。 这是我的反序列化: Kryo k=new Kryo(); Input input=new Input(byteArrayOfObject); Object o=k.readObject(input,ObjectClass.class); 此外,始终无法在我的应用程序中定义对象类型。 在最后的过程中,类转换发生。 因此, 如何解决上面的反序列化错误 有没有办法创建Object而不将类赋予readObject(…,ClassName)?

处理序列化框架的不兼容版本更改

问题描述 我们有一个Hadoop集群,我们在其上存储使用Kryo (序列化框架)序列化为字节的数据。 我们用来做这个的Kryo版本已从正式版本2.21中分离出来,将我们自己的补丁应用于我们使用Kryo遇到的问题。 当前的Kryo 2.22版本也修复了这些问题,但使用了不同的解决方案。 因此,我们不能只更改我们使用的Kryo版本,因为这意味着我们将无法再读取已存储在Hadoop集群中的数据。 为了解决这个问题,我们想要运行一个Hadoop作业 读取存储的数据 反序列化使用旧版Kryo存储的数据 使用新版本的Kryo序列化已还原的对象 将新的序列化表示写回我们的数据存储 问题是在一个Java程序中使用同一个类的两个不同版本并不简单(更准确地说,在Hadoop作业的映射器类中)。 问题简而言之 如何在一个Hadoop作业中使用同一序列化框架的两个不同版本反序列化和序列化对象? 相关事实概述 我们将数据存储在Hadoop CDH4集群上,使用Kryo版本2.21.2-ourpatchbranch进行序列化 我们希望将数据与Kryo 2.22版本序列化,这与我们的版本不兼容 我们使用Apache Maven构建我们的Hadoop作业JAR 可能的(也是不可能的)方法 (1)重命名包 我们想到的第一种方法是使用Maven Shade插件的重定位function重命名我们自己的Kryo分支中的包,并使用不同的工件ID释放它,这样我们就可以依赖转换作业项目中的两个工件。 然后,我们将实例化旧版本和新版本的一个Kryo对象,并使用旧版本进行反序列化,并使用新版本再次序列化对象。 问题 我们不在Hadoop作业中明确使用Kryo,而是通过我们自己的库的多个层访问它。 对于这些库中的每一个,都有必要 重命名涉及包和 使用不同的组或工件ID创建发布 为了使事情更加混乱,我们还使用其他第三方库提供的Kryo序列化程序,我们必须做同样的事情。 (2)使用多个类加载器 我们提出的第二种方法是在包含转换作业的Maven项目中完全不依赖于Kryo,而是从每个版本的JAR加载所需的类,该版本存储在Hadoop的分布式缓存中。 然后序列化对象看起来像这样: public byte[] serialize(Object foo, JarClassLoader cl) { final Class kryoClass = cl.loadClass(“com.esotericsoftware.kryo.Kryo”); Object k = kryoClass.getConstructor().newInstance(); ByteArrayOutputStream baos = […]