Spark Streaming 自定义数据源之 WordCount

实现监控某个端口号,获取该端口号内容。

package org.feng.stream

import java.io.{BufferedReader, InputStreamReader}
import java.net.Socket
import java.nio.charset.StandardCharsets

import org.apache.spark.internal.Logging
import org.apache.spark.storage.StorageLevel
import org.apache.spark.streaming.receiver.Receiver
import org.apache.spark._
import org.apache.spark.streaming._

/**
  * Created by Feng on 2019/12/2 15:52
  * CurrentProject's name is spark
  * 自定义数据源
  */
object MyDefine {

  def main(args: Array[String]): Unit = {
    val sparkConf = new SparkConf().setMaster("local[2]").setAppName("MyDefine")

    val streamingContext = new StreamingContext(sparkConf, Seconds(3))

    val lines = streamingContext.receiverStream(new CustomReceiver("localhost", 12345))

    val line = lines.flatMap(_.split(" "))

    line.map(word => (word, 1)).reduceByKey(_+_).print()

    streamingContext.start()
    streamingContext.awaitTermination()
  }
}

class CustomReceiver(host:String, port:Int) extends Receiver[String](StorageLevel.MEMORY_AND_DISK_2) with Logging{
  override def onStart(): Unit = {
    new Thread("CustomRecei"){
      override def run(): Unit ={
        receive()
      }
    }.start()
  }

  override def onStop(): Unit = {
    // 什么都不写
  }

  /**
    * 接收方法
    */
  private def receive(): Unit = {
    try{
      var userInput:String = ""
      val socket:Socket = new Socket(host, port)
      val reader = new BufferedReader(new InputStreamReader(socket.getInputStream, StandardCharsets.UTF_8))
      userInput = reader.readLine()

      while(!isStopped() && userInput != null){
        store(userInput)
        userInput = reader.readLine()
      }

      reader.close()
      socket.close()

      restart("Trying to connect again")
    } catch {
      case e:java.net.ConnectException => restart("Error connecting to " + host + ":" + port, e)
      case t:Throwable => restart("Error receiving data", t)
    }
  }
}

注意

流处理的这个程序是监听一个本地的端口,使用netcat往该端口上发送数据即可监听到。在本地运行时,需要安装netcat的windows版本(https://eternallybored.org/misc/netcat/)。点击这里的连接,下载1.1.2版本。之后解压该压缩包,将里边的所有子文件复制到System32文件夹下,就可以用cmd去访问了。命令是nc -l -p [port],我这里监听的是12345端口。

原文链接:https://blog.csdn.net/FBB360JAVA/article/details/103410629

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你家宝宝

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值