前置
Sqoop的作用:
RDBMS <==> Hadoop (关系型数据库与Hadoop生态圈中的存储框架,结合Sqoop做导入导出操作)
在生产环境上,数据库中的文件是一部分,除此之外的文件与日志才是大头、对我们而言是十分重要的,但是会有如下的问题:
- 文件与日志是无法用Sqoop进行操作的
通常日志采集框架有:Flume、Logstash、Beat(这3个都可以进行收集,Beat更轻量级,主流还是Flume)
Flume概述 & 架构
概述
官网介绍
Flume是一个分布式、可靠的、可用的服务
能够高效的去收集数据、聚合数据、移动数据
适用场景:处理大批量的log data(是一个日志收集的工具)
Flume是一个简单的而又灵活的架构基于流式的数据流(通常情况下Flume + Kafka + 流式处理引擎进行打造)
当出现故障的时候,可以故障转移,有重新恢复的机制Flume的组件
collecting: source(源端)
aggregating: tmp storage(中间端,临时存储的地方)
moving: target(移动到目的点去)
从源端进行收集,聚合到一个地方(临时存储),最后移动到最终的目的地去
Flume在使用过程当中,默认就支持使用压缩;存储格式也是支持的;负载均衡也是OK的
使用的时候不需要开发任何代码,只要写一个配置文件把Agent配置一下就OK了
在有些场景是需要配置多个Agent让其组合起来使用
架构
组件Agent的组成
- Source 收集(从外部的服务器上把数据收集过来)
- Channel 聚合(收集过来以后,先放到channel里面)
- Sink 移动(然后,通过Sink将Channel里面的数据拿过来,写到外面去,典型的就是HDFS)
Flume发展的两个阶段:
Flume是由Cloudera公司所提出来的
- OG(老一代)
- NG(新一代)
组件介绍
三个组件对应的分类(只列举了常见的):
Flume Sources:
- Avro Source
avro和thrift都是序列化常用的一种机制 - Thrift Source
- Exec Source
就是命令行这种的,linux中tail -F这类的就可以用Exec Source这类的来作为source - JMS Source(用的不多)
- Spooling Directory Sourc
比如说,你要监控某一个日志的时候:
使用Exec Source的tail -F只能指定到某一个文件上面去
如果要指定到某一个文件夹上面去,怎么办呢?
就是使用Spooling Directory Source - Taildir Source
在1.6版本里,是没有这个的;在1.7版本里才有了这个
这个Source的功能是十分强大的:Exec是一个文件、Spooling是一个文件夹
那么如果我想监控一个文件夹下面的一个文件怎么办呢?
既监控一个文件夹下面新增的文件,也可以支持一个文件夹下面已有文件内容的append
这样就可以采用Taildir Source,综合了Exec和Spooling两者的功能 - Kafka Source
- NetCat TCP Source
即我们所熟知的nc命令 - Custom Source
如果没有满足需求的话,可以自己定义去实现一个Source;不过用的很少,基本都满足了
- Avro Source
Flume Sink:
- HDFS Sink
- Hive Sink
- Logger Sink
即写到控制台 - Avro Sink
- Thrift Sink
- HBase Sink
HBaseSink / AsyncHBaseSink
分为同步和异步2种方式进行写 - ElasticSearchSink
- Kafka Sink
- HTTP Sink
- Custom Sinke
自定义Sink
Flume Channels:
- Memory Channels
如果内存足够的话,就丢到内存中去 - JDBC Channels
- Kafka Channels
- File Channels
这种方式,就会把文件写到磁盘上面去,这样对磁盘的压力就会稍微大一些
- Memory Channels
提出疑问
为什么Source的数据要先到Channels再到Sink呢??放一个Channel的目的是什么??
目的是为了缓冲
比如Java IO里面、MapReduce、Spark Shuffle,在写数据的时候都是先写到buffer里面,buffer满了,再然后flush到磁盘上面去
这样做,能减少与磁盘的交互次数,减少IO,提升性能
环境搭建
所使用的版本:flume-ng-1.6.0-cdh5.7.0
要求:
- Java Runtime Environment - Java 1.8 or later
- Memory - Sufficient memory for configurations used by sources, channels or sinks
内存要足够;尤其是对于channel而言,如果使用的是Memory Channels,那么内存必须要足够 - Disk Space - Sufficient disk space for configurations used by channels or sinks
磁盘空间要大 - Directory Permissions - Read/Write permissions for directories used by agent
权限要有,因为从一个地方收集数据然后再写到磁盘上面去,必须要有足够的权限
步骤:
- 解压flume到/opt/app目录下
- 修改conf/flume-env.sh
添加export JAVA_HOME=/opt/app/jdk1.8.0_45 - 配置环境变量