基于Socket的实时计算WordCount
Socket简述
Socket(套接字),用来描述IP地址和端口,是通信链的句柄,应用程序可以通过Socket向网络发送请求或者应答网络请求。Socket是支持TCP/IP协议的网络通信的基本操作单元,是对网络通信过程中端点的抽象表示,包含了进行网络通信所必须的五种信息:连接所使用的协议,本地主机的IP地址,本地远程的协议端口,远程主机的IP地址以及远程进程的协议端口。
netcat
netcat是一个用于TCP/UDP连接和监听的Linux工具,主要用于网络传输及调试领域,简称nc
安装只需要yum install nc,不过CentOS7已经自带了。
编写基于Socket的实时WordCount
package StreamingDemo
import org.apache.log4j.{Level, Logger}
import org.apache.spark.SparkConf
import org.apache.spark.streaming.{Seconds, StreamingContext}
/**
* 基于Socket的实时WordCount
*/
object SocketWordCount {
def main(args: Array[String]): Unit = {
//设置日志级别
Logger.getLogger("org").setLevel(Level.WARN)
//创建SparkConf对象,local[2]表示程序在运行的时候会占用2个CPU的内核,也就是在运行的过程中会使用到两个线程
//如果要把程序打包成jar包在集群上运行,setMaster可以省略
val conf = new SparkConf().setAppName(this.getClass.getSimpleName).setMaster("local[2]")
//创建StreamingContext对象,Seconds(2)表示批处理时间间隔为2秒
val ssc = new StreamingContext(conf, Seconds(2))
//创建输入DStream,这里的端口号跟nc要监控的一致,这样就可以从socket中获取数据
val socketInputDStream = ssc.socketTextStream("Hadoop01", 6666)
//对socketInputDStream进行flatMap算子操作
val wordsDStream = socketInputDStream.flatMap(_.split(" "))
//对wordsDStream进行map算子操作,生成(word,1)
val pairsDStream = wordsDStream.map((_, 1))
//对pairsDStream进行reduceByKey算子操作
val WordCountDStream = pairsDStream.reduceByKey(_ + _)
//将结果打印输出到Console
WordCountDStream.print()
//启动Spark Streaming
ssc.start()
//等待应用程序终止
ssc.awaitTermination()
}
}
打开nc,将虚机作为Server端,发送Socket
程序接收到数据,对数据做实时的WordCount,同时可以看见,因为设定了批处理间隔是2s,每隔2s就会收集一次数据
或者可以打包成jar包,上传到集群环境中使用spark-submit的方式运行
spark-submit \
--class StreamingDemo.SocketWordCount \
--num-executors 2 \
--driver-memory 1g \
--executor-memory 1g \
--executor-cores 2 \
sparknewdemo-1.0-SNAPSHOT.jar
参数解析
--class:包名.类名
--num-executors:运行程序的executors的数量
--driver-memory:应用程序的driver占用的内存
--executor-memory:executors占用的内存大小
--executor-cores:executor要使用的CPU核心数目,也就是实际要用多少个线程
参考
http://www.runoob.com/w3cnote/android-tutorial-socket1.html