案例概述
以nc作为源发送数据
案例演示
创建nc源,用于发送数据.
[root@mypc01 ~]# nc -lk mypc01 10086
创建maven工程,导入依赖
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-streaming_2.11</artifactId>
</dependency>
编写代码实现wordCount.
import org.apache.spark.SparkConf
import org.apache.spark.streaming.dstream.{DStream, ReceiverInputDStream}
import org.apache.spark.streaming.{Duration, Seconds, StreamingContext}
//spark streaming demo
//use nc client send data
object Demo1 extends App{
//get a conf object
private val conf = new SparkConf().setAppName("SparkStreamWordcount").setMaster("local[2]")
private val duration: Duration = Seconds.apply(10)
//get a streaming object
private val ssc = new StreamingContext(conf, duration)
private val dstream: ReceiverInputDStream[String] = ssc.socketTextStream("mypc01", 10086)
//实行wordcount的逻辑
private val value: DStream[(String, Int)] = dstream.flatMap(_.split(" ")).map((_, 1)).reduceByKey(_ + _)
value.print()
ssc.start()
ssc.awaitTermination()
}
运行结果
(day,1)
(apple,2)
(a,1)
(good,1)
(an,1)
总结可以知道,与之前使用RDD,需要先创建RDD,现在则是先需要创建Dstream,之后的用法就和RDD差不多了. Dstream应用各种算子以后还是 Dstream,就和之前给RDD应用各种算子是一样的.
方法解析
def socketTextStream(
hostname: String,
port: Int,
storageLevel: StorageLevel = StorageLevel.MEMORY_AND_DISK_SER_2
)
从TCP源hostname:port创建一个输入流。 使用TCP套接字接收数据,并将接收字节解释为UTF8编码的\ n分隔行。
参数:
主机名–要连接以接收数据的主机名
端口–连接到用于接收数据的端口
storageLevel –用于存储接收到的对象的存储级别(默认值:StorageLevel.MEMORY_AND_DISK_SER_2)
def start(): Unit
开始执行流。
IllegalStateException-如果StreamingContext已经停止。
def awaitTermination(): Unit
等待执行停止。 在执行过程中发生的任何异常都将抛出此线程。
总结
- 从nc源创建Dstream
- 对Dstream应用各种算子进行逻辑计算
- 持续输入数据与持续输出结果