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
注意:
- 参数为数据目录,不能指向具体的文件。
- 数据目录支持通配符,如:
hdfs://gaozhy:9000/baizhi/2019-*
- 所有的文件数据格式需要一致
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