zoukankan      html  css  js  c++  java
  • Hive-04 压缩| 存储

    一、Hadoop压缩配置

    修改Hadoop集群具有Snappy压缩方式:
    查看hadoop支持的压缩方式
    [kris@hadoop101 datas]$ hadoop checknative
    
    将编译好的支持Snappy压缩的hadoop-2.7.2.tar.gz包导入到hadoop101的/opt/software中
    
    1.解压hadoop-2.7.2.tar.gz到当前路径
      [kris@hadoop101 software]$ tar -zxvf hadoop-2.7.2.tar.gz
    2.进入到/opt/software/hadoop-2.7.2/lib/native路径可以看到支持Snappy压缩的动态链接库
      [kris@hadoop101 native]$ pwd
      /opt/software/hadoop-2.7.2/lib/native
      [kris@hadoop101 native]$ ll
      总用量 5188
      -rw-r--r--. 1 kris kris 1210260 9月   1 2017 libhadoop.a
      -rw-r--r--. 1 kris kris 1487268 9月   1 2017 libhadooppipes.a
      lrwxrwxrwx. 1 kris kris      18 2月  18 11:51 libhadoop.so -> libhadoop.so.1.0.0
      -rwxr-xr-x. 1 kris kris  716316 9月   1 2017 libhadoop.so.1.0.0
      -rw-r--r--. 1 kris kris  582048 9月   1 2017 libhadooputils.a
      -rw-r--r--. 1 kris kris  364860 9月   1 2017 libhdfs.a
      lrwxrwxrwx. 1 kris kris      16 2月  18 11:51 libhdfs.so -> libhdfs.so.0.0.0
      -rwxr-xr-x. 1 kris kris  229113 9月   1 2017 libhdfs.so.0.0.0
      -rw-r--r--. 1 kris kris  472950 9月   1 2017 libsnappy.a
      -rwxr-xr-x. 1 kris kris     955 9月   1 2017 libsnappy.la
      lrwxrwxrwx. 1 kris kris      18 2月  18 11:51 libsnappy.so -> libsnappy.so.1.3.0
      lrwxrwxrwx. 1 kris kris      18 2月  18 11:51 libsnappy.so.1 -> libsnappy.so.1.3.0
      -rwxr-xr-x. 1 kris kris  228177 9月   1 2017 libsnappy.so.1.3.0
    
    3.拷贝/opt/software/hadoop-2.7.2/lib/native里面的所有内容到开发集群的/opt/module/hadoop-2.7.2/lib/native路径上
      [kris@hadoop101 native]$ cp ../native/* /opt/module/hadoop-2.7.2/lib/native/
      cp -r native/ /opt/module/hadoop-2.7.2/lib/
    
    4.分发集群
      [kris@hadoop101 lib]$ xsync native/

      重新启动hadoop集群和hive
    开启Map输出阶段压缩
    hive (default)> set hive.exec.compress.intermediate=true;  开启hive中间传输数据压缩功能
    hive (default)> set mapreduce.map.output.compress=true;  开启mapreduce中map输出压缩功能
    hive (default)> set mapreduce.map.output.compress.codec=org.apache.hadoop.io.compress.SnappyCodec;  设置mapreduce中map输出数据的压缩方式
      执行查询语句
    hive (default)> select count(ename) name from emp;
    
    
    开启Reduce输出阶段压缩
    hive (default)> set hive.exec.compress.output=true;  开启hive最终输出数据压缩功能
    hive (default)> set mapreduce.output.fileoutputformat.compress=true;  开启mapreduce最终输出数据压缩
    hive (default)> set mapreduce.output.fileoutputformat.codec=org.apache.hadoop.io.compress.SnappyCodec;  设置mapreduce最终数据输出压缩方式
    hive (default)> set mapreduce.output.fileoutputformat.type=BLOCK;  设置mapreduce最终数据输出压缩为块压缩
    测试一下输出结果是否是压缩文件
    hive (default)> 
    0: jdbc:hive2://hadoop101:10000> insert overwrite local directory '/opt/module/datas/distributed-result' select * from emp distribute by deptno sort by empno desc; 

     二、文件存储格式

     

    左边为逻辑表,右边第一个为行式存储,第二个为列式存储。

     行存储的特点:查询满足条件的一整行数据的时,只需要找到其中一个值,其余的值都在相邻地方,所以此时行存储查询的速度更快。

    列存储的特点:
    因为每个字段的数据聚集存储,在查询只需要少数几个字段的时候,能大大减少读取的数据量;每个字段的数据类型一定是相同的,列式存储可以针对性的设计更好的设计压缩算法。
    TEXTFILE和SEQUENCEFILE的存储格式都是基于行存储的;
    ORC和PARQUET是基于列式存储的。

    TextFile格式默认格式,数据不做压缩,磁盘开销大,数据解析开销大。可结合Gzip、Bzip2使用,但使用Gzip这种方式,hive不会对数据进行切分,从而无法对数据进行并行操作。

    每个Orc文件由1个或多个stripe组成,每个stripe一般为HDFS的块大小,每一个stripe包含多条记录,这些记录按照列进行独立存储,对应到Parquet中的row group的概念。每个Stripe里有三部分组成,分别是Index Data,Row Data,Stripe Footer;

    Parquet文件是以二进制方式存储的,所以是不可以直接读取的,文件中包括该文件的数据和元数据,因此Parquet格式文件是自解析的。

    
    hive (default)> create table log_text(track_time string, url string, session_id string, referer string, ip string, end_user_id string, city_id string)
                  > row format delimited fields terminated by '	'
                  > stored as textfile;
    OK
    Time taken: 0.685 seconds
    hive (default)> load data local inpath '/opt/module/datas/log.data' into table log_text;
    Loading data to table default.log_text
    Table default.log_text stats: [numFiles=1, totalSize=19014993]
    OK
    Time taken: 1.12 seconds
    hive (default)> dfs -du -h /user/hive/warehouse/log_text;
    18.1 M  /user/hive/warehouse/log_text/log.data
    
    hive (default)> create table log_orc(
                  > track_time string, url string, session_id string, referer string, ip string, end_user_id string, ciry_id string)
                  > row format delimited fields terminated by '/t'
                  > stored as orc;
    OK
    Time taken: 0.087 seconds
    hive (default)> insert into table log_orc select * from log_text;
    hive (default)> dfs -du -h /user/hive/warehouse/log_orc;
    2.8 M  /user/hive/warehouse/log_orc/000000_0
    
    hive (default)> create table log_parquet(
                  > track_time string, url string, session_id string, referer string, ip string, end_user_id string, city_id string)
                  > row format delimited fields terminated by '/t'
                  > stored as parquet;
    OK
    Time taken: 1.004 seconds
    hive (default)> insert into table log_parquet select * from log_text; //insert overwrite table log_parquet select * from log_text;
    hive (default)> dfs -du -h /user/hive/warehouse/log_parquet;
    13.1 M  /user/hive/warehouse/log_parquet/000000_0
    
    0: jdbc:hive2://hadoop101:10000> select count(*) from log_text;
    +---------+--+
    |   _c0   |
    +---------+--+
    | 100000  |
    +---------+--+
    1 row selected (18.222 seconds)
    
    0: jdbc:hive2://hadoop101:10000> select count(*) from log_orc;
    1 row selected (17.129 seconds)
    
    0: jdbc:hive2://hadoop101:10000> select count(*) from log_parquet;
    1 row selected (18.133 seconds)
    
    
    ive (default)> create table log_orc_none(
                  > track_time string, url string, session_id string, referer string, ip string, end_user_id string, city_id string)
                  > row format delimited fields terminated by '	'
                  > stored as orc tblproperties ("org.compress"="NONE");
    hive (default)> insert overwrite table log_orc_none select * from log_text;
    hive (default)> dfs -du -h /user/hive/warehouse/log_orc_none;
    2.8 M  /user/hive/warehouse/log_orc_none/000000_0
    
    hive (default)> create table log_orc_snappy(
                  > track_time string, url string, session_id string, referer string, ip string, end_user_id string, city_id string)
                  > row format delimited fields terminated by '	'
                  > stored as orc tblproperties ("orc.compress"="SNAPPY");
    OK
    Time taken: 0.145 seconds
    hive (default)> insert overwrite table log_orc_snappy select * from log_text;
    hive (default)> dfs -du -h /user/hive/warehouse/log_orc_snappy;
    3.8 M  /user/hive/warehouse/log_orc_snappy/000000_0              
    
    默认创建的ORC存储方式,导入数据后的大小为:2.8 M  /user/hive/warehouse/log_orc/000000
    比Snappy压缩的还小。原因是orc存储文件默认采用ZLIB压缩,ZLIB采用的是deflate压缩算法。比snappy压缩的小。
    
    存储方式和压缩总结
    在实际的项目开发当中,hive表的数据存储格式一般选择:orc或parquet。压缩方式一般选择snappy,lzo。
  • 相关阅读:
    bat 批处理编写
    dos 命令
    反射
    反爬机制和破解方法汇总
    pandas
    谷歌历史浏览器下载
    python-----pip安装源选择(亲测有效)
    deepin 20.1 系统未安装pip
    python自带库-----os.path
    python 自带库---os库
  • 原文地址:https://www.cnblogs.com/shengyang17/p/10398310.html
Copyright © 2011-2022 走看看