Hadoop compress-stream

681 views
543 views

Published on

for old version of hadoop (0.

0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
681
On SlideShare
0
From Embeds
0
Number of Embeds
4
Actions
Shares
0
Downloads
6
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Hadoop compress-stream

  1. 1. 读一块数据的基本流程 一个解压流的对象关系 (以LZO为例) readBlock (压缩块在文件中的偏移量, 硬盘上的压缩块大小, BufferedInputStream FilterInputStream解压后数据的大小[一般在块压缩文件中会 (缓存Buffer是1KB) 记住这个大小]) 包含底层流compressAlgo.getDecompressor() 根据用户选择的压缩算法获得一个 BlockDecompressorStreamDecomprssor[可能是从CodecPool中得到或 (解压buffer为64KB, DecompressorStream CompressionInputStream new出来] 对应一个Decompressor) 包含底层流 根据前面设置的文件中的块 new BoundedRangeFileInputStream BoundedRangeFileInputStream 用来读取文件中的其中一块压缩数据 (对应底层流中的一段数据 start-end) 可在同一个底层流上有多个,close 时不会close底层流 compressAlgo. 包含底层流 createDecompressionStream() 获得解压流 FSDataInputStream DataInputStream (对应到HDFS上的文件) Seekable, PositionedReadable 在这个流上读数据 读到的数据就是解压过的 关闭该解压流
  2. 2. 写一块数据的基本流程 一个压缩流的对象关系 (以LZO为例) Start writeBlock DataOutputStream FilterInputStream (最上层,为了能写各种类型的数据) DataOutput 包含底层流 compressAlgo.getCompressor() 根据用户选择的压缩算法获得一个Comprssor[可能是从CodecPool中得到或new BufferedOutputStream 出来] (写缓存Buffer 4KB) FilterOutputStream 包含底层流 compressAlgo. createCompressionStream() 获得压缩流 FinishOnFlushCompressionStream 在flush的时候先调用底层压缩流的 FilterOutputStream finish,然后flush,并reset底层流 的resetStarte 包含底层流 new DataOutputStream 用于写的直接接口 BlockCompressorStream CompressorStream CompressionOutputStream 压缩buffer 64KB 写各种各样的数据到这个流 包含底层流 在一个块写完的时候flush该流,但不必close。因为close就会将底层的流都close FSDataOutputStream DataOutputStream掉,也就close了底层文件,我们必须在写 底层的文件流 Syncable完所有的block后再单独close底层文件流

×