SparkStreaming之套接字流(使用Socket编程实现自定义数据源)

一 环境

   ubuntu14+pycharm+spark2.3+python3.6

二 目的

  python代码自定义Socket服务器端作为SparkStreaming数据源,实现wordcount功能

三 步骤

  1. 实现Socket服务器端:编写DataSourceSocket.py,指定绑定主机ip及端口号

# python3
# -*- coding:utf-8 -*-
# @Time: 9/5/19 11:22 AM
# @Author: Damon
# @Software: PyCharm

'''
编程实现Socket服务端作为自定义数据源
'''

import socket

#生成socket对象
server=socket.socket()
#绑定ip和端口
server.bind(("localhost",9999))
#监听绑定的端口
server.listen(1)
while 1:
    print("我在等待客户端连接请求......")
    #服务端进入阻塞状态,conn是连接对象,addr【0】:ip地址,addr[1]:端口号
    conn,addr=server.accept()
    print("连接地址 %s 成功..." %addr[0])
    print("发送数据......")
    conn.send("我支持香港警察,我爱中国......".encode())
    conn.close()
    print("连接关闭......")

  2. 实现Socket服务器端:编写Socket.py,接收三个参数:self(默认)、ip、端口号

# python3
# -*- coding:utf-8 -*-
# @Time: 9/5/19 10:25 AM
# @Author: Damon
# @Software: PyCharm

'''

1.此程序为socket客户端,向服务端发送连接请求(服务端事先监听某个端口),源源不断的从服务端获取数据,使用套接字流作为数据源
2.构建socket服务端:在shell交互式环境中输入命令启动nc程序:nc -lk 9999   监听9999端口,或者自定义服务器段数据源
'''

from __future__ import print_function
import sys
from pyspark import SparkContext
from pyspark.streaming import StreamingContext

if __name__=="__main__":
    if len(sys.argv)!=3:
        print("Usage:Socket.py  ",file=sys.stderr)
        exit(-1)
    sc=SparkContext(appName="PythonStreamingSocket")
    sc.setLogLevel("ERROR")
    ssc=StreamingContext(sc,1)
    #1.流计算数据源
    lines=ssc.socketTextStream(sys.argv[1],int(sys.argv[2]))
    #2.流计算计算
    counts=lines.flatMap(lambda line:line.split(" ")).map(lambda x:(x,1)).reduceByKey(lambda a,b:a+b)
    counts.pprint(50)
    #3.启动流计算
    ssc.start()
    #4.终止流计算
    ssc.awaitTermination()

四 运行

  1.在shell窗口,执行如下命令,运行自定义的服务端程序:

#/usr/local/spark/为spark安装目录
/usr/local/spark/bin/spark-submit DataSourceSocket.py

  2.在另一shell窗口,执行如下命令,运行客户端程序:

 

/usr/local/spark/bin/spark-submit Socket.py localhost 9999

结果:

服务器端窗口:

SparkStreaming之套接字流(使用Socket编程实现自定义数据源)_第1张图片

客户端窗口:

SparkStreaming之套接字流(使用Socket编程实现自定义数据源)_第2张图片

你可能感兴趣的:(Spark)