Python - Stream - 如何更快地将数据发送到服务器

时间:2018-01-03 09:57:07

标签: python sockets apache-spark stream spark-streaming

我想将文本文件中的字符串发送到本地端口,但我必须打开连接并为每个字符串关闭它。因此,数据流非常慢。(几乎在两秒钟内1个字符串)。我怎样才能让它更快?

        while 1:
            conn, addr = s.accept()

            line_number = random.randint(1,2261074)
            liste.append(line_number)
            line = linecache.getline(filename,line_number)

            sendit = line.split("   ")[1]
            print type(sendit)
            print "sending: " + sendit
            conn.send(sendit)

            conn.close()
            print('End Of Stream.')

1 个答案:

答案 0 :(得分:0)

answer建议在每个连接上向Spark发送10条消息,将每条消息分隔1秒,然后关闭连接。

最好保持连接打开并在服务器端使用非阻塞套接字。

下面的服务器代码保持连接打开,在非阻塞套接字上批量发送消息,每批次之间有空闲延迟。

这可以用来测试Spark接收消息的速度。我已将其设置为分批发送50条消息,然后等待1秒后再发送下一条50条消息。

Spark会在我的机器上收到所有正常的消息,即使我将空闲延迟设置为零。

您可以根据应用需要进行实验和调整。

服务器代码:

import socket
import time
import select

def do_send(sock, msg, timeout):
    readers = []
    writers = [sock]
    excepts = [sock]
    rxs, txs, exs = select.select(readers, writers, excepts, timeout)
    if sock in exs:
        return False
    elif sock in txs:
        sock.send(msg)
        return True
    else:
        return False

host = 'localhost'
port = 9999

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind((host, port))
s.listen(1)

print "waiting for client"
conn, addr = s.accept()
print "client connected"
conn.setblocking(0)

batchSize = 50
idle = 1.
count = 0
running = 1
while running:
    try:
        sc = 0
        while (sc < batchSize):
            if do_send (conn, 'Hello World ' + repr(count) + '\n', 1.0):
                sc += 1
                count += 1
        print "sent " + repr(batchSize) + ", waiting " + repr(idle) + " seconds"
        time.sleep(idle)
    except socket.error:
        conn.close()
        running = 0

print "done"

简单的Spark代码:

from pyspark import SparkContext
from pyspark.streaming import StreamingContext

sc = SparkContext("local[2]","test")
ssc = StreamingContext(sc, 1)
ststr = ssc.socketTextStream("localhost", 9999)
lines = ststr.flatMap(lambda line: line.split('\n'))
lines.pprint()
ssc.start()  
ssc.awaitTermination()

希望这可能有用。