Netflix推出Hollow,处理内存数据集的Java库
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上找到。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Java虚拟机自动内存管理
生活规律告诉我们,在享受便利的同时一般都会付出巨大的代价,如果你在享受了便利的同时,还没有为此付出代价,不是说明没有,只是还没到付出的时候。试问,有哪个Java系统架构师不懂Java虚拟机?纵观Java程序员的发展历程,又有多少人是卡在了Java虚拟机之上。所以如果你还没有感觉到为此付出代价,说明你已经Java虚拟机的糖衣炮弹所击中,且被毒害之深。Java的自动内存管理就是这样,像毒药一样,一旦上瘾就很难戒掉,而且会沉迷于此。而正确的做法就是了解其原理,拿到尚方宝剑,当虚拟机不好好为你提供服务时,拿出宝剑,以便立刻制服他。而此尚方宝剑的锻造需要经历巨大磨难,唯以毅力坚定者方能铸成。 Java的内存管理主要两部分,一部分是Java的内存分配,另外一部分是内存的回收。对于这部分内容的了解,首先必须了解清楚Java虚拟机的内存结构。如果对内存结构不熟悉的朋友可以看关于Java虚拟机的内存结构这篇文章。我们知道内存可以分为5大块区域,从自动内存管理的角度,线程独占区的内存是比较容易进行管理的,线程创建就要分配这些区域,线程的销毁这些区域也就释放了,因此我们这里主要讨论的主要是关于堆内存和方法区...
- 下一篇
基于大数据技术的全国高速公路通行数据 动态监测平台建设
项目背景 大数据及其应用迅速发展,已经渗透到各个行业和业务职能领域,成为重要的生产因素,2015年8月国务院印发《促进大数据发展行动纲要》,将大数据提升为国家战略。在未来的5-10年,我国将把大数据作为提升政府治理能力的重要手段,大力推进大数据在政府管理中创新应用。为此,《交通运输信息化”十三五”发展规划》中提出要”运用大数据分析技术,开展交通运输经济运行分析、政策实施效果评价、交通发展趋势研判等分析工作,提高交通运输宏观掌控能力”。《交通运输统计发展纲要》也提出要”充分利用大数据、云计算等现代信息技术,变革统计生产方式,再造统计业务流程,丰富统计服务产品,不断提升统计生产能力、管理能力和服务能力,开创交通运输统计发展新局面”。 “十二五”以来,信息化逐渐融入行业管理的方方面面,作为大数据应用的基础,交通运输行业数据资源日益丰富。随着以高速公路联网收费、运输车辆联网联控、智能公交、物流信息平台等为代表的行业信息化重大工程的稳步实施,交通运输行业管理部门所掌握的交通大数据规模爆发性增长,这为推进交通运输行业大数据的应用,以大数据支撑行业管理决策,提高交通行业管理自动化、智能化水平提供了基...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- 2048小游戏-低调大师作品
- CentOS6,CentOS7官方镜像安装Oracle11G
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS7设置SWAP分区,小内存服务器的救世主