단일 스레드 압축 코덱의 벤치마킹을 수행하고 있으며 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 너무 빠른 이유는 아이디어가있다 (기본적으로 모든 코어 사용)? 이 코드는 단일 스레드로 실행될 것으로 예상됩니다. 누구나 비슷한 결과를 복제 할 수 있습니까?
OK, 당신이 [0-9] 어떤 값 ""DEFAULT_COMPRESSION "알 수 있습니까?. 명시 적으로 설정하려면 – nikk
을 당신은 그것을 인쇄 할 수 –
글쎄, 당신은 GitHub의에서 하둡 zlibcompressor 코드를 살펴 있다면? , -15의 정수 값으로 설정되어 있음을 알 수 있습니다. -15는 무엇을 의미합니까? 압축 수준은 내가 말할 수있는 한 0에서 9까지입니다. – nikk