我正在尝试Spark Streaming设置,其中应用程序接收文本(行),对其进行计数,然后将结果发送回服务器。
这就是我现在正在尝试的事情:
sc = SparkContext('local[4]', 'StreamTest')
sc.setLogLevel('WARN')
ssc = StreamingContext(sc, 2)
lines = ssc.socketTextStream('localhost', 9999)
words = lines.flatMap(lambda line: line.split())
pairs = words.map(lambda word: (word, 1))
word_counts = pairs.reduceByKey(lambda x, y: x + y)
def save_rdd(time, rdd):
if rdd.isEmpty():
return
print('1')
con = socket.socket()
con.connect(('localhost', 9999))
con.send('test')
con.close()
print('2')
# rdd.saveAsTextFile('ws' + time.strftime('%s'))
word_counts.foreachRDD(save_rdd)
ssc.start()
ssc.awaitTermination()
我使用nc -lk 9999
启动服务器,然后发送一个期待'test'
字符串的随机句子。
问题在于我认为它确实有用('1'
和'2'
已打印)但我无法在服务器上看到'test'
。奇怪的是,当我结束应用程序时,我可以在服务器上看到它。
为什么会这样?甚至可以在套接字中发送DStream结果吗?我正在尝试做一些实时的情绪分析,我想向我的服务器报告。
答案 0 :(得分:0)
我认为你必须在发送数据后刷新数据,下面是一个执行它的java代码
Socket s=new Socket("localhost",6666);
DataOutputStream dout=new DataOutputStream(s.getOutputStream());
dout.writeUTF("Hello Server");
dout.flush();
dout.close();
s.close();