通过flume进行简单的ETL工作

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/yyqq188/article/details/79380416
一般提起大数据的实时流处理,我们首先会想到复杂的storm spark  kafka 等等,但是如果只是针对单条记录进行简单的ETL运算,使用Flume+Morphlines不失为一种优雅简约的方法
flume是apache开源的项目,是一个分布式的,可靠的软件系统,主要是从大量的分散的数据源中收集,汇聚以及迁移大规模的日志数据,最后存储到一个集中的数据系统中。
flume是由运行在不同主机系统的软件进程组成,一个主机的软件进程叫agent ,1个agent由source,channel,以及sink组成:source负责盯住主机上的数据源,如各种weblog以及syslog等等
,channel负责使用内存或磁盘存储传输的数据,sink负责将数据放在这个主机上的最终的目的地
由于两台主机的agent之间可以进行串联,1个agent的sink可以对接另一个agent的source,当然,1个agent可以将source的数据同时分发给两个并联的channel,同时sink到两个不同的数据目的地,flume中agent的组合方式非常灵活多样。
在目前的系统中,有若干台web server 每台web server安装nginx作为http服务,nginx自带host.access.log文件作为日志文件,该日志文件以行方式存储web访问记录,每1行代表1次http请求,记录下请求的方法,URL,以及回应码等
项目目的:由于请求的URL的参数格式不统一,希望针对特定参数进行提取操作,并且对一些不规范的参数进行整形,同时希望过滤掉200Ok以及302Redirection之外的其他所有回应码请求,最后经过ETL之后用户访问记录,以Avro形式存储在HDFS中,形成hive表,在以上所有操作中,通过flume的各个agent进行数据收集合并,并在agent的进程内存中进行ETL,中间过程不经过硬盘以及文件操作,以达到实时快速的目的。
(重点说明的:固定的且实时要求高的ETL动作,可以利用这里的flume拦截器功能去做,复杂且多变的需求,利用storm或spark来做处理
项目的部署方案:在所有web server上安装web flume agent ,只是负责手机本机weblog并且发送给下游的flume agent ,在hadoop中选一台主机安装flume agent ,所有weblog汇聚到这个hadoop的这个agent当中,被写入到hdfs文件中,所有ETL操作都由这个agent完成
技术实现:
要实现ETL,需要利用flume提供的interceptor拦截器的功能,我们可以想象interceptor是一个flume插件,每个插件进行一种操作,前一个interceptor处理后的结果会被送到下一个interceptor中

flume的interceptor主要有三种:
regexFliter 根据正则表达式来过滤weblog
regexReplace:根据正则表达式来代替weblog中特定的字符串,
Morphlines 最强大的interceptor,可以将行格式记录转化为avro记录,可以针对记录中的字段摘取特定的内容而放弃无用的内容,可以进行时间戳的转化,也可以针对记录字段进行查找更换
利用flume的interceptor实现ETL,工作就是编写几种配置文件:
1 fluem agent的配置文件,这个文件定义agent的source channel  sink 以及要实现的interceptor
2 如果要使用morphlines interceptor 就要定义一个morphlines 的配置文件
3 因为morphlines会将行数据转化为avro数据格式的文件,所以要定义个avro schema
4 avro 文件存放在hdfs中,如果要使用hive进行访问,就要进行表的创建,同样要用到avro schema

以下是一个nginx的http请求的典型行记录,我们通过一些配置文件的片段来深入了解以下flumeETL的工作机制。


上面是flume agent的配置文件片段,可以看到定义了2个interceptor,正则过滤regexfilter 在前,morphlines在后,通过正则表达式可以看出,regexFilter把非302与200的请求行格式记录过滤掉,并且也同时过滤掉了非GET以及HEAD方法的请求记录
Morphlines interceptor 定义了morphlines配置文件的位置

上面是morphlines的配置文件片段,可以看到定义了3个命令:
1 readCSV 读取了行记录,使用tab作为字段分隔符
2 grok 命令通过正则表达式匹配的方式,把 “GET /?usrid=8613715935023&oriurl=http%3A%2F%2Fwww.7710086.com%2F HTTP/1.1”中的“http%3A%2F%2Fwww.7710086.com%2F”抓出来,
3 findReplace命令把  “http%3A%2F%2Fwww.7710086.com%2F”替换成“/”

上面是avro schema的配置片段,其定义较为直观,针对不同字段定义不同数据类型

上面是hive的命令类型,第一个创建一个基于avro的外部表,第二个添加一个基于hdfs路径的partition
展开阅读全文

没有更多推荐了,返回首页