Hive orc 格式 + snappy 压缩是比较经常使用的存储加压缩格式。json
今天处理下面的场景时,解决了一些问题,记录下来:app
flume消费kafka的数据实时写入hdfs,经过建立分区表,t + 1 时,须要看到昨天的数据:oop
flume 经过snappy 将数据写入hdfs,能够经过在fliume.conf中配置如下spa
- 保证天天的数据写入同一个目录中:
agent.sinks.hdfs_sink.hdfs.path = /user/hive/warehouse/ods.db/kafka_2_hdfs_test/ods_sale_alter/dt=%Y-%m-%d
- 避免在hdfs写入过多的小文件:
tier1.sinks.hdfs_sink.hdfs.idleTimeout=0
这个参数是某个topic中止活动时间超过设置的值时,就把hdfs上文件结尾的.tmp去掉,并开始写入新文件。设置为0,表示忽略中止时间。code
- 配置了2的参数后,会形成一个问题,当新的一天,数据开始写入hdfs上另外一个目录后,
好比"dt=2019-03-02","dt=2019-03-01"文件夹下的最后一个文件,仍是以.tmp结尾的,在hive建表后,数据格式错误会报错。
因此须要咱们经过脚本,天天修复文件名称:
hadoop -mv abc.tmp abc
- 另外就是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 - 那么这里可使用的建表语句是什么呢?
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