阿里云「飞天发布时刻」2024来啦!新产品、新特性、新能力、新方案,等你来探~ 了解详情
写点什么

Netflix 推出 Hollow,处理内存数据集的 Java 库

  • 2017-02-07
  • 本文字数:1712 字

    阅读完需:约 6 分钟

Netflix 最近推出了 Hollow ,一款 Java 库和工具包,旨在有效缓存不属于“大数据”的数据集。这些数据集可能是电子商务和搜索引擎的元数据,或者是 Netflix 电影和电视节目的元数据。处理这种数据集的传统方法包括数据存储或串行化,但这可能会有可靠性和延迟问题。Hollow 的入门指南中总结了核心概念和命名方法:

Hollow 管理由单个 _ 生产者 _ 构建的数据集,并向一个或多个 _ 消费者 _ 传送以用于只读访问。数据集会随着时间而改变。改变的数据集的时间线可以分为离散的 _ 数据状态 _,每个状态都是那个特定时间点数据的完整快照。

生产者和消费者通过在数据状态之间转换的 _ 状态引擎 _ 来处理数据集。生产者使用 _ 写状态引擎 _,而消费者使用 _ 读状态引擎 _。

Hollow 取代了 Netflix 原先的内存数据集框架 Zeno 。数据集现在用紧凑的、固定长度的、强类型的数据编码表示。这种编码最小化了数据集占用的空间,并将编码记录“打包在 JVM 堆上合并的可重用内存条中,以避免影响繁忙的服务器上的 GC 行为。”

入门
要开始使用 Hollow 示例,请参考以下 POJO:

复制代码
public class Movie {
long id;
String title;
int releaseYear;
public Movie(long id,String title,int releaseYear) {
this.id = id;
this.title = title;
this.releaseYear = releaseYear;
}
}

上述 POJO 上简单的数据集可以这样填充:

复制代码
List<Movie> movies = Arrays.asList(
new Movie(1,"The Matrix",1999),
new Movie(2,"Beasts of No Nation",2015),
new Movie(3,"Goodfellas",1990),
new Movie(4,"Inception",2010)
);

Hollow 将这样的 movies 列表转换为新的编码形式,如下所示:

有关编码的更多详细信息,请参阅 Hollow 网站的高级主题章节

生产者
生产者的第一个示例发布了数据集(本例中的电影)的初始数据状态,并通知消费者在哪里找到该数据集。对数据集的后续更改会系统地发布并传送给消费者。

生产者使用 HollowWriteStateEngine 作为数据集的句柄:

复制代码
HollowWriteStateEngine writeEngine = new HollowWriteStateEngine();

HollowObjectMapper 填充 HollowWriteStateEngine:

复制代码
HollowObjectMapper objectMapper = new HollowObjectMapper(writeEngine);
for(Movie movie : movies) {
objectMapper.addObject(movie);
}

HollowObjectMapper 是线程安全的,也可以并行执行。

生产者将数据集(也称 blob)写入定义的输出流:

复制代码
OutputStream os = new BufferedOutputStream(new FileOutputStream(snapshotFile));
HollowBlobWriter writer = new HollowBlobWriter(writeEngine);
writer.writeSnapshot(os);

为消费者生成 API
客户端 API 基于数据模型生成必要的 Java 文件,并且必须在写入初始的消费者源代码前执行:

复制代码
HollowAPIGenerator codeGenerator = new HollowAPIGenerator(
"MovieAPI", // a name for the API
"org.redlich.hollow.consumer.api.generated", // the path for generated API files
stateEngine); // the state engine
codeGenerator.generateFiles(apiCodeFolder);

消费者
一旦通知消费者已发布的数据集,消费者使用 HollowWriteReadEngine 作为数据集的句柄:

复制代码
HollowReadStateEngine readEngine = new HollowReadStateEngine();

HollowBlobReader 将 blob 从生产者消费到 HollowReadStateEngine:

复制代码
HollowBlobReader reader = new HollowBlobReader(readEngine);
InputStream is = new BufferedInputStream(new FileInputStream(snapshotFile));
reader.readSnapshot(is);

通过生成的 API 可以访问到数据集中的数据:

复制代码
MovieAPI movieAPI = consumer.getAPI();
for(MovieHollow movie : movieAPI.getAllMovieHollow()) {
System.out.println(movie._getId() + ", " +
movie._getTitle()._getValue() + ", " +
movie._getReleaseYear());
}

这将打出结果输出:

复制代码
1, "The Matrix", 1999
2, "Beasts of No Nation", 2015
3, "Goodfellas", 1990
4,"Inception", 2010

完整的 Hollow 项目可以在 GitHub 上找到。

InfoQ 最近和 Netflix 高级软件工程师及 Hollow 主要贡献者 Drew Koszewnik 进行了详细的访谈,讨论了Hollow 的具体实现细节。

查看英文原文 Netflix Introduces Hollow, a Java Library for Processing In-Memory Datasets

2017-02-07 18:002918
用户头像

发布了 218 篇内容, 共 64.9 次阅读, 收获喜欢 75 次。

关注

评论

发布
暂无评论
发现更多内容

作业帮检索服务基于 Fluid 的计算存储分离实践

阿里巴巴中间件

云计算 云原生 中间件 存储分离 Fluid

百度智能云产业智能化新生态,新在哪里?

百度开发者中心

人工智能

一年又要过去了!盘点2021年区块链的6个关键词

CECBC

阿里云王志坤:强劲可靠、无处不在的云,为创新保驾护航

阿里云弹性计算

弹性计算 年度峰会

高效工作?畅快游戏?来开发者Meetup探索AI技术新玩法

OpenI启智社区

人工智能 飞桨领航团

有趣的灵魂万里挑一:从智能座舱看汽车进化史

脑极体

游戏用户LTV预测实践

bilibili游戏技术

Spring Cloud Alibaba 2.2.7 版本正式发布

阿里巴巴中间件

云计算 开源 微服务 中间件 spring cloud ali

ARMS 应用安全-你的应用运行时的隐形安全卫士

阿里巴巴中间件

云原生 中间件 RASP Arms

一周信创舆情观察(12.20~12.26)

统小信uos

最近火热的web3到底是什么?

石云升

区块链 28天写作 12月日更 web3

架构实战营 - 模块 3 - 作业

Pyel

「架构实战营」

腾讯云分布式数据库TDSQL在东吴证券新一代核心交易系统中成功落地

腾讯云数据库

tdsql 国产数据库

迷雾中的自动化测试体系建设

CODING DevOps

自动化测试 接口测试 业务驱动测试

开源社庄表伟:开源要出圈了,推坑文化、沉浸式养鱼塘,社区建设心法了解一下 I OpenTEKr 大话开源 Vol.5

OpenTEKr

大话开源

设计消息队列存储消息数据的MySQL 表格

Steven

架构实战营

以 Kubernetes 的方式来运行极狐GitLab Runner

极狐GitLab

架构实战 模块三作业

mj4ever

架构实战

Hoo研究院币 | 币海寻珠——加密行业即将到来的发售事件

区块链前沿News

加密货币 虎符 虎符交易所

首个国产分布式数据库调研:TDSQL产品技术及服务能力排名

腾讯云数据库

tdsql 国产数据库

TDengine在水电厂畸变波形分析及故障预判系统中的应用

TDengine

数据库 大数据 tdengine 物联网 时序数据库

KubeCon China 2021 阿里云专场来了!这些首日亮点不容错过

阿里巴巴中间件

阿里云 云原生 中间件 cncf KubeCON

Java中的深拷贝和浅拷贝

Ayue、

深拷贝

『SphereEx 年终贺礼』专注为用户提供更好的使用体验

SphereEx

开源 ShardingSphere 一键部署 SphereEx-Boot 开源公司

RocketMQ Streams:将轻量级实时计算引擎融合进消息系统

阿里巴巴中间件

阿里云 RocketMQ 云原生 中间件

LabVIEW图像增强算法(基础篇—5)

不脱发的程序猿

机器视觉 图像处理 LabVIEW 图像增强算法

突破底层基础架构瓶颈,揭秘TDSQL存储核心技术

腾讯云数据库

tdsql 国产数据库

性能工具之代码级性能测试工具ContiPerf

zuozewei

单元测试 性能测试 测试工具 12月日更

中科柏诚:加速银行数字化转型的新引擎

联营汇聚

不用任何框架,Java 就能实现定时任务的 3 种方法!

CRMEB

为什么说绿色区块链是未来金融范式的必要底层?

CECBC

Netflix推出Hollow,处理内存数据集的Java库_Java_Michael Redlich_InfoQ精选文章