zoukankan      html  css  js  c++  java
  • Hive ORC + SNAPPY

    Hive orc 格式 + snappy 压缩是比较常用的存储加压缩格式。

    今天处理下面的场景时,解决了一些问题,记录下来:

    flume消费kafka的数据实时写入hdfs,通过创建分区表,t + 1 时,需要看到昨天的数据:

       flume 通过snappy 将数据写入hdfs,可以通过在fliume.conf中配置以下

    1. 保证每天的数据写入同一个目录中:
      agent.sinks.hdfs_sink.hdfs.path = /user/hive/warehouse/ods.db/kafka_2_hdfs_test/ods_sale_alter/dt=%Y-%m-%d 
    2. 避免在hdfs写入过多的小文件:
      tier1.sinks.hdfs_sink.hdfs.idleTimeout=0

      这个参数是某个topic停止活动时间超过设置的值时,就把hdfs上文件结尾的.tmp去掉,并开始写入新文件。设置为0,表示忽略停止时间。

    3. 配置了2的参数后,会造成一个问题,当新的一天,数据开始写入hdfs上另一个目录后,
      比如"dt=2019-03-02","dt=2019-03-01"文件夹下的最后一个文件,还是以.tmp结尾的,在hive建表后,数据格式错误会报错。
      所以需要我们通过脚本,每天修复文件名称:
      hadoop -mv abc.tmp abc
    4. 另外就是hive建表的问题:
      当数据导入hdfs后,我们想针对flume倒过来的数据,建立snappy压缩,orc格式的hive表。 
      建表语句如下:
      DROP TABLE IF EXISTS test_orc_snappy;
      CREATE EXTERNAL TABLE test_orc_snappy (
        x_json string
        )
      PARTITIONED BY (`dt` string) 
      ROW FORMAT DELIMITED
      FIELDS TERMINATED BY "	"
      STORED AS orc
      LOCATION '/user/hive/warehouse/ods.db/kafka_2_hdfs_test/test_orc_snappy'
      TBLPROPERTIES ("orc.compress"="SNAPPY");

      然而,我忽略了一件很重要的事,文件虽然用了snappy压缩,但是没有转化为orc格式。
      假如我们还想继续使用orc格式,那就只能把这张表当做底层表,在上层表比如 dw 层,中通过insert into的方式,
      转为orc格式的表。

    5. 那么这里可以使用的建表语句是什么呢?
      CREATE EXTERNAL TABLE test_snappy (
        x_json string
        )
      PARTITIONED BY (`dt` string) 
      ROW FORMAT DELIMITED
      FIELDS TERMINATED BY "	"
      STORED AS textfile
      LOCATION '/user/hive/warehouse/ods.db/kafka_2_hdfs_test/ods_sale_alter'
      TBLPROPERTIES ("orc.compress"="SNAPPY")

      使用textFile就可以了。

  • 相关阅读:
    Tensorflow 学习
    几种常见损失函数
    两人比赛先选后选谁获胜系列的动态规划问题
    LeetCode 全解(bug free 训练)
    局部敏感哈希LSH
    Annoy解析
    MCMC例子
    TinyBERT简单note
    ALBERT简单note
    求根号2, 网易的一道面试题
  • 原文地址:https://www.cnblogs.com/drjava/p/10458266.html
Copyright © 2011-2022 走看看