SparkStreaming之自定义数据采集器(数据源)

一、用法及说明
需要继承Receiver,并实现onStart、onStop方法来自定义数据源采集

二、需求
自定义数据源(自己采集)、实现监控某个端口号,获取该端口号的内容。

三、代码编写
3.1 第一种写法:

package WordCount

import org.apache.spark.SparkConf
import org.apache.spark.storage.StorageLevel
import org.apache.spark.streaming.dstream.ReceiverInputDStream
import org.apache.spark.streaming.receiver.Receiver
import org.apache.spark.streaming.{Seconds, StreamingContext}

import scala.util.Random

/**
 * @author liang
 * @create 2021 - 04 - 02 - 15:26
 */
object wordcount_DIY {

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

    //1.初始化Spark配置信息
    val sparkConf = new SparkConf().setMaster("local[*]").setAppName("RDDStream")

    //2.初始化SparkStreamingContext
    val ssc = new StreamingContext(sparkConf,Seconds(4))

    val messageDS:ReceiverInputDStream[String] = ssc.receiverStream(new MyReceiver())
     messageDS.print()

    //3、启动SparkStreamingContext任务
    ssc.start()
    ssc.awaitTermination()
  }
  /*
  自定义数据采集器
  1.继承Receiver,定义泛型,传递参数
  2.重写方法
  */

  class MyReceiver extends  Receiver[String](StorageLevel.MEMORY_ONLY) {
    private var flg = true
    override def onStart(): Unit = {

      new Thread(new Runnable {
        override def run(): Unit = {
          while (flg) {
            val message = "采集的数据为:" + new Random().nextInt(10).toString
            store(message)
              Thread.sleep(500)
          }
        }
      }).start()
    }
    override def onStop(): Unit ={
      flg =false;
    }
  }
}

运行结果:
在这里插入图片描述
3.2 第二种写法:
1)自定义数据源

object SparkStreaming03_DIY02 {

  class CustomerReceiver(host: String, port: Int) extends Receiver[String](StorageLevel.MEMORY_ONLY) {
    //最初启动的时候,调用该方法,作用为:读数据并将数据发送给Spark
    override def onStart(): Unit = {
      new Thread("Socket Receiver") {
        override def run() {
          receive()
        }
      }.start()
    }

    //读数据并将数据发送给Spark
    def receive(): Unit = {

      //创建一个Socket
      var socket: Socket = new Socket(host, port=)

      //定义一个变量,用来接收端口传过来的数据
      var input: String = null

      //创建一个BufferedReader用于读取端口传来的数据
      val reader = new BufferedReader(new InputStreamReader(socket.getInputStream, StandardCharsets.UTF_8))

      //读取数据
      input = reader.readLine()

      //当receiver没有关闭并且输入数据不为空,则循环发送数据给Spark
      while (!isStopped() && input != null) {
        store(input)
        input = reader.readLine()
      }

      //跳出循环则关闭资源
      reader.close()
      socket.close()

      //重启任务
      restart("restart")
    }

    override def onStop(): Unit = {}
  }
}

2)使用自定义的数据源采集数据

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

    //1.初始化Spark配置信息
    val sparkConf = new SparkConf().setMaster("local[*]").setAppName("StreamWordCount")

    //2.初始化SparkStreamingContext
    val ssc = new StreamingContext(sparkConf, Seconds(5))

    //3.创建自定义receiver的Streaming
    val lineStream = ssc.receiverStream(new CustomerReceiver("hadoop102", 9999))
    //4.将每一行数据做切分,形成一个个单词
    val wordStream = lineStream.flatMap(_.split("\t"))

    //5.将单词映射成元组(word,1)
    val wordAndOneStream = wordStream.map((_, 1))

    //6.将相同的单词次数做统计
    val wordAndCountStream = wordAndOneStream.reduceByKey(_ + _)

    //7.打印
    wordAndCountStream.print()

    //8.启动SparkStreamingContext
    ssc.start()

    ssc.awaitTermination() 
  }
}

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
TDX(通达信)是一种常用的股票交易软件,它具备丰富的数据分析功能。TDX自定义数据采集是指用户可以根据自己的需求,通过编程或设置规则,实现对特定数据采集和整合。 TDX自定义数据采集的实现可以通过编写相应的脚本或插件来完成。用户可以利用TDX软件提供的API接口,编写脚本来自动采集他们关心的数据。这些数据可以是股票的行情数据、交易数据、财务数据等。用户可以根据自己的需求进行自定义,提取所需的数据并进行进一步的分析。 此外,TDX软件还支持用户通过设置规则实现数据采集。用户可以设置某个特定条件下,自动采集指定数据。例如,用户可以设置当某只股票的涨跌幅超过一定阈值时,自动采集该股票的相关数据。这样,用户可以方便地获取重要的市场信息,并据此做出相应的投资决策。 TDX自定义数据采集的好处在于能够满足用户个性化的需求。用户可以按照自己所关注的领域或特定策略,在TDX软件上自定义数据采集功能,快速获取所需的数据。用户可以针对自己的投资目标、风险偏好等进行数据筛选和整理,提高交易决策的准确性和效率。 总而言之,TDX自定义数据采集为用户提供了在股票交易中获取个性化数据的便利性。用户可以通过编写脚本或设置规则,实现对特定数据采集和整合,提高投资决策的准确性和效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值