序列化
这篇文章是关于序列化方法在storm 0.6.0版及之前版本中是如何工作的。0.6.0版之前,storm使用一种不同的序列化方法,参见 Serialization (prior to 0.6.0)。
元组可由任何一种类型的对象组成。由于storm是一个分布式系统,当对象在任务之间传递时,它需要知道如何序列化和反序列化这些对象。
Storm使用
Kryo进行序列化。Kryo是一个灵活快速的序列化库,产生小的序列化。
默认情况下,storm能序列化原始类型:String、字节数组、ArrayList、HashMap、HashSet及Clojure的集合类型。如果你想在元组中使用另外的类型,你需要注册一个自定义序列化装置。
动态类型
元组中字段没有声明类型。你放置对象到字段中,storm动态地计算出序列化。我们获到序列化接口之前,让我们花点时间理解为什么storm的元组是动态类型。
如果添加静态类型到元组字段将使Storm API非常复杂。例如,Hadoop,它的key和value是静态类型,但需要非常多的注解。使用Hadoop API是一个负担,这样子做到类型安全是不值得的。动态类型简单易用。
此外,不可能用合理的方式静态化storm元组的类型。假如一个bolt订阅多个数据流,这些数据流中的字段可能使用不同的数据类型。当一个bolt在execute方法中接收一个元组后,这个元组可以来自于任意一个数据流,因此元组的数据类型可以是任意数据类型的组合。这里也许你可以使用一些反射技巧,为一个bolt订阅的不同数据流中的元组声明不同的方法,但storm使用简单直接的方式实现动态类型。
最后,使用动态类型的另一个原因是因为允许动态类型语言以简单的方式使用storm,像Clojure和Ruby。
自定义序列化
如上所述,Storm使用
Kryo进行序列化。为了实现自定义序列化,你需要注册新的序列化装置和Kryo,强烈推荐你看看
Kryo的主页,了解它如何处理自定义序列化。
通过拓扑配置的“topology.kryo.register”属性添加自定义序列化。它需要一个注册清单,其中的每个注册都可以采用以下两种形式之一:
1. 你要注册的类名。在这种情况下,storm使用Kryo的“FieldsSerializer”来序列化这个类。对这个类来说,这不一定是最优的,更多细节参见Kryo文档。
让我们看一个例子:
- topology.kryo.register:
- - com.mycompany.CustomType1
- - com.mycompany.CustomType2: com.mycompany.serializer.CustomType2Serializer
- - com.mycompany.CustomType3
com.mycompany.CustomType1和com.mycompany.CustomType3的序列化使用FieldsSerializer。但com.mycompany.CustomType2的序列化使用com.mycompany.serializer.CustomType2Serializer。
Storm使用拓扑配置注册序列化装置提供了帮助。Config类的registerSerialization方法把注册的序列化装置添加到配置。
这里有一个称之为Config.TOPOLOGY_SKIP_MISSING_KRYO_REGISTRATIONS的高级配置。如果你设置它为真,storm将忽略任何已注册的序列化装置,就算classpath中没有它们的代码可用;否则,当storm未找到一个序列化装置时,将抛出异常。如果你在一个集群中运行多个拓扑,每个拓扑使用不同的序列化方式,但你想在storm.yaml文件中对这些拓扑声明各自的序列化方式,这个配置就非常有用。
Java序列化
如果storm遇到一个未注册序列化装置的类型,它将使用java序列化。如果对象不能用java序列化,storm将抛出异常。
注意,Java序列化是非常昂贵的,不管是CPU的花费,还是被序列化后对象所占的空间。在生产环境运行拓扑,强烈建议你注册自定义序列化装置。
通过设置Config.TOPOLOGY_FALL_BACK_ON_JAVA_SERIALIZATION为假,你可以关闭这个行为,回退到使用java序列化。
分享到:
相关推荐
- Storm 支持多种序列化方式,其中动态类型允许在运行时决定序列化策略。 - **2.3.2 自定义序列化** - 用户可以通过实现自己的序列化类来满足特定的需求。 - **2.3.3 Java序列化** - Java 序列化是一种常见的序列...
3. 数据序列化和反序列化,如JSON、Avro或Protobuf,它们在组件间数据交换中的角色。 4. Java编程基础,因为大部分的配置和开发都是基于Java进行的。 5. 集群的扩展性和故障恢复策略,例如Kafka的副本策略和Storm的...
在Storm的架构中,流(Stream)的概念至关重要,它表示无界且不间断的数据序列。每个流由一系列的元组(Tuple)组成,元组是Storm的基本数据单元,可以包含各种类型的数据。流的源头被抽象为Spout,它可以是数据源,...
对于自定义对象,需要实现Serializer接口以便进行序列化和反序列化。 7. **声明输出域**: 每个Bolt必须声明其输出的字段名,通过`declareOutputFields`函数来指定。这有助于明确数据流的结构和类型。 8. **简单...
还可以优化消息传递的序列化和反序列化过程,减少消息在网络中的传输时间。此外,监控和日志记录也是调优的重要组成部分,有助于识别性能瓶颈和故障点。 ### 实时事件处理的策略 Storm框架特别适用于需要低延迟...
比如,调整拓扑的并发度、优化数据序列化方式、设置合理的缓冲区大小等,都能影响到系统的性能和稳定性。同时,监控和日志管理也是必不可少的,以确保系统在出现问题时能及时发现并解决。 总的来说,基于Storm的大...
8. **可视化**:使用Python的`matplotlib`或`seaborn`库来展示情感分布、时间序列分析等,帮助理解情感动态。 9. **实时响应系统**:构建一个能够实时处理新推文、快速返回情感分析结果的系统,可能涉及到流处理...
- **管理状态的自定义序列化**:说明如何自定义状态的序列化过程。 #### 五、算子 - **视窗**:讲解如何使用窗口进行数据聚合。 - **Join**:介绍不同类型的连接操作。 - **过程函数(低级算子操作)**:深入探讨...
- **Twitter TSAR**:Twitter的时间序列聚合器。 以上列举的资源和框架是大数据领域的核心组件,它们共同构成了大数据生态系统,帮助企业、组织和个人有效地管理和利用海量数据。随着技术的发展,这些工具不断演进...
实时计算方面,Storm是早期的领导者,尽管Twitter已转向Heron,但JStorm(阿里巴巴的分支)在性能和功能上都有显著提升,是Storm的有力替代。Spark Streaming作为实时处理的另一种选择,采用了微批处理的方式,适用...
在 Spark Streaming 中,数据输入源非常多样化,包括 Kafka、Flume、Twitter、ZeroMQ 和 TCP 套接字等。一旦数据被摄入,可以应用 map、reduce、join 和 window 等操作进行计算,就像在 Spark Core 中处理 RDD 一样...
Spark Streaming类似于Apache Storm,是用于流式数据的处理。它具有高吞吐量和容错能力强等特点,支持的数据输入源很多,例如Kafka、Flume、Twitter和TCP套接字等。数据输入后可用高度抽象API,如map、reduce、join...
而ActiveMQ则使用Java序列化对象,逐条处理,依赖于JVM内存。 3. **规范遵循**:Kafka并未完全遵循JMS规范,具有更广泛的应用场景;而ActiveMQ则是JMS规范的一个具体实现。 4. **高可用性和高吞吐量**:Kafka通过...
DStream 实质上是一个有序的 RDD 序列,每个 RDD 包含了在特定时间区间内收集的数据。 - **批数据(Batch Data)**:为了便于处理,Spark Streaming 将连续的实时数据流按时间片断分割成一系列的小批量数据集。这种...
例如,Twitter的Storm,作为一个流式数据计算架构,能够进行大规模、快速的数据处理,对于需要即刻分析的场景尤其有用。 批量数据处理技术则是先存储数据,再进行集中计算的技术。这种技术适用于大规模、静态型的...
nfs-rpc是一个集成了各种知名通信框架的高性能RPC框架,目前其最好的性能为在采用grizzly作为通信框架,采用pb作为序列化/反序列化时,tps为168k次/秒。 其支持的功能主要为: 1、透明的调用远端服务器提供的功能...
nfs-rpc是一个集成了各种知名通信框架的高性能RPC框架,目前其最好的性能为在采用grizzly作为通信框架,采用pb作为序列化/反序列化时,tps为168k次/秒。 其支持的功能主要为: 1、透明的调用远端服务器提供的功能...
nfs-rpc是一个集成了各种知名通信框架的高性能RPC框架,目前其最好的性能为在采用grizzly作为通信框架,采用pb作为序列化/反序列化时,tps为168k次/秒。 其支持的功能主要为: 1、透明的调用远端服务器提供的功能...
nfs-rpc是一个集成了各种知名通信框架的高性能RPC框架,目前其最好的性能为在采用grizzly作为通信框架,采用pb作为序列化/反序列化时,tps为168k次/秒。 其支持的功能主要为: 1、透明的调用远端服务器提供的功能...
nfs-rpc是一个集成了各种知名通信框架的高性能RPC框架,目前其最好的性能为在采用grizzly作为通信框架,采用pb作为序列化/反序列化时,tps为168k次/秒。 其支持的功能主要为: 1、透明的调用远端服务器提供的功能...