Hive编程指南10---其他文件格式和压缩方法

来源:互联网 发布:mac 文字整理 编辑:程序博客网 时间:2024/05/16 06:35

Hive其他文件格式和压缩方法

确定安装编译码器

    hive -e "set io.compression.codecs"

选择一种压缩编/解码器

    使用压缩可以最小化所需要的磁盘存储空间,以及减小磁盘和网络I/O操作,不过,文件压缩和解压过程会增加CPU开销

    对于亚索密集型的job最好使用压缩,特别是有额外的CPU资源或者磁盘存储空间比较稀缺的情况

    GZIP和BZip2压缩方案,包括加速对这些格式的压缩和解压缩的本地Linux库,Snappy、LZO

    BZip2压缩率最高,消耗最多CPU开销;GZip是压缩率和压缩/解压速度上的下一个选择

    LZO和Snappy压缩率比BZip2和GZip小,但是压缩/解压速度要快,特别是解压缩过程;相对于磁盘空间和I/O开销,频繁读取数据所需要的解压缩速度更重要的

    考虑因素为压缩格式的文件是否是可分割的

开启中间压缩

    可以减少job中map和reduce task键的数据传输量,选择一个低CPU开销的编/解码器要比选择一个压缩率高的编/解码器要重要多

    <property>

        <name>hive.exec.compress.intermediate</name>

        <value>true</value>

    </property>

    Hadoop压缩默认的编/解码器是DefaultCodec,可以修改$HADOOP_HOME/conf/mapred-site.xml

    <property>

        <name>mapred.map.output.compression.codec</name>

        <value>org.apache.hadoop.io.compress.SnappyCodec</value>

    </property>

最终输出结果压缩

    Hive输出内容同样可以压缩,默认为false

    <property>

        <name>hive.exec.compress.output</name>

        <value>false</value>

    </property>

    对于输出文件,使用GZip进行压缩,可以大幅度降低文件的大小,对于后面的MapReduce job 而言是不可分割的

    <property>

        <name>mapred.output.compression.codec</name>

        <value>org.apache.hadoop.io.compress.GzipCodec</value>

    </property>

sequence file 存储格式

    压缩文件可以节约存储空间,缺点是这些文件是不可分割的,只能从头读到尾;可以分割的文件,可以划分成多个部分,由多个mapper并行处理

    Hadoop所支持的sequence file 存储格式可以将一个文件划分成多个块,再采用一种可分割的方式对块进行压缩

    CREATE TABLE a_sequence_file_table STORED AS SEQUENCEFILE;

    Sequence file提供3中压缩方式:NONE、RECORD(默认:记录级别)和BLOCK(块级别---压缩性能最好且可以分割)

    Hadoop---mapred-site.xml或者Hive---hive-site.xml

    <property>

        <name>mapred.output.compression.type</name>

        <value>BLOCK</value>

    </property>

sequence file 存储格式

    1.中间数据压缩,不影响最终输出,仍然是非压缩的,可以使用dfs -cat 查看

    set hive.exec.compress.intermediate=true;

    2.使用其他编/解码器,使用中间数据压缩

    set mapred.map.output.compression.codec=org.apache.hadoop.io.compress.GZipCodec;

    set hive.exec.compress.intermediate=true;

    3.输出结果压缩,输出文件后缀名是.deflate,dfs -cat不能查看(非二进制输出),但是Hive可以正常地查询

    set hive.exec.compress.output=true;

    4.Haoop的TextInputFormat进行处理,文件后缀名为.deflate或.gz的压缩文件,Hive不关心底层文件是何方式压缩

    set hive.exec.compress.output=true;

    set mapred.map.output.compression.codec=org.apache.hadoop.io.compress.GZipCodec;

    //Hive shell中执行! /bin/zcat 来解压缩,并输出显示

    5.可能产生大的压缩文件,而且不可分割,不能并行处理这个数据,使用Sequence file

    set mapred.output.compression.type=BLOCK;

    set hive.exec.compress.output=true;

    set mapred.map.output.compression.codec=org.apache.hadoop.io.compress.GZipCodec;

    //dfs -text查看文件

    6.同事使用直接数据压缩和最终输出数据压缩,且使用不同压缩编/解码器的Sequence file

    set mapred.map.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec;

    set hive.exec.compress.intermediate=true;

    set mapred.output.compression.type=BLOCK;

    set hive.exec.compress.output=true;

    set mapred.output.compression.codec=org.apache.hadoop.io.compress.GZipCodec;

存档分区

    存储格式名为HAR(Hadoop Archive归档文件)

    一个HAR文件类似于HDFS中一个TAR文件,是一个单独文件,其内部存放多个文件和文件夹

    可以被Hive查询,减轻NameNode压力;缺点,查询效率不高,HAR文件非压缩,不节约存储空间

    ALTER TABLE ... ARCHIVE PARTITION语句将表转换成一个归档表

    set hive.archive.enabled=true;

    ALTER TABLE <table> ARCHIVE PARTITION(par='');

    LATER TABLE <table> UNARCHIVE PARTITION(par='');

压缩:包扎

    Hive可以读写不同类型压缩文件,节约磁盘空间以及处理开销,有助于和其他工具进行集成,无需使用Java编写自定义的"适配器"

0 0