大数据系统构建:可扩展实时数据系统构建原理与最佳实践》一3.2 Apache Thrift

本文涉及的产品
云原生大数据计算服务 MaxCompute,5000CU*H 100GB 3个月
云原生大数据计算服务MaxCompute,500CU*H 100GB 3个月
简介:

本节书摘来自华章出版社《大数据系统构建:可扩展实时数据系统构建原理与最佳实践》一书中的第3章,第3.2节,南森·马茨(Nathan Marz) [美] 詹姆斯·沃伦(JamesWarren) 著 马延辉 向 磊 魏东琦 译,更多章节内容可以访问云栖社区“华章计算机”公众号查看。

3.2 Apache Thrift

Apache Thrift(http://thrift.apache.org/)是一个可以用来定义静态类型化的、可实施模式的工具。它提供了接口定义语言,以通用数据类型的术语来描述模式,之后该描述可以用来自动生成多种编程语言的实现。
我们对APACHE THRIFT的使用:Thrift最初由Facebook开发,用来构建跨语言服务。它可以用于诸多目的,但我们将缩小讨论范围,只关注它作为一个序列化框架的使用。
其他序列化框架
还有其他类似于Apache Thrift的工具,如Protocol Buffers和Avro。记住,本书不是对每种情况的所有可能的工具提供调研,而是选用适当的工具来说明基本概念。作为一种序列化框架,Thrift已经经过了生产环境的完全测试并得到了广泛使用。

Thrift的核心是结构体(Struct)和联合体(Union)的类型定义。它们是由其他字段组成的,如:
原始数据类型(string,integer,long与double)
其他类型的集合(list,map与set)
其他结构体和联合体
一般来说,用联合体来表示节点是很有用的,结构体是边的自然表示,属性则将联合体和结构体结合起来使用。这对于需要表示SuperWebAnalytics.com模式组件的类型定义来说是有效的。

3.2.1 节点

对于SuperWebAnalytics.com用户节点,通过用户ID或浏览器Cookie标识某个人,而不会同时用这两个元素标识他。这种模式对于节点是常见的,且完全匹配联合体数据类型—单个值可能有几种表示方式。
在Thrift中,联合体通过罗列出所有可能的表示来定义。下面的代码使用Thrift联合体定义SuperWebAnalytics.com节点:
_1

注意:联合体还可用于单一表现形式的节点。联合体允许模式随着数据的演变而演变—我们稍后将在本节中进一步讨论这个问题。

3.2.2 边

每条边都可以表示为包含两个节点的结构体。边结构体的名称表明了它所代表的关系,边结构体中的字段包含了参与该关系的实体。
该模式定义非常简单:
_2
Thrift结构体的字段可以表示为required或optional。如果一个字段被定义为required,那么必须为该字段提供一个值,否则Thrift会在序列化或反序列化时给出一个错误。因为图模式中的每条边都必须有两个节点,所以在这个例子中它们是必需的字段。

3.2.3 属性

最后让我们来定义属性。属性包含一个节点和属性的值。因为值可以是诸多类型中的一种,所以最好使用联合体结构来表示。
首先定义页面属性的模式。页面只有一个属性,所以很简单:
_3
接下来定义人的属性。正如你看到的,位置属性更为复杂,需要另一个结构体来定义:

_4
位置结构体是很有意思的,因为city、state和country字段可能被存储为单独的数据片。在这种情况下,它们是密切相关的,因此把它们都放在一个结构体作为可选字段是讲得通的。当使用位置信息时,你可能会希望得到所有字段。

3.2.4 把一切组合成数据对象

此时,边和属性被定义为不同的类型。在理想情况下,你想将所有数据存储在一起,为访问你的信息只提供一个接口。此外,如果存储在单个数据集中,还能使得数据更容易管理。这可以通过将每个属性和边的类型封装到DataUnit联合体来实现—如代码清单3-1。
代码清单3-1 完成SuperWebAnalytics.com模式
_5
每个DataUnit与其元数据成对保存在一个Pedigree结构体中。Pedigree包含了信息的时间戳,但也可能包含调试信息或数据源。最后的Data结构体对应了基于行为模型中的一个行为。

3.2.5 模式演变

Thrift的设计使得模式可以随时间而演变。这是一个至关重要的属性,因为随着业务需求的改变,你将需要添加新类型的数据,并且想尽可能轻松地这样做。
演变Thrift模式的关键是与每个字段相关联的数值标识符。把这些序列化形式的ID用于标识字段。当想要改变模式但仍要向下兼容现有的数据时,你必须遵守以下规则:
字段可能被重新命名。这是因为对象的序列化形式使用字段ID而不是名称来标识字段。
一个字段可能被删除,但你绝不能重用那个字段ID。当反序列化现有数据时,Thrift将忽略字段ID没有包含在模式中的所有字段。如果你重用之前删除的字段ID,Thrift会尝试反序列化旧数据到新的字段,这将导致无效或不正确的数据。
只有可选的字段可以被添加到现有的结构体。你不能添加必需的字段,因为现有的数据不会有这些字段,所以不能被反序列化。(注意:这并不适用于联合体,因为联合体没有必需和可选字段的概念)
作为一个例子,如果想要改变SuperWebAnalytics.com模式来存储一个人的年龄和网页之间的链接,那么应对Thrift定义文件做出以下改变(变化的用粗体表示)。
代码清单3-2 扩展SuperWebAnalytics.com
_6
注意:添加新的年龄属性是通过添加到相应的联合体结构完成的,并且新的边可以通过将它添加到DataUnit联合体来实现内嵌。

相关实践学习
基于MaxCompute的热门话题分析
本实验围绕社交用户发布的文章做了详尽的分析,通过分析能得到用户群体年龄分布,性别分布,地理位置分布,以及热门话题的热度。
SaaS 模式云数据仓库必修课
本课程由阿里云开发者社区和阿里云大数据团队共同出品,是SaaS模式云原生数据仓库领导者MaxCompute核心课程。本课程由阿里云资深产品和技术专家们从概念到方法,从场景到实践,体系化的将阿里巴巴飞天大数据平台10多年的经过验证的方法与实践深入浅出的讲给开发者们。帮助大数据开发者快速了解并掌握SaaS模式的云原生的数据仓库,助力开发者学习了解先进的技术栈,并能在实际业务中敏捷的进行大数据分析,赋能企业业务。 通过本课程可以了解SaaS模式云原生数据仓库领导者MaxCompute核心功能及典型适用场景,可应用MaxCompute实现数仓搭建,快速进行大数据分析。适合大数据工程师、大数据分析师 大量数据需要处理、存储和管理,需要搭建数据仓库?学它! 没有足够人员和经验来运维大数据平台,不想自建IDC买机器,需要免运维的大数据平台?会SQL就等于会大数据?学它! 想知道大数据用得对不对,想用更少的钱得到持续演进的数仓能力?获得极致弹性的计算资源和更好的性能,以及持续保护数据安全的生产环境?学它! 想要获得灵活的分析能力,快速洞察数据规律特征?想要兼得数据湖的灵活性与数据仓库的成长性?学它! 出品人:阿里云大数据产品及研发团队专家 产品 MaxCompute 官网 https://www.aliyun.com/product/odps 
相关文章
|
1月前
|
消息中间件 数据挖掘 Kafka
Apache Kafka流处理实战:构建实时数据分析应用
【10月更文挑战第24天】在当今这个数据爆炸的时代,能够快速准确地处理实时数据变得尤为重要。无论是金融交易监控、网络行为分析还是物联网设备的数据收集,实时数据处理技术都是不可或缺的一部分。Apache Kafka作为一款高性能的消息队列系统,不仅支持传统的消息传递模式,还提供了强大的流处理能力,能够帮助开发者构建高效、可扩展的实时数据分析应用。
79 5
|
1月前
|
消息中间件 存储 监控
构建高可用性Apache Kafka集群:从理论到实践
【10月更文挑战第24天】随着大数据时代的到来,数据传输与处理的需求日益增长。Apache Kafka作为一个高性能的消息队列服务,因其出色的吞吐量、可扩展性和容错能力而受到广泛欢迎。然而,在构建大规模生产环境下的Kafka集群时,保证其高可用性是至关重要的。本文将从个人实践经验出发,详细介绍如何构建一个高可用性的Kafka集群,包括集群规划、节点配置以及故障恢复机制等方面。
75 4
|
1月前
|
消息中间件 监控 大数据
优化Apache Kafka性能:最佳实践与调优策略
【10月更文挑战第24天】作为一名已经对Apache Kafka有所了解并有实际使用经验的开发者,我深知在大数据处理和实时数据流传输中,Kafka的重要性不言而喻。然而,在面对日益增长的数据量和业务需求时,如何保证系统的高性能和稳定性成为了摆在我们面前的一个挑战。本文将从我的个人视角出发,分享一些关于如何通过合理的配置和调优来提高Kafka性能的经验和建议。
75 4
|
2月前
|
消息中间件 分布式计算 大数据
大数据-166 Apache Kylin Cube 流式构建 整体流程详细记录
大数据-166 Apache Kylin Cube 流式构建 整体流程详细记录
69 5
|
1月前
|
存储 数据挖掘 数据处理
巴别时代使用 Apache Paimon 构建 Streaming Lakehouse 的实践
随着数据湖技术的发展,企业纷纷探索其优化潜力。本文分享了巴别时代使用 Apache Paimon 构建 Streaming Lakehouse 的实践。Paimon 支持流式和批处理,提供高性能、统一的数据访问和流批一体的优势。通过示例代码和实践经验,展示了如何高效处理实时数据,解决了数据一致性和故障恢复等挑战。
111 61
|
2月前
|
Java 大数据 数据库连接
大数据-163 Apache Kylin 全量增量Cube的构建 手动触发合并 JDBC 操作 Scala
大数据-163 Apache Kylin 全量增量Cube的构建 手动触发合并 JDBC 操作 Scala
32 2
大数据-163 Apache Kylin 全量增量Cube的构建 手动触发合并 JDBC 操作 Scala
|
2月前
|
SQL 分布式计算 NoSQL
大数据-164 Apache Kylin Cube优化 案例1 定义衍生维度与对比 超详细
大数据-164 Apache Kylin Cube优化 案例1 定义衍生维度与对比 超详细
34 1
大数据-164 Apache Kylin Cube优化 案例1 定义衍生维度与对比 超详细
|
2月前
|
分布式计算 大数据 Apache
利用.NET进行大数据处理:Apache Spark与.NET for Apache Spark
【10月更文挑战第15天】随着大数据成为企业决策和技术创新的关键驱动力,Apache Spark作为高效的大数据处理引擎,广受青睐。然而,.NET开发者面临使用Spark的门槛。本文介绍.NET for Apache Spark,展示如何通过C#和F#等.NET语言,结合Spark的强大功能进行大数据处理,简化开发流程并提升效率。示例代码演示了读取CSV文件及统计分析的基本操作,突显了.NET for Apache Spark的易用性和强大功能。
48 1
|
2月前
|
存储 大数据 分布式数据库
大数据-165 Apache Kylin Cube优化 案例 2 定义衍生维度及对比 & 聚合组 & RowKeys
大数据-165 Apache Kylin Cube优化 案例 2 定义衍生维度及对比 & 聚合组 & RowKeys
42 1
|
1月前
|
数据采集 分布式计算 OLAP
最佳实践:AnalyticDB在企业级大数据分析中的应用案例
【10月更文挑战第22天】在数字化转型的大潮中,企业对数据的依赖程度越来越高。如何高效地处理和分析海量数据,从中提取有价值的洞察,成为企业竞争力的关键。作为阿里云推出的一款实时OLAP数据库服务,AnalyticDB(ADB)凭借其强大的数据处理能力和亚秒级的查询响应时间,已经在多个行业和业务场景中得到了广泛应用。本文将从个人的角度出发,分享多个成功案例,展示AnalyticDB如何助力企业在广告投放效果分析、用户行为追踪、财务报表生成等领域实现高效的数据处理与洞察发现。
55 0

推荐镜像

更多