Hive ORC + SNAPPY

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

 

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

flume消费kafka的数据实时写入hdfs,经过建立分区表,t + 1 时,须要看到昨天的数据:oop

   flume 经过snappy 将数据写入hdfs,能够经过在fliume.conf中配置如下spa

  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,表示忽略中止时间。code

  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格式的表。blog

  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就能够了。hadoop

相关文章
相关标签/搜索