Spark Streaming自定义采集器

本文介绍了如何在Spark Streaming中自定义Receiver来接收特定类型的数据源。通过继承Receiver基类并重写onStart和onStop方法,实现数据接收和存储。当接收到'end'信号时,接收停止。提供了代码实现和测试步骤。

一、Spark 自定义Receiver

SparkStreaming 能够接收任意类型的流式数据,不单单只是内建的Flume,Kafka,Kinesis,files,sockets等等。当然若要支持此种数据,则需要开发者自定义程序来接受对应的数据源。本文以下部分就是要实现自定义的Receiver

二、自定义Receiver

 声明一个receiver类,通常需要继承原有的基类,在这里需要继承自Receiver,该基类有两个方法需要重写分别是:
1. onstart() 接收器开始运行时触发方法,在该方法内需要启动一个线程,用来接收数据。
2. onstop() 接收器结束运行时触发的方法,在该方法内需要确保停止接收数据。
当然在接收数据流过程中也可能会发生终止接收数据的情况,这时候onstart内可以通过isStoped()来判断 ,是否应该停止接收数据
 数据存储。一旦接收完数据,则必须要进行数据的存储,并交由SparkStreaming 来处理,Spark以store(data)方法来支持此流程。由于数据格式的不同,当然store方法必须要支持各种类型的数据存储。store方法是以一次存储一条记录或者一次性收集全部的序列化对象。

三、代码实现

采集端口内输入内容,接收到 ‘‘end’’ 停止

package sparkStreaming

import java.io.{BufferedReader, InputStreamReader}

import org.apache.spark.storage.StorageLevel
import org.apache.spark.streaming.receiver.Receiver


class myReceiver(host:String,port:Int) extends Receiver[String](StorageLevel.MEMORY_ONLY){
  var socket:java.net.Socket = null;
  def receiver(): Unit ={
    socket=new java.net.Socket(host,port)
    val reader =          // IO传输
      new BufferedReader(
        new InputStreamReader(socket.getInputStream,"UTF-8")
      )

    var line:String=null;
    while((line=reader.readLine())!=null){
      if(line.equals("end")){
        return
      }else{
        this.store(line)
      }
    }
  }

  override def onStart(): Unit = {
    new Thread(new Runnable {
      override def run(): Unit = {
        receiver()
      }
    }).start()
  }

  override def onStop(): Unit = {
    if(socket!=null){
      socket.close()
      socket=null
    }
  }
}

四、测试

package sparkStreaming

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

object myReceiverDemo{
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf()
      .setMaster("local[*]").setAppName("myReceiverDemo")

    val streamingContext = new StreamingContext(conf,Seconds(5))

    val receiverStream =
      streamingContext.receiverStream(new myReceiver("192.168.184.40",7777))

    val sumStream =
      receiverStream.flatMap(_.split("\\s+"))
        .map((_,1))
        .reduceByKey(_+_)

    sumStream.print()

    streamingContext.start()

    streamingContext.awaitTermination()
  }
}

运行代码,启动nc

nc-lk 7777
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值