Hive 加速M/R的开发

一、Hive的安装
如何安装Hive网上有N多的文档,一般来说你准备搭建Hadoop平台的你就绝对不会吝啬这么点的时间去搭建个Hive平台,具体就参考官方wiki去吧。

二、开启Hadoop之旅
 
1.Hive表的创建与维护
在Hive里面创建一张表的基本语法同SQL类似,下面就是一个简单的表创建语法:

CREATE TABLE tmp_table #表名
(
title   string, # 字段名称 字段类型
minimum_bid     double,
quantity        bigint,
have_invoice    bigint
)COMMENT '注释:XXX' #表注释
 PARTITIONED BY(pt STRING) #分区表字段(如果你文件非常之大的话,采用分区表可以快过滤出按分区字段划分的数据)
 ROW FORMAT DELIMITED
   FIELDS TERMINATED BY '/001'   # 字段是用什么分割开的
STORED AS SEQUENCEFILE; #用哪种方式存储数据,SEQUENCEFILE是hadoop自带的文件压缩格式
其中PARTITIONED 在数据量比较大的时候非常有用,比如你想在Hadoop上存放每天镜像商品的时候,通过PARTITIONED 分区可以快速筛选某一天的数据。访问时候通过“  SELECT * FROM TMP_TABLE WHERE PT='XXX‘ ”的方式通过分区来访问数据。分区表是通过子文件夹的方式来存放数据的,所以速度提高是光速级的。其它的几个表相关有有那个的命令:

SHOW TABLES; # 查看所有的表
SHOW TABLES '*TMP*'; #支持模糊查询
SHOW PARTITIONS TABLE; #查看表有哪些分区
DESCRIBE TABLE; #查看表结构
 
2.将数据加载到表中
Hive可以将本地的和Hadoop中的文件加载到表中,但是文件的分割方式必须同创建表的约定的格式一致:

#创建表的时候直接指定路径
CREATE EXTERNAL TABLE page_view(viewTime INT, userid BIGINT,
                    page_url STRING, referrer_url STRING,
                    ip STRING COMMENT 'IP Address of the User',
                    country STRING COMMENT 'country of origination')
    COMMENT 'This is the staging page view table'
    ROW FORMAT DELIMITED FIELDS TERMINATED BY '44' LINES TERMINATED BY '12'
    STORED AS TEXTFILE
    LOCATION '/user/data/staging/page_view';
 
#创建表之后也可以导入数据到表中
#本机路径(跳板机)
LOAD DATA LOCAL INPATH `/tmp/date.txt` OVERWRITE INTO TABLE page_view PARTITION(pt='2008-06-08')
#Hadoop路径
LOAD DATA INPATH `/tmp/date.txt` OVERWRITE INTO TABLE page_view PARTITION(pt='2008-06-08')
#上面OVERWRITE关键会全表覆盖,如果只是想附加数据,将OVERWRITE去掉即可。
 
#添加一个分区到表
ALTER TABLE tmp_xx ADD PARTITION (pt='100610') location '/group/mywork/hive/xx/pt=100610' ;
#当然你可以直接从从其它的表拖数据过来
INSERT OVERWRITE TABLE TMP_T1 SELECT * FROM TMP_T2;
 
3.执行Query开始快速M/R之旅
Hive支持目前常用的SQL语法,支持COUNT,SUM,AVG,GROUP等常用的SQL函数还支持hive一些自定义的函数方便数据分析用,当然你可以自定义函数,理论上讲在java中能实现的功能,它都能胜任,详情参见:http://wiki.apache.org/hadoop/Hive/Tutorial ,先来几个常用的示例吧。

#统计数量
SELECT COUNT(1) FROM T1;
#汇总数量
SELECT SUM(A) FROM T1;
#求平均值
SELECT AVG(A) FROM T1;
#GROUP
SELECT A,COUNT(1) FROM T1 GROUP A;
这样执行之后数据最后会在屏幕上打印出来的,显然这不是我们想要,只适合开发的时候测试数据用,为了不让数据打满跳板机最好加下“LIMIT 10”参数限制下总数,省得把跳板机压垮。通过以下方式可以提取查询的结果

INSERT OVERWRITE TABLE  T1 SELECT * FROM T2;
#然后通过 hadoop fs -getmerge dir ldir 命令直接从hdfs系统中提取数据
#当然你也可以直接放到本地目录
INSERT OVERWRITE LOCAL DIRECTORY '/tmp/T1' SELECT * FROM T2;
#Hive也支持JOIN
INSERT OVERWRITE TABLE  T3 SELECT T1.*,T2.* FROM T1 T1  join T2 T2  on (T1.A = T2.A) ;

4.HIVE到底是什么?
看着这么上面强大的功能,那Hive到底是什么呢?其实HIVE就是一个SQL解析引擎,它将SQL语句转译成M/R JOB然后在Hadoop执行,来达到快速开发的目的。拨开HIVE的神秘面纱之后来看它的表其实就是一个Hadoop的目录/文件(HIVE默认表存放路径一般都是在你工作目录的hive目录里面),按表名做文件夹分开,如果你有分区表的话,分区值是子文件夹,可以直接在其它的M/R job里直接应用这部分数据。

三、FAQ
1.几个常用的参数
set mapred.reduce.tasks=30;  设置Reduce Task个数
set hive.exec.compress.output='false'; 设置数据不作压缩,要是压缩了我们拿出来的文件就只能通过HIVE-JDBC来解析
2.注意事项
做JOIN操作的时候最好将数量少的表放在左边。
Reduce的排序是单机的,如果一定要结果排序,那边你的Reduce Task数量最好设置成一个。
慎用System.xxx.println来输出日志,要是不小心把每行记录都打印出来那边整个Hadoop集群都有崩溃的危险。
如果表建立了PARTITIONS,那么分析需求的时候尽量利用好这批分区表。如果你们的分区表是拿来做每天的镜像数据的(我们公司就是这么来用的),那边你更加要小心处理,不然你的JOB就可能破你们集群的记录。
测试JOB的时候尽量加上LIMIT参数,毕竟Hadoop不是数据库,每个JOB都是需要一定的时间的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值