1. Flume
1.1. Flume source
1.1.1.Flume采集mysql
Mysql数据的实时采集需要利用mysql数据同步的数据结构binlog,该binlog本来用于mysqlmaster到mysql slave的数据同步,该日志会记录mysql的各类DML操作信息,比如操作类型(insert,update,delete)、操作的字段等。要解析binlog,通用的方式是使用开源canal工具,部署方式如下图:
Canal服务端伪装成master slave,实时接收mysqlmaster同步过来的binlog文件,并对其进行解析,解析完的消息发往canal客户端,然后通过flumeng进行消息的采集。具体的使用方法可以参考《mysql实时数据采集方法》:
1.1.2.Flume采集文件
对于文件的采集,使用flume自带的Spooling Directory Source,该类型的source通过简单的配置即可使用。该类型的source会监控一个指定目录的新产生的文件。典型的配置如下图所示
1.2. Flume sink
1.2.1. Sink到HBase
Flume自带HBase sink,可以实现将数据sink到HBase中,该类型sink可以提供像HBase一样的一致性。配置可以参考下图进行配置:
1.2.2. Sink到Kakfa
Flume自带一个sink,可以实现将flume的数据流推到kafak对应的topic上,典型的配置如下:
1.2.3.Sink到hdfs
Flume自带一个sink,可以实现将接收到的event写入到hdfs上,典型的配置如下:
2. 流应用开发和运行指导
2.1. 开发环境搭建
2.1.1. 准备工作
http://download.jetbrains.com/idea/ideaIC-13.1.2.exe
l 下载Scala(版本:2.10.3):
http://www.scala-lang.org/files/archive/scala-2.10.3.msi
l 下载Scala插件(版本:0.16.293):
http://plugins.jetbrains.com/plugin/download?pr=idea&updateId=15875
注:确保机器上已经安装JDK
2.1.2. 安装IntelliJIDEA、Scala
点击两个软件的安装文件,直接安装即可
2.1.3. 安装Scala插件
- 打开IntelliJ IDEA,依次选择[File] -[Setting] - [Plugins] - [Install plugin from disk…]
选择Scala插件压缩包,点击[OK],完成Scala插件的安装。
2.1.4. 运行HelloWorld程序
- 重启IntelliJ IDEA后,依次选择[CreateNew Project] - [Scala] - [Scala Module]。(如下图)
- 填写[Project name],选择[ProjectSDK] - [Config later]。
- 右键项目,选择[Open ModuleSettings] - [Libraries] - [+] - [Java]
- 选择Scala安装包bin目录下的所有jar包
- 依次选择[Modules] - [Scala],在[Compilerlibrary]中选择scala-2.10.3
- 右键src目录,依次选择[New] - [ScalaClass]
- 在[Name]中输入“HelloWorld”,在[Kind]中选择Object。
- 编写简单程序:
- 空白处右键,选择[Run'HelloWorld.main()']
- 如果之前配置都是正确的,就会出现如下结果。
2.2. Sparkstreaming开发
2.2.1. 初始化StreamingContext
一点一个context已经开始,不会有新的流计算再次被建立或者添加进来,一点context停止,无法重启。而且在同一时刻,在jvm内部只有一个StreamingContext实例。
2.2.2. 输入流和接收器
l 基本源
l 高级源
l 接收器可靠性
2.2.3. DStreams转换
和RDD相同,转换允许输入的DStream变化。DStreams支持普通spark RDD上的需要转换操作:
l map(func)
返回一个DStream,输入DSteam中的每个元素都经过func函数的处理
l flatMap(func)
和map类似,但是每个输入元素可以被映射成0个或者多个输出元素
l filter(func)
返回的Dstream是源DStream经过func函数过滤的
l repartition(func)
修改源DStream的并行度
l union(otherStream)
把一个DStream和另外一个DStream求并集
l count()
返回一个DStream,这个DSteam是一个单元素DStream,包含了RDD中所有的元素个数
l reduce(func)
返回一个单元素RDD的DStream,这个单元素是通过聚合每一个RDD的元素得到的,聚合的函数是func函数
l countByValue()
当在一个DStream(K,V)调用countByValue,返回一个新的DStream(K, Long),key的值是每一个RDD出现的频率
l reduceByKey(func, [numTasks])
挡在一个DStream(K,V)上调用该方法,返回一个新的DStream(K,V),每一个key的值被指定的func函数聚合。该方法默认使用spark默认的平行任务数来做分组。但是可以通过传递numTask来控制实际的任务数
l join(otherStream, [numTasks])
当调用DStream, 返回一个DStream(K,(V,W))
l transform(func)
通过使用一个RDD-toRDD函数,返回一个新的DStream,这个方法可以做任意的RDD转换。
l updateStateByKey(func)
返回一个新的DStream状态,这个状态上,每一个key通过调用函数func被更新了一个状态。
2.2.4. 窗口操作
SparkStreaming提供了窗口操作,允许用户在一个滑动窗口上执行变换操作,如下图所示:
如图所示,每次滑动窗口在源DStream上滑动,落入窗口的源RDD会被集合在一起,产生一个在窗口内的RDD。任何的窗口操作需要指定两个参数:
l Window length:窗口的长度(图中3所示)
l Sliding interval:执行窗口操作的间隔(图中2所示)
这两个参数必须是源DStreambatch间隔的整数倍,同样,窗口操作有以下类似batch的操作:
l Window(windowLength, slideInterval)
返回一个基于windowLength的源DStream的新DStream。
l countByWindow(windowLength,slideInterval)
返回一个滑动窗口每个元素的个数
l reduceByWindow(func, windowLength,slideInterval)
返回一个单元素的stream,通过函数func进行聚合,聚合单位是wndowlenght和sliceInterval生成的窗口stream
l reduceByKeyAndWindow(func,windowLength, slideInterval, [numTasks])
当在DStream(K,V)上调用该方法时,返回一个新的DStream(k,v)。
l reduceByKeyAndWindows(func,invFunc, windowLength, slideInterval, [numTasks])
l countByValueAndWindos(windowLength,slideInterval, [numTasks])
2.2.5. join操作
在spark streaming中,可以很容易的实现不同类型的join操作。
l Stream-Stream join
在每个batch间隔内,stream1产生的RDD将会和stream2产生的RDD进行join操作,同样可以进行左连接、右连接以及全外连接操作。
Batch join
Window join
l Stream-dataset join
2.3. DStream的输出操作
输出操作允许DStream数据被推送到外部系统,例如数据库或者文件系统。因为输出操作实际上是允许变换后的数据被外部系统消费,这就触发了DStream的实际转换操作。目前,支持的输出操作包括:
l print()
在driver节点打印每个batch的前10个元素,主要用于代码调试
l saveAsTextFiles(prefix,[suffix])
把DStream的内容保存为文本文件,每一个batch间隔产生的RDD生成的文件以prefix和suffix分别作为前缀和后缀
l saveAsObjectFiles(prefix, [suffix])
把DStream的内容保存为对象文件,文件名分别以prefix和suffix为前缀和后缀
l foreachRDD(func)
这是最一般化的输出操作符,主要通过方法func对流中的元素进行转换。这个方法推送数据到外部系统,例如保存RDD为文件,或者通过数据库写入网络。需要注意的是方法func在流应用的driver端执行。
2.4. 累加器和广播变量的使用
累加器和广播变量不能在spark streaming中从checkpoint恢复。如果启用了启用了累加器和广播变量,必须创建lazily实例化,这样他们才能在driver端重启时被重新实例化。例程如下: