大数据之Spark Streaming(二)

本文详细介绍了Spark Streaming的输入数据源,包括基本源如文件流、套接字流和RDD队列流,以及高级数据源如Flume数据接收。讲解了如何设置接收器从数据源获取DStreams,强调了数据一致性与处理方式,提供了Flume Push模式和Pull模式的配置与测试流程。

输入DStreams和接收器

输入DStreams表示从数据源获取输入数据流的DStreams。在NetworkWordCount例子中,lines表示输入DStream,它代表从netcat服务器获取的数据流。每一个输入流DStream和一个Receiver对象相关联,这个Receiver从源中获取数据,并将数据存入内存中用于处理。

输入DStreams表示从数据源获取的原始数据流。Spark Streaming拥有两类数据源:

  • 基本源(Basic sources):这些源在StreamingContext API中直接可用。例如文件系统、套接字连接、Akka的actor等
  • 高级源(Advanced sources):这些源包括Kafka,Flume,Kinesis,Twitter等等
文件流:通过监控文件系统的变化,若有新文件添加,则将它读入并作为数据流

需要注意的是
① 这些文件具有相同的格式
② 这些文件通过原子移动或重命名文件的方式在dataDirectory创建
③ 如果在文件中追加内容,这些追加的新数据也不会被读取。

在这里插入图片描述
注意:要演示成功,需要在原文件中编辑,然后拷贝一份
在这里插入图片描述

import org.apache.log4j.{Level, Logger}
import org.apache.spark.SparkConf
import org.apache.spark.streaming.{Seconds, StreamingContext}

/**
 * @Autho: Administrator and wind
 * @Version: 2019/11/22 & 1.0
 *
 * 文件流
 * Streaming监控文件系统变化,把变化类容采集进来
 */
object FileStreaming {

  def main(args: Array[String]): Unit = {

    //减少日志打印
    Logger.getLogger("org.apache.spark").setLevel(Level.ERROR)

    val conf = new SparkConf().setMaster("local[2]").setAppName("FileStreaming")

    val ssc = new StreamingContext(conf,Seconds(3))

    val lines = ssc.textFileStream("E:\\test\\temp")

    lines.print()

    ssc.start()

    ssc.awaitTermination()

  }

}

RDD队列流

使用streamingContext.queueStream(queueOfRDD)创建基于RDD队列的DStream,用于调试Spark Streaming应用程序
在这里插入图片描述

import org.apache.log4j.{Level, Logger}
import org.apache.spark.SparkConf
import org.apache.spark.rdd.RDD
import org.apache.spark.streaming.{Seconds, StreamingContext}

import scala.collection.mutable.Queue

/**
 * @Autho: Administrator and wind
 * @Version: 2019/11/22 & 1.0
 *
 * RDD队列流
 */
object RDDQueueStream {

  def main(args: Array[String]): Unit = {

    //减少日志打印
    Logger.getLogger("org.apache.spark").setLevel(Level.ERROR)
    val conf = new SparkConf().setAppName("RDDQueueStream").setMaster("local[2]")

    val ssc = new StreamingContext(conf,Seconds(3))

    val rddQueue = new Queue[RDD[Int]]()

    for(i <- 1 to 3){
      rddQueue += ssc.sparkContext.makeRDD(1 to 10)

      Thread.sleep(3000)
    }

    //从对列中接收数据
    val inputDStream = ssc.queueStream(rddQueue)

    val result = inputDStream.map(x=>(x,x*2))

    result.print()

    ssc.start()
    ssc.awaitTermination()
  }
}

套接字流:通过监听Socket端口来接收数据

在这里插入图片描述

高级数据源

Spark Streaming接收Flume数据
  • 基于Flume的Push模式
    Flume被用于在Flume agents之间推送数据.在这种方式下,Spark Streaming可以很方便的建立一个receiver,起到一个Avro agent的作用.Flume可以将数据推送到改receiver.

第一步:Flume的配置文件
在这里插入图片描述
第二步:Spark Streaming程序
在这里插入图片描述

import org.apache.log4j.{Level, Logger}
import org.apache.spark.SparkConf
import org.apache.spark.streaming.flume.FlumeUtils
import org.apache.spark.streaming.{Seconds, StreamingContext}

/**
 * @Autho: Administrator and wind
 * @Version: 2019/11/22 & 1.0
 *
 */
object MyFlumeStream {

  def main(args: Array[String]): Unit = {


    //减少日志打印
    Logger.getLogger("org.apache.spark").setLevel(Level.ERROR)

    val conf = new SparkConf().setMaster("local[2]").setAppName("MyFlumeStream")

    val ssc = new StreamingContext(conf,Seconds(3))

    val flumeEventDStream = FlumeUtils.createStream(ssc,"192.168.1.1",1234)

    val lineDStream = flumeEventDStream.map(e => {
      new String(e.event.getBody.array())
    })

    lineDStream.print()

    ssc.start()
    ssc.awaitTermination()

  }
}

第三步:测试

  • 启动Spark Streaming程序
  • 启动Flume
  • 拷贝日志文件到/root/training/logs目录
  • 观察输出,采集到数据
    在这里插入图片描述
基于Custom Sink的Pull模式

不同于Flume直接将数据推送到Spark Streaming中,第二种模式通过以下条件运行一个正常的Flume sink。Flume将数据推送到sink中,并且数据保持buffered状态。Spark Streaming使用一个可靠的Flume接收器和转换器从sink拉取数据。只要当数据被接收并且被Spark Streaming备份后,转换器才运行成功。
这样,与第一种模式相比,保证了很好的健壮性和容错能力。然而,这种模式需要为Flume配置一个正常的sink。
以下为配置步骤:

第一步:Flume的配置文件

在这里插入图片描述
第二步:Spark Streaming程序
在这里插入图片描述

import org.apache.log4j.{Level, Logger}
import org.apache.spark.SparkConf
import org.apache.spark.storage.StorageLevel
import org.apache.spark.streaming.flume.FlumeUtils
import org.apache.spark.streaming.{Seconds, StreamingContext}

/**
 * @Autho: Administrator and wind
 * @Version: 2019/11/24 & 1.0
 *
 */
object FlumeLogPull {

  def main(args: Array[String]): Unit = {

    //减少日志打印
    Logger.getLogger("org.apache.spark").setLevel(Level.ERROR)

    val conf = new SparkConf().setAppName("FlumeLogPull").setMaster("local[2]")

    val ssc = new StreamingContext(conf,Seconds(3))

    val flumeEvent = FlumeUtils.createPollingStream(ssc,"192.168.1.121",1234,StorageLevel.MEMORY_ONLY)

    val lineDStream = flumeEvent.map(e => {
      new String(e.event.getBody.array())
    })
    lineDStream.print()

    ssc.start()
    ssc.awaitTermination()
  }

}

第三步:需要的jar包

第四步:测试

  • 启动Flume
  • 在IDEA中启动FlumeLogPull
  • 将测试数据拷贝到/root/training/logs
  • 观察IDEA中的输出
    在这里插入图片描述
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值