sparkstreaming开发手册

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.  准备工作

l 下载IntelliJIDEA(版本:13.1.2):

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端重启时被重新实例化。例程如下:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值