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

    xiaoxiao2021-03-25  85

    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编写自定义的"适配器"

    转载请注明原文地址: https://ju.6miu.com/read-18216.html

    最新回复(0)