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=

    这个参数是某个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 "\t"
    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 "\t"
    STORED AS textfile
    LOCATION '/user/hive/warehouse/ods.db/kafka_2_hdfs_test/ods_sale_alter'
    TBLPROPERTIES ("orc.compress"="SNAPPY")

    使用textFile就可以了。

05-10 22:04