本節書摘來自華章出版社《spark大資料分析:核心概念、技術及實踐》一書中的第1章,第1.2節,作者[美] 穆罕默德·古勒(mohammed guller),更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。
1.2 資料序列化
資料有自己的生命周期,獨立于建立或使用它的程式。大多數情況下,資料比建立它的應用存活得更久。一般來說,資料儲存在硬碟上。有時,也會通過網絡把資料從一個應用發送給另一個應用。
在硬碟上存儲或通過網絡發送的資料格式與資料在記憶體中的格式是不一樣的。把記憶體中的資料轉換為可在硬碟上存儲或通過網絡發送的過程叫作序列化,而把硬碟或網絡中的資料讀取到記憶體的過程叫作反序列化。
資料可以用多種不同的格式進行序列化,比如csv、xml、json和各種二進制格式。每種格式各有優缺點。比如,像csv、xml和json這樣的文本格式對人類友好,但在存儲空間或解析時間方面并不十分高效。另一方面,二進制格式更加緊湊,在解析上比文本格式更快,但可讀性較差。
在資料集較小時,文本和二進制格式之間的序列化/反序列化時間和存儲空間差異不是什麼大問題。是以,人們通常首選文本格式來處理小資料集,因為它更容易管理。然而,對于大資料集,文本和二進制格式之間的序列化/反序列化時間和存儲空間差異将是極大的。是以,首選二進制格式來存儲大資料集。
本節講述一些常用的用來序列化大資料的二進制格式。
1.2.1 avro
avro提供了一個簡潔的且獨立于語言的二進制格式,用來資料序列化。它可用來存儲資料到檔案或通過網絡發送資料。它支援多種資料結構,包括嵌套資料。
avro使用一種自描述的二進制格式。使用avro序列化資料時,模式與資料同時存儲。這樣一來,稍後avro檔案可以被任何應用讀取。另外,因為模式與資料同時存儲,是以寫資料時沒有關于值的間接開銷,使得序列化快速、緊實。使用avro通過網絡交換資料時,發送端和接收端在初始化連接配接握手時交換模式。avro模式使用json描述。
avro自動處理字段的添加和删除、前向和後向相容性,這些都不需應用來負責。
1.2.2 thrift
thrift是一個獨立于語言的資料序列化架構,主要提供工具來完成不同程式設計語言所寫的應用之間通過網絡進行的資料交換序列化。它支援多種語言,包括:c++、java、python、php、ruby、erlang、perl、haskell、c#、cocoa、javascript、node.js、smalltalk、ocaml、delphi和其他語言。
thrift提供一個代碼生成工具和一組用于序列化資料并通過網絡傳輸的庫。它抽象了序列化資料和通過網絡傳輸資料的機制。是以,它使得應用開發者可以集中精力于核心的應用邏輯,而不用擔心如何序列化資料和可靠、有效地傳輸資料。
通過thrift,應用開發者在一個語言中立的接口定義檔案中定義資料類型和服務接口。在接口定義檔案中定義的服務由伺服器端應用提供,并由用戶端應用使用。thrift編譯器編譯這個檔案,并生成開發者用來快速建構用戶端和伺服器端應用的代碼。
基于thrift的伺服器和用戶端可以在相同計算機或網絡上的不同計算機上運作。同樣地,伺服器端和用戶端應用可以使用同一種程式設計語言來開發,也可以用不同程式設計語言來開發。
1.2.3 protocol buffers
protocol buffers是google開發的開源資料序列化架構。類似于thrift和avro,它也是語言中立的。google内部用protocol buffers作為主要的檔案格式,也将其用來進行應用間的資料交換。
protocol buffers與thrift類似,前者提供一個編譯器和一組庫來幫助開發者序列化資料。開發者在一個檔案中定義資料集的結構或模式,然後用protocol buffers編譯器進行編譯,由此生成可用來輕松讀寫資料的代碼。
相對thrift而言,protocol buffers支援較少的程式設計語言。目前,它支援c++、java和python。另外,不像thrift那樣同時提供資料序列化和建構遠端服務的工具,protocol buffers主要是一種資料序列化格式,可以用來定義遠端服務,但并未限定到任何rpc(遠端過程調用)協定。
1.2.4 sequencefile
sequencefile是一種用于存儲鍵值對的二進制檔案格式。它通常作為hadoop的輸入和輸出檔案格式。mapreduce也用sequencefile來存儲map函數傳回的臨時輸出。
sequencefile有三種不同的格式:未壓縮格式、記錄壓縮格式和塊壓縮格式。在記錄壓縮格式的sequencefile中,隻有記錄中的值才壓縮;而在塊壓縮格式的sequencefile中,鍵和值都壓縮。