2016-11-23 7 views
0

단일 스레드 압축 코덱의 벤치마킹을 수행하고 있으며 Zlib에서 볼 수있는 성능은 단일 스레드에서 기대하는 것보다 훨씬 높습니다. Zlib 압축기 구현에 org.apache.hadoop.io.compress.zlib.ZlibCompressor을 사용하고 Gzip 구현에 java.util.zip.Deflate을 사용하여 비교했습니다.Hadoop Zlib과 JDK Gzip의 비교 성능

ZLib 압축기 (래퍼)가 Hadoop에서 어떤 방식으로 다중 스레드 (JNI 인터페이스를 통해) 될 수 있습니까?

Zlib의 :

import org.apache.hadoop.io.compress.zlib.*; 
protected final zlibCompressor = new ZlibCompressor(ZlibCompressor.CompressionLevel.DEFAULT_COMPRESSION, ZlibCompressor.CompressionStrategy.DEFAULT_STRATEGY, ZlibCompressor.CompressionHeader.DEFAULT_HEADER, DEFAULT_BUFFER_SIZE); 
protected final zlibDecompressor = new ZlibDecompressor(ZlibDecompressor.CompressionHeader.DEFAULT_HEADER, DEFAULT_BUFFER_SIZE); 

//compress 
zlibCompressor.setInput(uncompressed, 0, uncompressed.length); 
zlibCompressor.finish(); 
int n = zlibCompressor.compress(compressBuffer, 0, compressBuffer.length); 

//decompress 
zlibCompressor.reset(); 
zlibDecompressor.setInput(compressed, 0, compressed.length); 
int n = zlibDecompressor.decompress(uncompressBuffer, 0, uncompressBuffer.length); 

gzip을 : gzip을위한

import java.util.zip.*; 
protected final deflater = new Deflater(COMPRESSION_LEVEL, NO_WRAP); 
protected final inflater = new Inflater(NO_WRAP); 

//compress 
int n = compressBlockUsingStream(uncompressed, compressBuffer); 

//decompress 
inflater.reset(); 
int n = uncompressBlockUsingStream(new InflaterInputStream(new ByteArrayInputStream(compressed), _inflater), uncompressBuffer); 

헬퍼 funtions :

protected int compressBlockUsingStream(byte[] uncompressed, byte[] compressBuffer) throws IOException 
{ 
     ByteArrayOutputStream out = new ByteArrayOutputStream(compressBuffer); 
     compressToStream(uncompressed, out); 
     return out.length(); 
}  

protected int uncompressBlockUsingStream(InputStream in, byte[] uncompressBuffer) throws IOException 
{ 
      ByteArrayOutputStream out = new ByteArrayOutputStream(uncompressBuffer); 
      byte[] buffer = new byte[4096]; 
      int count; 
      while ((count = in.read(buffer)) >= 0) { 
       out.write(buffer, 0, count); 
      } 
      in.close(); 
      out.close(); 
      return out.length(); 
} 
,451,515,

처리량 :

Zlib의/블록 - 143.902 Mbps의

Gzip으로/JDK/스트림 - 22.573 MBps의이

누구나 ZLIB 너무 빠른 이유는 아이디어가있다 (기본적으로 모든 코어 사용)? 이 코드는 단일 스레드로 실행될 것으로 예상됩니다. 누구나 비슷한 결과를 복제 할 수 있습니까?

답변

1

java.util.zip은 zlib를 사용합니다.

둘 다 동일한 압축 수준을 사용하고 있습니까? COMPRESSION_LEVELZlibCompressor.CompressionLevel.DEFAULT_COMPRESSION입니까?

+0

OK, 당신이 [0-9] 어떤 값 ""DEFAULT_COMPRESSION "알 수 있습니까?. 명시 적으로 설정하려면 – nikk

+0

을 당신은 그것을 인쇄 할 수 –

+0

글쎄, 당신은 GitHub의에서 하둡 zlibcompressor 코드를 살펴 있다면? , -15의 정수 값으로 설정되어 있음을 알 수 있습니다. -15는 무엇을 의미합니까? 압축 수준은 내가 말할 수있는 한 0에서 9까지입니다. – nikk