码迷,mamicode.com
首页 > 数据库 > 详细

hadoop2.20+hive+sqoop+mysql数据处理案例

时间:2015-02-05 20:34:11      阅读:280      评论:0      收藏:0      [点我收藏+]

标签:hadoop集群   mysql   hive   

一、业务说明

使用Hadoop2及其他开源框架,对本地的日志文件进行处理,将处理后需要的数据(PV、UV...)重新导入到关系型数据库(Mysql)中,使用Java程序对结果数据进行处理,组织成报表的形式在数据后台进行展示。

 

二、为什么使用Hadoop(开发动机)

现有的日志处理方式,是采用纯的java程序来计算的,对于大数据的日志文件来说,这种方案在处理速度、IO占用、数据备份及资源利用率方面都有一定的缺陷;

 

相比之下使用Hadoop完成数据存储和计算有以下的好处:

(1)高可靠性:Hadoop支持对数据的多副本备份;
(2)高扩展性:Hadoop是在可用的计算机集簇间分配数据并完成计算任务的,这些集簇可以方便地扩展到数以千计    的节点中。
(3)高效性:通过分发数据,hadoop可以在数据所在的节点上并行地(parallel)处理它们,这使得处理非常的快   速。
(4)高容错性:Hadoop能够自动保存数据的多个副本,并且能够自动将失败的任务重新分配。

(5)高资源利用率:管理员可以根据当前服务器的配置,来设置不同的资源调度方案(yarn),做到资源利用最大化。

三、数据处理流程图

 技术分享技术分享

 

四、类目贡献率案例流程

一、案例业务目标: 

统计2014年12月16日 全天,用户点击数top20的商品类别条目

 

二、开发步骤

 

(1)将2014年12月16日的日志(约16G)上传到HDFS文件系统的 /input/log_2014-12-16目录下

 

 

(2)、编写MapReduce程序清洗数据

 

程序逻辑分析:

筛选出日志字段中url包含?id=...的行,该url表示的含义为用户点击了某个商品类目为id的条目,程序的目标是只筛选出含有此url的行数据,对于不包含的行将舍弃。 清洗后的数据存放在HDFS的   /output/cleanItem_2014_12_16目录下(清洗后的数据约为140MB)

 

 

 

 

(3)、将清洗后的数据映射到Hive表中

 

进入hive的client端,建立一个外部分区表mmb_ordercontribute,这个表的字段与日志的字段一一对应,但会多一个data的分区字段,这相当于Mysql中的索引,当按照日期查询时,效率会高,以下是在hive中,mmb_ordercontribute的建表语句:

 

 

如图所示,表的映射路径location指向了清洗后的数据目录

 

(4)操作hive表数据

 

    数据经过映射后,就可以像mysql等数据库一样通过sql语句的形式来处理表数据了,比如:

统计当天所有用户访问条目的总次数:

 

 

    统计的结果为:904423

虽然是一个类似mysql的查询语句,但是处理的流程和mysql是天差地别的,hive会将这条语句解析成一个MapReduce程序进行统计,如图所示,hive处理完这个查询cup使用的总时间为6分钟左右,而分配到逻辑cpu上,实际使用的时间为28.5秒,如果去除mapreduce的解析和准备工作,mapreduce的执行时间是非常少的。

但hive并不是所有的sql语句都被映射成mapreduce程序,唯一的例外(不配置的话)就是:SELECT * FROM  table_name LIMIT;因为这只是在截取表的前几条数据而已;

 

 

(5)使用Hive处理清洗数据并导出到临时表

 

真正需要的数据将在此步得出,即:统计出top20的用户点击类目,将统计出的数据作为hive的一张临时表:

item_20141216表存储,备后用:

sql语句: 

 

CREATE TABLE 

item_20141216 

AS SELECT 

itemId,COUNT(1) as nums  

FROM

 mmb_ordercontribute

   GROUP BY 

itemId 

ORDER BY

 nums DESC;

 

导出后的表item_20141216 存放在hive的默认数据仓库下:

 

 

注:每行数据其实由两部分组成,行号和数量,看着像一个数字是因为hive表字段的分隔符不是空格或者tab键,而是 \001

 

 

 

(6)使用sqoop将临时表数据导出到mysql对应的表中

在mysql中创建与item_20141216对应的表

 

CREATE TABLE `item_contribute` (

  `itemId` varchar(11) default NULL COMMENT ‘条目id‘,

  `nums` int(11) default NULL COMMENT ‘出现的次数‘

) ENGINE=MyISAM DEFAULT CHARSET=utf8;

 

进入sqoop客户端执行一下命令输入连接信息: 

 sqoop export --connect jdbc:mysql://master:3306/test --username hive --password 123456 --table  item_contribute --fields-terminated-by ‘\001‘ --export-dir ‘/user/hive/warehouse/db1.db/item_20141216‘;

 

将会看到mysql表中的数据被填充: 

 

 

 

(7)接下来就可以利用java程序将数据组织成报表进行展示了!

 

技术分享

 

hadoop2.20+hive+sqoop+mysql数据处理案例

标签:hadoop集群   mysql   hive   

原文地址:http://blog.csdn.net/guoyunyuhou/article/details/43531381

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!