Spark Streaming" echo"读取和写入套接字

时间:2018-05-25 06:25:28

标签: apache-spark spark-streaming

我正在看一下这个火花样本:

https://spark.apache.org/docs/latest/streaming-programming-guide.html#a-quick-example

我想实现一个" echo"应用程序,一个火花流软件,从套接字读取一些字符并在同一个套接字上输出相同的字符(这是我真正的问题的简化,当然我有一些处理输入,但让我们现在不关心这个)。

我尝试按照本指南实现CustomReceiver: https://spark.apache.org/docs/2.3.0/streaming-custom-receivers.html

我添加了一个方法getSocket

def getSocket() : Socket = {
   socket
}

我试图像这样调用它:

val receiver = new SocketReceiver2("localhost", 9999, StorageLevel.MEMORY_AND_DISK_2)
val lines = ssc.receiverStream(receiver)
lines.foreachRDD { 
    rdd => rdd.foreachPartition { partitionOfRecords =>
       val os = receiver.getSocket().getOutputStream();
       partitionOfRecords.foreach(record => os.write(record.getBytes()))
    }
}

但我收到Task not serializable错误。 (正如T.Gaweda所指出的那样)。所以下一步将是开始使用累加器...

有没有更简单的方法来做我的" echo"应用于Spark Streaming?

(我真的需要使用Kafka(hdfs,hive ...)从一个简单的Java应用程序来回发送数据吗?)

1 个答案:

答案 0 :(得分:1)

接收者被发送给工人,他们在那里被处决。您可以在Receiver类中看到它实现了Serializable。

在您的代码中,您有socket字段,可能是Socket类型,不可序列化