Spark Streaming的Source与kafka集成

DStream(离散数据流)

DStream是Spark Streaming中的一个基本抽象。表现为一段连续的数据流(本质上是一组连续RDD的集合)。一个DStream中的一个RDD含有固定间隔的数据集。

**应用于DStream的任何操作都转换为底层RDD上的操作。**如:第一个Spark Streaming案列

Input DStream And Receivers

Input DStream表示从数据源接受的数据构建的DStream对象。

构建Input DStream通常有两种方式

  • Basic Source(直接可以通过StreamingContext进行构建,如:FS、Socket)
  • Advanced Source(引入SparkStreaming和第三方系统集成依赖 Kafka、Flume、etc等)

注意:

​ 如果使用local模式运行Spark Streaming应用,不要使用local或者local[1]作为master的URL。

​ 如果这样做的话,就意味着只有一个线程运行任务,会造成唯一的线程被用来接受流数据,而没有可供进行数据处理的线程。

​ local模式运行,建议使用local[n],并且n应该大于任务接受线程的数量。

Basic Source
File Streams

使用HDFS API从任意的文件系统读取文件数据,作为数据来源。如:

val lines = ssc.textFileStream("hdfs://gaozhy:9000/baizhi")

如果获取不到HDFS中数据,可以使用如下解决方案:https://blog.csdn.net/qq_40493738/article/details/89788603

修改时钟:date -s '2019-11-04 17:34:00'再执行clock -w

注意:

  1. 参数为数据目录,不能指向具体的文件。
  2. 数据目录支持通配符,如: hdfs://gaozhy:9000/baizhi/2019-*
  3. 所有的文件数据格式需要一致
RDD Queue
val ssc = new StreamingContext(sc, Seconds(5))
// 通过rdd queue创建DStream对象
val rdd1 = sc.textFile("/Users/gaozhy/data/wc.txt",2)
val rdd2 = sc.textFile("/Users/gaozhy/data/wc2.txt",2)
val rddQueue = mutable.Queue(rdd1,rdd2)
val lines = ssc.queueStream(rddQueue)
Advanced Sources
kafka

启动kafka集群

  • 启动zookeeper
  • 启动kafka集群
  • 创建topci spark
  • 进入生产消息模式
<dependency>
    <groupId>org.apache.spark</groupId>
    <artifactId>spark-streaming-kafka-0-10_2.11</artifactId>
    <version>2.4.4</version>
</dependency>
package example2

import org.apache.kafka.clients.consumer.ConsumerConfig
import org.apache.kafka.common.serialization.StringDeserializer
import org.apache.spark.SparkConf
import org.apache.spark.streaming.kafka010.{ConsumerStrategies, KafkaUtils, LocationStrategies}
import org.apache.spark.streaming.{Seconds, StreamingContext}

object AdvancedSourceWithKafka {
  def main(args: Array[String]): Unit = {
    // StreamingContext是所有Spark Streaming应用的入口
    val conf = new SparkConf().setMaster("local[2]").setAppName("DirectKafkaWordCount")
    val ssc = new StreamingContext(conf, Seconds(5))
    // 通过kafka创建DStream对象
    val kafkaParams = Map[String, Object](
      ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG -> "gaozhy:9092",
      ConsumerConfig.GROUP_ID_CONFIG -> "g1",
      ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG -> classOf[StringDeserializer],
      ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG -> classOf[StringDeserializer])
    val messages = KafkaUtils.createDirectStream[String, String](
      ssc,
      LocationStrategies.PreferConsistent,
      ConsumerStrategies.Subscribe[String, String](List("baizhi"),kafkaParams ))

    // 将此DStream中生成的每个RDD的前十个元素打印到控制台
    messages.flatMap(_.value.split(" ")).map((_,1L)).reduceByKey(_+_).print()

    // 启动计算
    ssc.start()
    // 等待计算终止
    ssc.awaitTermination()
  }
}
Flume

参考资料:http://spark.apache.org/docs/latest/streaming-flume-integration.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值