转载:http://mp.weixin.qq.com/s/xCSdkQo1XMQwU91lch29Uw

Apache Flume介绍:

Apache Flume是一个Apache的开源项目,是一个分布的、可靠的软件系统,主要目的是从大量的分散的数据源中收集、汇聚以及迁移大规模的日志数据,最后存储到一个集中式的数据系统中。

Apache Flume是由运行在不同主机系统的软件进程组成,一个主机的软件进程叫agent, 1个agent由source、channel、以及sink组成:Source负责盯住主机上数据源,如各种Weblog以及Syslog等等;Channel负责使用内存存储传输数据;Sink负责将数据放在在这个主机上最终的目的。

由于两台主机的Agent之间可以进行串联,1个agent的sink可以对接另1个agent的source;当然,1个agent可以将source的数据同时分发给两个并联的Channel, 同时sink到两个不同的数据目的地。 Flume中agent的组合方式非常灵活多样,在此不做过多描述,有兴趣可以去http://flume.apache.org/详细了解。

项目方案:

项目平台:在笔者的系统中,有若干台Web Server,每台Web Server安装Nginx作为HTTP服务。Nginx自带host.access.log文件作为日志文件,该日志文件以行方式存储Web访问记录,每1行代表1次HTTP请求,记录下请求的方法,URL,以及回应码等等。

项目目的:由于请求的URL的参数格式不统一,笔者希望针对特定参数进行提取操作,并且对一些不规范的参数进行整形;同时希望过滤掉除去200OK以及302Redirection之外其他所有回应码的请求(如499,500);最后,经过ETL之后用户访问记录,以Avro形式存储在HDFS中,形成HIVE表。在以上所有操作中,通过Flume的各个agent进行数据收集合并,并在agent的进程内存中进行ETL,中间过程不经过硬盘以及文件操作,以达到实时快速的目的。

项目部署方案:在所有Web
Server上安装Web Flume agent,只是负责收集本主机Weblog并且发送给下游的Hadoop Flume
agent。在Hadoop中选一台主机安装Flume
agent,所有Weblog汇聚到Hadoop中的这个agent当中,被写入到HDFS文件当中,所有ETL操作都由这个agent完成。

技术实现:

Flume的功能如果只是收集以及汇聚log数据的话,配置可以非常简单。如果要实现ETL,就要复杂的配置,需要利用Flume给我们提供的一种叫interceptor的功能。我们可以想象interceptor是一个Flume的插件,每一个插件进行一种操作,前一个interceptor处理后的结果会被送到下一个interceptor。

Flume的interceptor主要有三种:

RegexFilter:顾名思义,这种Interceptor根据正则表达式的标准过滤或者放通特定的Weblog;

RegexReplace: 这种Interceptor根据正则表达式替代Weblog中的特定字符串,类似于正则group处理;

Morphlines: 最为强大的interceptor,可以将行格式记录转化成Avro记录,可以针对记录中的字段摘取特定的内容而放弃无用的内容,可以进行时间戳的转化,也可以针对记录字段进行查找更换。

Morphlines interceptor的细节功能可以参照以下链接:

http://cloudera.github.io/cdk/docs/current/cdk-morphlines/morphlinesReferenceGuide.html

利用Flume的interceptor来实现ETL,工作就是编写几种配置文件:

1. Flume agent的配置文件,这个文件定义agent的source、channel以及sink以及要实现的interceptor;

2. 如果要使用Morphlines interceptor,就要定义一个Morphlines的配置文件;

3. 因为Morphlines会将行数据转化成Avro数据格式的文件,所以要定义一个Avro schema;

4. Avro文件存在HDFS中,如果要使用HIVE进行访问,就要进行表创建,同样要用到Avro schema。

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

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

Morphlines interceptor定义了Morphlines配置文件的位置。

上面是Morphline的配置文件片段,可以看到定义了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”中的“%2F”替换成“/”。

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

上面是HIVE的命令类型,第一个创建一个基于Avro的外部表,第二个添加一个基于HDFS路径的partition。

总结:

上面是HIVE的命令类型,第一个创建一个基于Avro的外部表,第二个添加一个基于HDFS路径的partition。

Flume+Morphlines实现数据的实时ETL的更多相关文章

  1. 利用Flume将MySQL表数据准实时抽取到HDFS

    转自:http://blog.csdn.net/wzy0623/article/details/73650053 一.为什么要用到Flume 在以前搭建HAWQ数据仓库实验环境时,我使用Sqoop抽取 ...

  2. flume+kafka+smart数据接入实施手册

    1.  概述 本手册主要介绍了,一个将传统数据接入到Hadoop集群的数据接入方案和实施方法.供数据接入和集群运维人员参考. 1.1.   整体方案 Flume作为日志收集工具,监控一个文件目录或者一 ...

  3. 使用Flume消费Kafka数据到HDFS

    1.概述 对于数据的转发,Kafka是一个不错的选择.Kafka能够装载数据到消息队列,然后等待其他业务场景去消费这些数据,Kafka的应用接口API非常的丰富,支持各种存储介质,例如HDFS.HBa ...

  4. 实时ETL

    传统的ETL通常采用批处理的方式,一般来说是每天的夜间进行,当天的数据要到第二天才可以获得.随着数据仓库技术的逐步成熟,企业对数据仓库时间延迟的要求更高,希望达到零延迟,也就出现了实时ETL. 实时E ...

  5. 1.8-1.10 大数据仓库的数据收集架构及监控日志目录日志数据,实时抽取之hdfs系统上

    一.数据仓库架构 二.flume收集数据存储到hdfs 文档:http://flume.apache.org/releases/content/1.9.0/FlumeUserGuide.html#hd ...

  6. 大数据 什么是 ETL

    ETL 概念 ETL 这个术语来源于数据仓库,ETL 指的是将业务系统的数据经过抽取.清洗转换之后加载到数据仓库的过程.ETL 的目的是将企业中的分散.零乱.标准不统一的数据整合到一起,为企业的决策提 ...

  7. 通过rsync+inotify实现数据的实时备份

    我讲到过利用rsync实现数据的镜像和备份,但是要实现数据的实时备份,单独靠rsync还不能实现,本文就讲述下如何实现数据的实时备份. 一.rsync的优点与不足 与传统的cp.tar备份方式相比,r ...

  8. Spark Streaming中向flume拉取数据

    在这里看到的解决方法 https://issues.apache.org/jira/browse/SPARK-1729 请是个人理解,有问题请大家留言. 其实本身flume是不支持像KAFKA一样的发 ...

  9. rsync+inotify实现数据的实时备份

    一.rsync概述 1.1.rsync的优点与不足 rsync与传统的cp.tar备份方式相比,rsync具有安全性高.备份迅速.支持增量备份等优点,通过rsync可以解决对实时性要求不高的数据备份需 ...

随机推荐

  1. Error 2 error C2784: 'bool std::operator <(const std::_Tree<_Traits> &,const std::_Tree<_Traits> &)'

    Error 2 error C2784: 'bool std::operator <(const std::_Tree<_Traits> &,const std::_Tree ...

  2. mysql中,root用户密码被遗忘,该如何进行重置?

    需求描述: 在mysql的测试环境中,有时候会遇到一段时间之后root用户的密码被遗忘的情况, 这个时候,就是需要对root密码进行重置,不过,在生产环境中,这种情况还是很少见. 环境描述: 操作系统 ...

  3. javascript测试框架 Mocha 实例教程

    http://www.ruanyifeng.com/blog/2015/12/a-mocha-tutorial-of-examples.html

  4. List<T>与ObservableCollectio<T> 的区别

    在WPF中绑定通常会使用ObservableCollection,为什么不使用List呢? 简单是解释:List不包含值变通知功能,所以绑定了也许会出现绑定的数据与呈现数据不一致的问题. 通常绑定会使 ...

  5. mybatis由浅入深day01_1课程安排_2对原生态jdbc程序中问题总结

    mybatis 第一天 mybatis的基础知识 1 课程安排: mybatis和springmvc通过订单商品 案例驱动 第一天:基础知识(重点,内容量多) 对原生态jdbc程序(单独使用jdbc开 ...

  6. THINKPHP ajax分页示例

    先把框架的page类改造一下 路径在ThinkPHP/Library/Think/Page.class.php文件 添加一个方法 ajax_show 代码如下 <?php /** * 组装分页链 ...

  7. swift - 利用UIDatePicker实现定时器的效果

    效果图如下: 可以通过UIDatePicker调整倒计时的时间,然后点击UIButton开始倒计时,使用NSTimer进行倒计时的时间展示,我是声明了一个label也进行了标记, 然后点击按钮开始倒计 ...

  8. Linux上Nginx部署配置

    一.下载软件 openssl-fips-2.0.10.tar.gz pcre-8.40.tar.gz zlib-1.2.11.tar.gz nginx-1.10.2.tar.gz gcc-c++ 下载 ...

  9. jQuery 选择器实例

    语法 描述 $(this) 当前 HTML 元素 $("p") 所有 <p> 元素 $("p.intro") 所有 class="intr ...

  10. 更改嵌入式Linux中开机画面----左上角小企鹅图标

    一直想给嵌入式仪表加个开机LOGO,但是没有找到更换的方法.最近在网上收集了一些文章,整理一下一共自己参考.目前也还没有试过这种方法究竟是否可以.但察看Kernel源代码可以知道,Linux-2.6的 ...