【原】storm源码之巧用java反射反序列化clojure的defrecord获取属性值
storm源码是clojure、java、python的混合体。在解决storm-0.8.2的nimbus单点问题的过程中需要从zookeeper上读取目前storm集群中正在运行的assignments信息,以获取其代码在nimbus机器上的绝对路径(PS:通过java代码实现自定义的storage)。
assignments信息可以通过CuratorFramework框架的客户端读取zookeeper上对应目录的data,如下:
byte[] data = curatorFramework.getData().forPath(assignments_dir);
其中data字节码数组保存的是storm nimbus在topology分配任务时序列化到zookeeper的Assignment字节码,Assignment定义如下:
(defrecord Assignment [master-code-dir node->host executor->node+port executor->start-time-secs])
PS:defrecord是clojure独有的一种数据结构,主要用来简便轻量地将数据组织在一起。详细可参考:defrecord
由于Assignment是在clojure源码编译后才会产生对应的Assignment类class文件,而storm的clojure源码编译又在其java源码编译之后(前者依赖后者定义的诸多接口及Utils),因此在编码期java代码中是无法import Assignment类的,只能将data反序列化成Object类,如下:
ByteArrayInputStream bis = new ByteArrayInputStream(serialized);
ObjectInputStream ois = new ObjectInputStream(bis);
Object assignment = ois.readObject();
ois.close();
得到的assignment Object结构如下图:
反序列化之后就需要从Object中获取master_code_dir属性值。这里可以通过反射的方式获取:
String master_code_dir = assignment.getClass().getDeclaredField("master_code_dir").get(assignment).toString();
如此实现了java代码中不import Assignment类即可从zookeeper获取clojure序列化的master_code_dir属性值。
【原】storm源码之巧用java反射反序列化clojure的defrecord获取属性值的更多相关文章
- storm源码之巧用java反射反序列化clojure的defrecord获取属性值
[原创]storm源码之巧用java反射反序列化clojure的defrecord获取属性值 [原创]storm源码之巧用java反射反序列化clojure的defrecord获取属性值 storm源 ...
- 利用Java反射根据类的名称获取属性信息和父类的属性信息
代码: import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Arrays; import java ...
- java 反射: 当Timestamp类型的属性值为null时,设置默认值
import java.beans.PropertyDescriptor; import java.lang.reflect.Field; import java.lang.reflect.Metho ...
- 【原】storm源码之storm代码结构【译】
说明:本文翻译自Storm在GitHub上的官方Wiki中提供的Storm代码结构描述一节Structure of the codebase,希望对正在基于Storm进行源码级学习和研究的朋友有所帮助 ...
- 【原】storm源码之一个class解决nimbus单点问题
一.storm nimbus 单节点问题概述 1.storm集群在生产环境部署之后,通常会是如下的结构:从图中可以看出zookeeper和supervisor都是多节点,任意1个zookeeper节点 ...
- 【原】storm源码之mac os x编译twitter storm源码
twitter storm是由backtype公司创始人nathanmarz一手研发和开源的流计算(实时计算)框架,堪称实时计算领域的hadoop.nathanmarz也是在mac os x环境下开发 ...
- storm源码之storm代码结构【译】【转】
[原]storm源码之storm代码结构[译] 说明:本文翻译自Storm在GitHub上的官方Wiki中提供的Storm代码结构描述一节Structure of the codebase,希望对正 ...
- storm源码之一个class解决nimbus单点问题【转】
本文导读: storm nimbus 单节点问题概述 storm与解决nimbus单点相关的概念 nimbus目前无法做到多节点的原因 解决nimbus单点问题的关键 业界对nimbus单点问题的努力 ...
- storm源码之理解Storm中Worker、Executor、Task关系 + 并发度详解
本文导读: 1 Worker.Executor.task详解 2 配置拓扑的并发度 3 拓扑示例 4 动态配置拓扑并发度 Worker.Executor.Task详解: Storm在集群上运行一个To ...
随机推荐
- Eclipse Debug 使用
Eclipse的debug模式:代码调试 * Eclipse或MyEclipse就是java的开发工具 * Eclipse开源的.免费的Java开发工具 * MyEclipse基于Eclipse开 ...
- Mac 下安装Ruby环境(转)
步骤1 - 安装 RVM RVM 是干什么的这里就不解释了,后面你将会慢慢搞明白. $ curl -L https://get.rvm.io | bash -s stable 期间可能会问你sudo管 ...
- Linux 压缩文件的命令行总结
Linux压缩文件的读取 · *.Z compress 程序压缩的档案: · *.bz2 bzip2 程序压缩的档案: · *.gz gzip 程序压缩 ...
- List分组迭代器 C#--深入理解类型
List分组迭代器 说明: 针对长度较大的List对象,可以分组批量进行处理, 如:长度为1000的List对象,可分为10组,每组100条,对数据进行业务逻辑处理... Source /**** ...
- rownum使用说明
参考:http://www.blogjava.net/conans/articles/219693.html 参考:http://www.blogjava.net/freeman1984/archiv ...
- bitnami-redmineserver迁移
1. 背景 在Redmineserver迁移过程中.假设前后两个Redmine的版本号一样,事情就简单,假设版本号不一样,就有可能面临两个版本号数据库不兼容.那就比較麻烦了.本文旨在介绍数据库不兼容时 ...
- SQL server账号无法登陆
- java中调用数据库中的存储过程和函数
public static void main(String[] args) { Connection conn =getConnection(url,user, pwd); ...
- Unity 扩展编辑器
扩展Inspector界面 继承自Editor,添加CustomEditorAttribute,传入定制的类型 定制显示的类型要求: 类型中所有的public 字段都会自动暴露给Inspector编辑 ...
- The Definitive Guide To Django 2 学习笔记(七) 第四章 模板 (三)使用模板系统
接下来,我们开始学习如何使用模板系统,但我们并不和前面说的View相结合,我们的这里的目的是展示模板系统是如何独立于Django框架运行的.下面是在pyhon代码中使用Django模板系统的基础例子: ...