总结:
1)常见的数据压缩算法
DEFLATE bzip2 gzip snappy
2)使用native压缩库算法
snappy 安装 libsnappy.so libhadoop.so
gzip deflate 安装zlib libhadoop.so
3)CompressCodec进行操作
压缩: createOutputStream 来获得 CompreesionOutputStream
解压缩:createInputStream 来获得CompressionInputStreamy
解压缩:
public static void main(String[] args) throws FileNotFoundException, IOException {
// TODO Auto-generated method stub
String file = "/home/README.txt.gz";
Configuration conf = new Configuration();
CompressionCodecFactory codecFactory = new CompressionCodecFactory(conf);
CompressionCodec codec= codecFactory.getCodec(new Path(file));
CompressionInputStream in = codec.createInputStream(new FileInputStream(new File(file)));
FileOutputStream out = new FileOutputStream(new File(codecFactory.removeSuffix(file, codec.getDefaultExtension())));
IOUtils.copyBytes(in, out, 4096);
in.close();
out.close();
}
HDFS数据完整性
1)HDFS以透明方式校验所有写入的数据,针对数据的io.bytes.per.checksum()字节创建一个独立的校验和,
如果节点检测数据错误,就会ChecSumException异常
2)除了在读取数据时进行验证,数据节点也会在后台运行一个进程,DataBlockScanner(数据块检测程序)来验证在数据节点上的所有的块
3)一旦检测到corrupt block,在heartbeat阶段,DN会收到NN发来的Block Command,从其他数据库中拷贝一份新的replica
使用checksumFileSystem
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
Configuration conf = new Configuration();
LocalFileSystem locaFs = ChecksumFileSystem.getLocal(conf);
System.out.println(locaFs.getChecksumFile(new Path("/home/README.txt")));
}