Hadoop IO操作之壓縮
減少儲存文件所需空間,還可以降低其在網絡上傳輸的時間。
壓縮算法對比
算法 原始文件大小 壓縮後文件大小 壓縮速度 解壓縮速度
Gzip 8.3G 1.8G 17.5MB/s 58MB/s
Bzip2 1.1 2.4MB/s 9.5MB/s
LZO-bset 2 4MB/s 60.6MB/s
LZO 2.9 49.3MB/s 74.6MB/s
Bzip2支持切分 splitting.hdfs上文件1GB,如按照默認塊64MB,那麽這個文件被分為16個塊。如果把這個塊放入MR任務 ,將有16個map任務輸入。如果算法不支持切分,後果是MR把這個文件作為一個Map輸入。這樣任務減少了,降低了數據的本地性。
1.CodeC
實現了一種壓縮解壓算法。Hadoop中壓縮解壓類實現CompressionCodec接口createOutputStream來創建一個CompressionOutputStream,將其壓縮格式寫入底層的流演示HDFS上一個1.bzip2算法壓縮的文件解壓,然後把解壓的文件壓縮成2.gz。
2.本地庫
Hadoop使用java開發,但是有些需求和操作並不適合java,所以引入了本地庫 native。可以高效執行某些操作。如使用gzip壓縮解壓時,使用本地庫比使用java時間要縮短大約10%,解壓達到50%。在hadoop_home/lib/native下
在hadoop配置文件core-site.xml可以設置是否使用native
<property>
<name>Hadoop.native.lib
<value>true
</property>
默認是啟用本地庫,如果頻繁使用原生庫做壓解壓任務,可以使用codecpool,通過CodecPool的getCompressor方法獲得Compressor對象,需要傳入Codec 。這樣可以節省創建Codec對象開銷 ,允許反復使用。
使用哪種壓縮和具體應用有關,對於巨大,沒有儲存邊界的文件如日誌 可以考慮:
·儲存不壓縮的文件
·使用支持切分的儲存格式 bzip2
·在應用中切分,然後壓縮,需要選擇合理數據塊的大小,以確定壓縮後的塊大小
·使用順序文件SF,支持壓縮和切分
·使用Avro數據文件,支持壓縮切分並增加了編程語言可讀寫的優勢對於大文件,不應該使用不支持切分的壓縮格式,否則失去本地性,造成MR應用效率低下。
Hadoop IO操作之壓縮