Hive数据导入方案—使用ORC格式存储hive数据

102 篇文章 11 订阅

 

目的:将上网日志导入到 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)

txtFile表执行:select count(*) from tmp_testp;

469407190
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,减少内存使用

参考文章:

为什么要建立内外临时表

http://anyoneking.com/archives/127

为什么要手动 put数据代替 hive自动 load:

Hive中 Load Data时多一步 Distcp的操作问题,优化集群 IO操作

http://blog.sina.com.cn/s/blog_4112736d0101cxeh.html

Hadoop MapReduce之上传文件到 HDFS

http://blog.csdn.net/shallowgrave/article/details/7818133

上传文件到 HDFS

http://blog.csdn.net/royesir/article/details/5747399

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值