我有两个节点独立群集用于火花流处理。下面是我的示例代码,演示了我正在执行的进程。
sparkConf.setMaster("spark://rsplws224:7077")
val ssc=new StreamingContext()
println(ssc.sparkContext.master)
val inDStream = ssc.receiverStream //batch of 500 ms as i would like to have 1 sec latency
val filteredDStream = inDStream.filter // filtering unwanted tuples
val keyDStream = filteredDStream.map // converting to pair dstream
val stateStream = keyDStream .updateStateByKey //updating state for history
stateStream.checkpoint(Milliseconds(2500)) // to remove long lineage and meterilizing state stream
stateStream.count()
val withHistory = keyDStream.join(stateStream) //joining state wit input stream for further processing
val alertStream = withHistory.filter // decision to be taken by comparing history state and current tuple data
alertStream.foreach // notification to other system
我的问题是spark没有将这个状态RDD分发给多个节点或者没有将任务分配给其他节点并导致响应的高延迟,我的输入负载大约是每秒100,000个元组。
我尝试过以下的事情,但没有任何工作
1)spark.locality.wait
到1秒
2)减少分配给执行者进程的内存以检查天气火花分配RDD或任务,但即使它超出了驱动器也在运行的第一个节点(m1)的内存限制。
3)将spark.streaming.concurrentJobs从1(默认)增加到3
4)我已经检查了流ui存储,大约有20个分区用于状态dstream RDD,它们都位于本地节点m1上。
如果我运行SparkPi 100000,那么spark可以在几秒钟(30-40)之后利用另一个节点,所以我确信我的群集配置正常。
有一点我注意到,即使是我的RDD,如果我设置存储级别MEMORY_AND_DISK_SER_2,那么也会在应用程序存储中显示Memory Serialized 1x Replicated
答案 0 :(得分:2)
Spark不会自动在集群中分发流数据,因为它倾向于充分利用数据局部性(在数据所在的位置启动任务会更好,这是默认配置)。但是您可以使用重新分区来分发流数据并改善并行性。您可以转到http://spark.apache.org/docs/1.3.0/streaming-programming-guide.html#performance-tuning了解详情。
答案 1 :(得分:1)
如果您没有访问群集而您的作业只在本地运行,则很可能意味着您SparkConf
中的Spark Master设置为本地URI而不是主URI。
答案 2 :(得分:1)
默认情况下,spark.default.parallelism属性的值是"本地模式"所以所有任务都将在节点中执行,正在接收数据。 在spark-defaults.conf文件中更改此属性以提高并行度级别。