hdfs合并小文件
hadoop fs -getmerge hdfs文件夹路径 合并本地的文件名
如果hdfs误删除文件或者hive误删除文件
/user/hadoop/.Trash/Current 这个地址下有文件备份,文件备份保留七天(core配置文件可以设置)
hive压缩
压缩的好处:
(执行查询时会自动解压)
可以节约磁盘的空间,基于文本的压缩率可达40%+;
压缩可以增加吞吐量和性能量(减小载入内存的数据量),但是在压缩和解压过程中会增加CPU的开销。所以针对IO密集型的jobs(非计算密集型)可以使用压缩的方式提高性能。
压缩使用场景
- Compressing input files 输入文件压缩
- Compressing output files 输出文件压缩
- Compressing map outoput files 中间输出文件压缩
###压缩注意事项
- Storage
- Disk I/O
- Network bandwidth
- CPU time
### hive文件格式
- TEXTFILE: 默认格式,数据不做压缩,磁盘开销大。如需压缩,可使用Gzip,Bzip2压缩算法,但是不会对数据进行切分;导入数据时会直接把数据文件拷贝到hdfs上不进行处理;
- SEQUENCEFILE: 二进制文件,具有使用方便、可分割、可压缩
- SequenceFile支持三种压缩选择:NONE,RECORD(压缩率低),BLOCK(常用且压缩性能最好);
RCFILE: RCFILE是一种行列存储相结合的存储方式;- ORCFILE: 0.11以后出现
注意:SEQUENCEFILE,RCFILE,ORCFILE格式的表不能直接从本地文件导入数据,数据要先导入到textfile格式的表中, 然后再从表中用insert导入SequenceFile,RCFile,ORCFile表中
hive配置压缩
建表时申明文件的存储格式,默认为TEXTFILE。如使用压缩常使用分块压缩STORED AS SEQUENCEFILE
数据处理的中间过程和结果使用Snappy算法进行压缩。
- – 任务中间压缩
set hive.exec.compress.intermediate=true;
set hive.intermediate.compression.codec=org.apache.hadoop.io.compress.SnappyCodec;
set hive.intermediate.compression.type=BLOCK;- – map/reduce 输出压缩
set hive.exec.compress.output=true;
set mapred.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec;
set mapred.output.compression.type=BLOCK;
实施案例:
现有一表log_db.commodlog共有3362555条数据共1.01GB
创建一个textfile的表
create table if not exists com(
unionId string,
brand string,
create_time string)
row format delimited fields terminated by '\t'
lines terminated by '\n'
stored as textfile;
设置操作:
set hive.exec.compress.output=true;
set mapred.output.compress=true;
set mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec;
set io.compression.codecs=org.apache.hadoop.io.compress.GzipCodec;
导入数据
insert overwrite table fol_db.com select unionId,brand,create_time from log_db.commodlog;
结果:
select count(1) from fol_db.com;
共有3362555条数据共59.74MB
创建一个SEQUENCEFILE的表
create table if not exists seqcom(
unionId string,
brand string,
create_time string)
row format delimited fields terminated by '\t'
lines terminated by '\n'
stored as SEQUENCEFILE;
设置操作:
set hive.exec.compress.output=true;
set mapred.output.compress=true;
set mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec;
set io.compression.codecs=org.apache.hadoop.io.compress.GzipCodec;
set mapred.output.compression.type=BLOCK;
导入数据
insert overwrite table fol_db.seqcom select * from fol_db.com;
结果:
select count(1) from fol_db.seqcom;
共有3365370条数据共65.17MB
创建一个RCFILE的表
create table if not exists rccom(
unionId string,
brand string,
create_time string)
row format delimited fields terminated by '\t'
lines terminated by '\n'
stored as rcfile;
设置操作:
set hive.exec.compress.output=true;
set mapred.output.compress=true;
set mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec;
set io.compression.codecs=org.apache.hadoop.io.compress.GzipCodec;
导入数据
insert overwrite table fol_db.rccom select * from fol_db.com;
结果:
select count(1) from fol_db.rccom ;
共有3365370条数据共45.63MB
总结:
相比TEXTFILE和SEQUENCEFILE,RCFILE由于列式存储方式,数据加载时性能消耗较大,但是具有较好的压缩比和查询响应。数据仓库的特点是一次写入、多次读取,因此,整体来看,RCFILE相比其余两种格式具有较明显的优势。
对比:
rc格式耗时4.126
select brand,count(brand) brandCount from fol_db.rccom where create_time like '2019-01-02%' group by brand SORT BY brand ASC;
SEQUENCEFILE格式耗时8.132
select brand,count(brand) brandCount from fol_db.seqcom where create_time like '2019-01-02%' group by brand SORT BY brand ASC;
textfile格式耗时8.132
select brand,count(brand) brandCount from fol_db.com where create_time like '2019-01-02%' group by brand SORT BY brand ASC;9.75
原数据格式耗时80.302
select brand,count(brand) brandCount from log_db.commodlog where create_time like '2019-01-02%' group by brand SORT BY brand ASC;