DStream实战之Spark Streaming接收socket数据实现WordCount 31

需求

现在想要通过socket发送数据, 然后Spark Streaming接收数据并且统计socket发送的每个单词的个数.

1. 架构图

在这里插入图片描述

2. 实现流程

  1. 安装并启动生产者
    首先在linux服务器上用yum安装netcat工具,netcat工具用了发送socket套接字,netcat的命令是nc, 它使用来设置路由器的,我们可以利用它向某个端口发送数据.
    linux安装netcat命令如下:
yum intstall -y nc
  1. 通过netcat工具向指定的端口发送数据
nc -lk 9999
  1. 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. 执行查看结果

  1. 先执行nc -lk 9999
    在这里插入图片描述
  2. 然后再在IDEA中启动代码
    在这里插入图片描述
  3. 不断的在1.中输入不同的单词,观察IDEA控制台输出
    在这里插入图片描述
    在这里插入图片描述

4. 结果

现象:sparkStreaming每隔5s计算一次当前5s内的数据,然后将每个批次的数据输出。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是使用Spark Streaming接收Flume数据的代码实现: 1. 首先,需要在pom.xml文件中添加以下依赖: ```xml <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-streaming-flume_2.11</artifactId> <version>2.4.4</version> </dependency> ``` 2. 接着,在Spark Streaming应用程序中,创建一个Flume事件流,并将其与对应的Flume Agent进行连接: ```scala import org.apache.spark.streaming.StreamingContext import org.apache.spark.streaming.flume._ val ssc = new StreamingContext(sparkConf, Seconds(1)) val flumeStream = FlumeUtils.createStream(ssc, hostname, port) ``` 其中,hostname和port分别是Flume Agent的主机名和端口号。 3. 使用DStream的transform方法对接收到的数据进行处理: ```scala val events = flumeStream.map(event => new String(event.event.getBody.array())) val words = events.flatMap(_.split(" ")) val wordCounts = words.map(word => (word, 1)).reduceByKey(_ + _) ``` 4. 最后,使用DStream的print方法输出结果: ```scala wordCounts.print() ``` 完整代码示例: ```scala import org.apache.spark.streaming.{Seconds, StreamingContext} import org.apache.spark.streaming.flume._ val ssc = new StreamingContext(sparkConf, Seconds(1)) val flumeStream = FlumeUtils.createStream(ssc, hostname, port) val events = flumeStream.map(event => new String(event.event.getBody.array())) val words = events.flatMap(_.split(" ")) val wordCounts = words.map(word => (word, 1)).reduceByKey(_ + _) wordCounts.print() ssc.start() ssc.awaitTermination() ``` 注意:在实际应用中,需要根据实际情况设置合适的批处理间隔时间和Flume Agent的配置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值