歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Netflix推出Hollow,處理內存數據集的Java庫

Netflix推出Hollow,處理內存數據集的Java庫

日期:2017/3/1 9:05:42   编辑:Linux編程

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

Copyright © Linux教程網 All Rights Reserved