Hadoop项目简单流程及各个组件的作用

今天通过一个简单的小项目给大家将整个hadoop期间的组件做一个小总结。
这个项目按照不同组件的功能,这里把它分为5个部分。

  1. 数据采集
  2. ETL
  3. 数据分析
  4. 数据导出
  5. 数据展现
    下面我们来一个一个的详细介绍
    首先是数据采集:
    数据采集有多种方式:可以通过shell脚本、java程序、flume等方式,可以根据不同的业务需求来选择
    shell脚本:适合一些简单的业务逻辑,轻量级的,但对日志采集过程中的容错处理不便控制
    java采集程序:可以对采集过程实现精细控制,但是开发工作量大
    flume采集框架:十分成熟的日志采集系统,且本身就是hadoop生态的一员,亲和力强,可扩展性强,所以我这里采用的是flume的日志采集框架
    flume采集通过编写flume脚本来实现,因为web项目所用的Nginx服务器会把日志的信息写到本地,所以我们把flume部署到和Nginx服务器一台机器上,监听存放日志的目录的变化,一旦发生变化,就将数据同步写到HDFS上,以便于之后的操作。
一个agent代理包含的三个组件:source、sink、channel
//给不同组件起的别名
a1.sources=r1
a1.sinks=k1
a1.channels=c1
//source组件的配置参数:exec表示监听的是文件内容的变化、sqoolDir是目录的变化
a1.sources.r1.type=exec
a1.sources.r1.command=tail -F /root/uek/project/webclick/testData/access1.log
//channel组件的配置参数:memory表示在内存中,file表示保存到disk上
a1.channels.c1.type=memory
a1.channels.c1.capacity=10000
a1.channels.c1.transactionCapacity=5000
//sink组件的配置参数:hdfs表示写到hdfs上,log表示输出
a1.sinks.k1.type=hdfs
a1.sinks.k1.hdfs.path=/project1/webclick/logs/%y-%m-%d
a1.sinks.k1.hdfs.filePrefix=webClick-
//都是文件保存在hdfs上的一些策略,我们这里是按天存储,一天一个目录
a1.sinks.k1.hdfs.rollCount=0
a1.sinks.k1.hdfs.rollInterval=60
a1.sinks.k1.hdfs.rollSize=10240000

a1.sinks.k1.hdfs.idleTimeout=6
a1.sinks.k1.hdfs.fileType=DataStream
a1.sinks.k1.hdfs.useLocalTimeStamp=true

a1.sinks.k1.hdfs.round=true
a1.sinks.k1.hdfs.roundValue=24
a1.sinks.k1.hdfs.roundUnit=hour
//agent的组件的集成
a1.sources.r1.channels=c1
a1.sinks.k1.channel=c1

采集到数据后,我们要做的就是ETL操作(MapReduce)

先构建了三个模型,一个是贴源Bean模型、一个是PageView模型、一个是Visit模型
贴源Bean模型:先过滤出合法数据,过滤掉js、图片等静态资源,去除脏数据,将时间字段进行转换,将合法数据进行一个标记,然后将数据进行输出,数据清洗即不需要reduce阶段
PageView模型:对数据进行非法校验,然后封装到贴源Bean中,map阶段按照ip为key,value为WebLogBean进行输出;reduce阶段先将map阶段输出的WebLogBean对象进行内存优化后放到一个集合中,按照时间顺序进行排序。数据中包含了那个网页是第几个访问的,也就是step字段,然后生成sessionID,一个session的大小是30分钟,30分钟之内为一个session,如果两条数据之间的时间差大于了30分钟,说明已经超过了一个session,这时就需要生成两个session,reduce阶段的输出是按照key为session,value为Text类型
Visit模型:map阶段将PageView阶段的输出数据进行再次切割,封装成PageView对象,按照key为session,value为PageView对象进行输出;reduce阶段同样是先对对象进行优化,然后把对象添加到一个集合中,按照访问先后顺序排序,最后按照业务逻辑,封装成对应的Visit对象,进行输出。

数据预处理完毕后,我们进行了数据仓库的设计(hive)

我们根据数据模型构建了三张事实表和一张明细宽表,之后的操作都是基于明细宽表的,明细宽表是对事实表的一些字段的更细粒度的抽取得到的,根据明细宽表我们又构建了多张维度表,也就是作为数据分析使用。可以按照时间维度、地域维度、终端类型维度、栏目维度等进行十分详细的分析。

//这里只以这一项指标做例子,是按照时间维度来统计pv量的
drop table webclick.dw_pvs_hour1;
create table webclick.dw_pvs_hour1(
month string,
day string,
hour string,
pvs bigint)
partitioned by(datestr string);

insert into table webclick.dw_pvs_hour1 partition(datestr='2013-09-18')
select 
a.month as month,
a.day as day,
a.hour as hour,
count(1) as pvs 
from 
webclick.ods_weblog_detail1 a
where 
a.datestr='2013-09-18' 
group by a.month,a.day,a.hour;

将各个维度表导出到web展示项目所在的服务器上的mysql中,供展示使用(sqoop数据迁移)
sqoop脚本的编写:

export
--connect
jdbc:mysql://192.168.0.100:3306/webclick
--username
root
--password
root
--export-dir
/user/hive_remote/warehouse/webclick.db/dw_pvs_hour1/datestr=2013-09-18
--table
dw_pvs_hour1
--num-mappers
1
--input-fields-terminated-by
'\001'

数据展示:
通过echarts进行展示:
Hadoop项目简单流程及各个组件的作用_第1张图片

总结:这个简单项目大概就是这个流程,通过这样一个项目,我们可以把所学的一些组件串联起来使用,不仅知道了各个组件的使用方法,也知道了每个组件的在项目开发中承担的角色,可以帮助我们更好的进行学习和理解。对于其中涉及到的组件,之后都会给大家做一些详细的描述,期待大家的持续关注。

你可能感兴趣的:(hadoop框架)