需求
现在想要通过socket发送数据, 然后Spark Streaming接收数据并且统计socket发送的每个单词的个数.
1. 架构图
2. 实现流程
- 安装并启动生产者
首先在linux服务器上用yum安装netcat工具,netcat工具用了发送socket套接字,netcat的命令是nc, 它使用来设置路由器的,我们可以利用它向某个端口发送数据.
linux安装netcat命令如下:
yum intstall -y nc
- 通过netcat工具向指定的端口发送数据
nc -lk 9999
- IDEA编写Spark Streaming代码
package cn.acec.sparkStreamingtest
import org.apache.spark.streaming.dstream.{DStream, ReceiverInputDStream}
import org.apache.spark.streaming.{Seconds, StreamingContext}
import org.apache.spark.{SparkConf, SparkContext}
/**
* sparkStreming流式处理接受socket数据,实现单词统计
*/
object SparkStreamingNC{
def main(args: Array[String]): Unit = {
//配置sparkConf参数
val sparkConf: SparkConf = new SparkConf().setAppName("SparkStreamingTCP").setMaster("local[2]")
//构建sparkContext对象
val sc: SparkContext = new SparkContext(sparkConf)
//设置日志输出级别
sc.setLogLevel("WARN")
//构建StreamingContext对象,每个批处理的时间间隔
val scc: StreamingContext = new StreamingContext(sc,Seconds(5))
//注册一个监听的IP地址和端口 用来收集数据
val lines: ReceiverInputDStream[String] = scc.socketTextStream("192.168.200.160",9999)
//切分每一行记录
val words: DStream[String] = lines.flatMap(_.split(" "))
//每个单词记为1
val wordAndOne: DStream[(String, Int)] = words.map((_,1))
//分组聚合
val result: DStream[(String, Int)] = wordAndOne.reduceByKey(_+_)
//打印数据
result.print()
scc.start()
scc.awaitTermination()
}
}
注意:
由于使用的是本地模式local[2], 所以可以直接在本地运行程序
要指定并行度, 如在本地运行设置setMaster(“local[2]”),相当于启动两个线程,一个给receiver,一个给computer。如果是在集群中运行,必须要求集群中可用core数大于1。
3. 执行查看结果
- 先执行
nc -lk 9999
- 然后再在IDEA中启动代码
- 不断的在1.中输入不同的单词,观察IDEA控制台输出
4. 结果
现象:sparkStreaming每隔5s计算一次当前5s内的数据,然后将每个批次的数据输出。