Flume 拦截器和选择器演示案例(interceptor、selector)
1. 背景
- 在大数据处理中,要处理的数据分为结构化,半结构化,非结构化数据。其中日志就是半结构化数据
- 当处理日志文件时,一般先使用flume或者其他方式将日志文件采集出来,一般是从日志系统中采集出来,然后存入到hdfs系统中。
- 当使用flume采集日志时,因为这是最原始的数据,很多时候需要对其进行一定的处理,这时候就需要用到拦截器,拦截器可以对数据做预处理。
- flume的每一条数据使用Event对象包装起来,event分为header和body,header中可以添加各种附加信息,打各种标记信息,后续流程可以用到如选择器。body中就是一个字节数组,也就是数据本身,一般日志信息都是一个字符串,body中就是字符串转换的字节数组。
- 当使用拦截器interceptor对数据进行预处理,例如去除损坏数据,打标记等工作处理之后。就可以使用选择器selector对数据进行选择性分发。
2. 案例
- 需求描述
- 由于历史原因,来自小程序,app的日志缓和在日志服务器的一个日志目录中,无法通过文件名等很好区分,但日志中字段有差异,小程序日志中有openid字段,app日志中有appid字段。
- 现在需要将这2种日志数据进行区分,分别存放到hdfs的不同目录下去。
- 环境准备
- idea 2020
- maven 3.6.3
- pom
<dependencies>
<dependency>
<groupId>org.apache.flume</groupId>
<artifactId>flume-ng-core</artifactId>
<version>1.9.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>2.7.7</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql_2.11</artifactId>
<version>2.4.4</version>
</dependency>
<dependency>
<groupId>org.scala-lang</groupId>
<artifactId>scala-library</artifactId>
<version>2.11.12</version>
</dependency>