目的:将上网日志导入到
hive中,要求速度快,压缩高,查询快,表易维护。推荐使用
ORC格式的表存储数据
思路:因为在
hive指定
RCFile格式的表,不能直接
load数据,只能通过
textfile表进行
insert转换。考虑先建立txtFile格式内部临时表
tmp_testp,使用
hdfs fs -put命令向
tmp_testp表路径拷贝数据(不是
load),再建立ORC格式外部表
http_orc,使用
insert命令把
tmp_test表导入
http_orc中,最后删除掉临时表数据。过程消耗的时间
1.使用put想hdfs上传文件
2.insert表数据(
hive转换格式压缩数据)
执行:
1、 建立内部临时表,使表的
location关联到一个日志文件的文件夹下:
create table IF NOT EXISTS tmp_testp(p_id INT,tm BIGINT,idate BIGINT,phone BIGINT)
partitioned by (dt string)
row format delimited fields terminated by '\,'
location '/hdfs/incoming';
2. 通过
hdfs上传文件
124G文件,同时手动建立分区映射关系来导入数据。
ALTER TABLE tmp_testp ADD PARTITION(dt='2013-09-30');
hadoop fs -put /hdfs/incoming/*d /hdfs/incoming/dt=2013-09-30
记录耗时:
12:44 - 14:
58 =两小时
14分钟
上传速度缓慢,内存消耗巨大
Mem: 3906648k total, 3753584k used, 153064k free, 54088k buffers
内存利用率
96%
3.测试临时表是否可以直接读取数据
select * from tmp_testp where dt='2013-09-30';
4.建立
ORC格式外部表
create external table IF NOT EXISTS http_orc(p_id INT,tm BIGINT,idate BIGINT,phone BIGINT )
partitioned by (dt string)
row format delimited fields terminated by '\,'
stored as orc ;
5.将临时表导入到
ORC表中
insert overwrite table http_orc partition(dt='2013-09-30') select p_id,tm,idate,phone from tmp_testp where dt='2013-09-30';
记录耗时:
Time taken: 3511.626 seconds = 59分钟,
注意insert这一步,可以选择字段导入到orc表中,达到精简字段,多次利用临时表建立不同纬度分析表的效果,不需要提前处理原始log文件,缺点是上传到hdfs原始文件时间太长
6.计算
ORC表压缩率:
HDFS Read: 134096430275 HDFS Write: 519817638 SUCCESS
压缩率:
519817638/134096430275=0.386% 哎呀,都压缩没了
7.删除内部临时表,保证
hdfs中只存一份
ORC压缩后的文件
drop table tmp_testp;
8.简单测试一下表操作
看看,ORC压缩表与txtFile不压缩表的性能对比
ORC表执行:select count(*) from http_orc;
469407190
Time taken: 669.639 seconds, Fetched: 1 row(s)
Time taken: 669.639 seconds, Fetched: 1 row(s)
txtFile表执行:select count(*) from tmp_testp;
469407190
Time taken: 727.944 seconds, Fetched: 1 row(s)
Time taken: 727.944 seconds, Fetched: 1 row(s)
ORC效果不错,比txtFile效果好一点点
总结:平均每
s上传文件:
124G / (2hour14min+59min)= 11M/s
可以清楚看到向
hdfs上传文件浪费了大量时间
优化方案:如何提高hdfs文件上传效率
1. 文件不要太大(测试用文件从
200m到
1G不均),启动多个客户端并行上传文件
2. 考虑减少
hive数据副本为
2
3. 优化
mapReduce及
hadoop集群,提高
I/O,减少内存使用
参考文章:
为什么要建立内外临时表
为什么要手动
put数据代替
hive自动
load:
Hive中
Load Data时多一步
Distcp的操作问题,优化集群
IO操作
Hadoop MapReduce之上传文件到
HDFS
上传文件到
HDFS