1. 程式人生 > >《Hadoop權威指南》---hadoop的I/O操作

《Hadoop權威指南》---hadoop的I/O操作

一、概述

hadoop自帶一套原子操作用於I/O操作,如資料完整性和壓縮。

二、資料完整性

hadoo使用者希望系統在儲存和處理資料時不會丟失或損壞任何資料,這樣資料的完整性就顯得尤為重要。HDFS會對寫入的所有資料計算校驗和並在讀取資料時驗證校驗和,其實HDFS儲存著每個資料塊的複本,一旦校驗資料損壞,就將損壞的資料複製到另一個datanode,然後將這個資料的複本複製到當前需要讀取的datanode上,一旦資料讀取成功,就將已損壞的資料塊刪除。hadoop的LocalFileSystem執行客戶端的校驗和驗證,它是通過ChecksumFileSystem來完成自己的任務。

三、壓縮

檔案壓縮與兩大好處,減少儲存檔案所所需要的磁碟空間,並加速資料在網路上的傳輸,多於大資料量時就就顯得更加的重要。壓縮的格式有很多種,各有千秋,gzip是一個通用的壓縮工具,因為在空間和時間效能上都是比較均衡的。

java中已經提供的API,實現codec介面來完成的一種壓縮-解壓縮的演算法。

前面也說到了,有的壓縮格式是不支援輸入分片的,也就是說是否可以搜尋資料流的任意位置並進一步往下讀取資料。很明顯gzip是不行的,但是bzip2是可以的,對於MapReduce這種需要分片讀取的時候選擇什麼樣的壓縮方式就顯得尤為重要。

四、序列化

序列化指的是將結構化物件轉化為位元組流以便在網路上傳輸或寫到磁碟進行永久儲存的過程,反序列化是指將位元組流轉回結構化物件的逆過程。hadoop使用的是自己的序列化格式Writable,它絕對緊湊、速度快,但是不太容易用java以外的語言進行擴充套件或使用。基於“介面定義語言”(Interface Description Language IDL)的序列化框架有Apache Thrift和Google Protocol Buffers是兩個比較流行的序列化框架。

五、Apache Avro

Apache Avro是一個獨立於程式語言的資料序列化系統,是由Doug Cutting建立,旨在解決hadoop中Writable型別的不足:缺乏語言的可移植性。擁有一個可以被多種語言處理的資料格式與繫結到單一語言的資料格式相比,前者更易於與公眾共享資料集,同時也更具有生命力,該語言將使得資料具有更長的生命週期,即時原先用於讀/寫該資料的語言已經不再使用。與上面的兩種框架相比,Avro資料是與語言無關的模式定義的,但是與其他系統不同的是,程式碼生成是可選的,並且Avro的模式通常用JSON來寫,當然還有一種高階語言稱為Avro IDL,可以使用C語言編寫。

六、基於檔案的資料結構

對於基於MapReduce的資料處理,將每個二進位制資料大物件單獨放在各自的檔案中不能實現可擴充套件性,所以hadoop提供了很多更高層次的容器:

  • SequenceFile:為二進位制鍵/值對提供了一個持久化資料結構,同時也可以作為小檔案的容器。
  • MapFile:是已經排過序的SequenceFile的寫操作。