spark Streaming介绍及实例编写

1,引用一段官网介绍

spark Streaming是Spark core API的扩展,支持实时数据流的处理,并且具有可扩展,高吞吐量,容错的特点。 
数据可以从许多来源获取,如Kafka,Flume,Kinesis或TCP sockets,并且可以使用复杂的算法进行处理,这些算法使用诸如map,reduce,join和window等高级函数表示。
最后,处理后的数据可以推送到文件系统,数据库等。 实际上,您可以将Spark的机器学习和图形处理算法应用于数据流。

输入:可以从Kafka,Flume,HDFS等获取数据 
计算:我们可以通过map,reduce,join等一系列算子通过spark计算引擎进行计算(基本和RDD一样,使用起来更方便。) 
输出:可以输出到HDFS,数据库,HBase等。

在内部,它的工作原理如下。 Spark Streaming接收实时输入数据流并将数据分成批,然后由Spark引擎处理,以批量生成最终结果流。

严格来说spark streaming 并不是一个真正的实时框架,因为他是分批次进行处理的。
Spark Streaming提供了一个高层抽象,称为discretized stream或DStream,它表示连续的数据流。 DStream可以通过Kafka,Flume和Kinesis等来源的输入数据流创建,也可以通过在其他DStream上应用高级操作来创建。在内部,DStream表示为一系列RDD。
 

2,编写一个稍复杂的数据累加示例

package cn.itcast.spark.day5
import org.apache.spark.streaming.{Seconds, StreamingContext}
import org.apache.spark.{HashPartitioner, SparkConf, SparkContext}
object StateFulWordCount {


  //Seq这个批次某个单词的次数
  //Option[Int]:以前的结果

  //分好组的数据
  val updateFunc = (iter: Iterator[(String, Seq[Int], Option[Int])]) => {
    //iter.flatMap(it=>Some(it._2.sum + it._3.getOrElse(0)).map(x=>(it._1,x)))
    //iter.map{case(x,y,z)=>Some(y.sum + z.getOrElse(0)).map(m=>(x, m))}
    //iter.map(t => (t._1, t._2.sum + t._3.getOrElse(0)))
    iter.map{ case(word, current_count, history_count) => (word, current_count.sum + history_count.getOrElse(0)) }
  }

  def main(args: Array[String]) {
    //LoggerLevels.setStreamingLogLevels()
    //StreamingContext
    val conf = new SparkConf().setAppName("StateFulWordCount").setMaster("local[2]")
    val sc = new SparkContext(conf)
    //updateStateByKey必须设置setCheckpointDir, 计算过程中生成的rdd的公共缓存路径
    sc.setCheckpointDir("E://ck")
    val ssc = new StreamingContext(sc, Seconds(5)) //设置每五秒产生一个批次

    val ds = ssc.socketTextStream("192.168.2.201", 8888) //在虚拟机上启动一个nc 8888端口  ./netcat -l -p 8888
    //DStream是一个特殊的RDD
    //a a a a b b b b c c c
    val result = ds.flatMap(_.split(" ")).map((_, 1)).updateStateByKey(updateFunc, new HashPartitioner(sc.defaultParallelism), true) //调用方法 根据key值统计

    result.print()
    ssc.start()// 开始计算
    ssc.awaitTermination()// 等待计算结束
    //ssc.stop() 只能手动停止
  }
}

在虚拟机上启动一个nc socket端口 

./netcat -l -p 8888

启动程序,然后再8888端口下输入几个测试数据

查看程序后台输出:

到这里,一个数据累加实例就完成了。

 

3,Discretized Streams (DStreams) 同样来自官网介绍

Discretized Streams或DStream是Spark Streaming提供的基本抽象。 它表示连续的数据流,即从源接收的输入数据流或通过转换输入流生成的已处理数据流。 在内部,DStream由连续的RDD系列表示,这是Spark对不可变的分布式数据集的抽象。 DStream中的每个RDD都包含来自特定时间间隔的数据,如下图所示。

在DStream上应用的任何操作都会转化为对每个RDD的操作。例如,wordcount案例中(下面会进行代码演示),flatMap操作应用于DStream行中的每个RDD,以生成单词DStream的RDD。 这在下图中显示。 

这些基础RDD转换由Spark引擎计算。 DStream操作隐藏了大部分这些细节,并为开发人员提供了更高级别的API以方便使用

想看更详细的讲解请自行查看官网:(http://spark.apache.org/docs/latest/streaming-programming-guide.html)使用浏览器将网页文本整体翻译成中文即可,英语7、8级的请随意。

展开阅读全文

没有更多推荐了,返回首页