一、业务说明
使用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程序将数据组织成报表进行展示了!