spark streaming:通过Redis来控制任务的关闭

package example3

import org.apache.kafka.clients.consumer.{ConsumerConfig, ConsumerRecord}
import org.apache.spark.SparkConf
import org.apache.spark.rdd.RDD
import org.apache.spark.storage.StorageLevel
import org.apache.spark.streaming.dstream.{DStream, InputDStream, ReceiverInputDStream}
import org.apache.spark.streaming.kafka010.{ConsumerStrategies, KafkaUtils, LocationStrategies}
import org.apache.spark.streaming.receiver.Receiver
import org.apache.spark.streaming.{Duration, Seconds, StreamingContext, StreamingContextState}
import redis.clients.jedis.{Jedis, JedisPoolConfig}

import scala.collection.mutable
import scala.util.Random

object HelloStreaming11 {
  def main(args: Array[String]): Unit = {
    val sparkConf = new SparkConf().setMaster("local[*]").setAppName("MyConsumer")
    val ssc = new StreamingContext(sparkConf, Seconds(5))
    //有状态操作必须配置这条
    ssc.checkpoint("checkPoint")

    val socketData: ReceiverInputDStream[String] = ssc.socketTextStream("xx.xx.xx.xx", 9999)
    val wordTuple: DStream[(String, Int)] = socketData.map((_, 1))
    val result: DStream[(String, Int)] = wordTuple.reduceByKey(_ + _)



    result.foreachRDD(
      rdd => {
        rdd.collect().foreach(println)
      }
    )
    ssc.start();
    new Thread(new Runnable {
      override def run(): Unit = {
        val redisHost = "localhost";
        val redisPort = 6379;
        val jedis = new Jedis( redisHost, redisPort)
        var stopFlag = false;
        while(stopFlag != true){
          //此处加入逻辑从外部获取关闭标志,如果标志为真,则执行关闭
          var flagInRedis = jedis.get("stopSpark")
          if(flagInRedis != null ){
            stopFlag = true;
          }

          if(ssc.getState() == StreamingContextState.ACTIVE && stopFlag == true){
            println("ssc will stop......")
            ssc.stop(true, true);
          }
          Thread.sleep(5000);
        }

      }
    }).start();

    ssc.awaitTermination();


  }




}

### 回答1: b'sparkstreamingredis'的意思是询问如何将Spark Streaming产生的数据Redis中。答案可以是使用Redis对应的Java API或Redis的Python客户端库等工具,将数据按照指定的格式格式化并Redis中。 ### 回答2: Spark Streaming可以通过Redis作为数据存储和处理的一种选择。在Spark Streaming中,可以使用Redis作为数据源和数据目的地,将实时流数据Redis中。 在使用Spark StreamingRedis时,首先需要通过创建一个Redis连接池或者直接连接Redis服务器来建立与Redis的连接。可以使用`Jedis`或`Lettuce`等Java库来实现与Redis的连接。 在Spark Streaming的DStream中,可以通过`foreachRDD`函数来对每个批次的RDD进行操作。在这个函数中,可以使用`foreachPartition`函数将分区中的数据入到Redis中。 具体地,可以在`foreachPartition`函数中创建一个Redis连接,并在每个分区中迭代处理数据,并将数据入到Redis中。 示例代码如下: ```scala import redis.clients.jedis.Jedis val stream = ... // 从实时数据源获取DStream stream.foreachRDD { rdd => rdd.foreachPartition { partition => val jedis = new Jedis("localhost") // 连接Redis服务器 partition.foreach { data => // 将数据Redis中 jedis.set(data._1, data._2) } jedis.close() // 关闭Redis连接 } } // 启动Streaming应用 ssc.start() ssc.awaitTermination() ``` 上述代码中的`data._1`和`data._2`代表了从实时流中获得的每一条数据的键和值。可以根据实际需求进行相应的处理和转换。 需要注意的是,在使用Spark StreamingRedis时,需要考虑到数据的一致性和可靠性。可以使用Redis的事务机制和持久化功能来确保数据入的完整性和持久性。 综上所述,使用Spark StreamingRedis可以通过连接Redis服务器,并在分区中迭代处理数据并Redis中来实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值