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





