2015-01-21 48 views
0

当使用增加分区的函数时,似乎会产生空的阶段,调用重新分区时会发生同样的情况,阶段溢出了spark UI,并且我无法跟踪真实阶段,它使得UI无用使用reduceByKey时spark spark会继续产生阶段

我从字相同的行为算例如 https://github.com/apache/spark/blob/master/examples/src/main/java/org/apache/spark/examples/streaming/JavaNetworkWordCount.java

我用火花1.1.0使用默认设置

+0

你能澄清你的问题吗?您使用哪个Spark版本?提供您使用的代码或至少它的简化版本?你不把舞台和任务混合在一起吗?您使用的流式传输的设置(批处理间隔,spark.streaming.blockInterval,接收器数量)是多少? – 0x0FFF 2015-01-21 10:43:36

+0

我指的是在ui中完成的阶段表而不发送数据到套接字spark继续向表中添加条目 – ran 2015-01-21 11:43:27

回答

1

与火花流要处理的数据流。与例如,你连接它工作在一个批次数据的每个1秒:

JavaStreamingContext ssc = new JavaStreamingContext(sparkConf, Durations.seconds(1)); 

这意味着每个1秒你有DSTREAM的内部产生一个单独的RDD并执行所有的转化。这会导致您在WebUI中看到许多单独的阶段逐一执行的事实 - 这是在每个单独的输入批次顶部执行的转换

DStream内批处理RDD中创建的分区数量可以计算为batch interval/spark.streaming.blockInterval其中默认设置会给你每个200毫秒额外的分区。尝试将批处理间隔增加到1分钟或至少30秒,并且您会看到这一点更好 - 几乎您在nc中输入的每行都会被转换为单独的分区,并且单独的分区会导致调度单独的任务来处理它,这就是为什么一些阶段会有超过1个任务。

+0

但是,为什么每当secondres添加新的阶段时,当我使用reducebykey时没有数据,而当我只使用map时add只有当数据为 – ran 2015-01-21 12:18:00

+0

时,因为即使对于空RDD它也执行至少一个任务。您可以简单地启动Spark shell(我更喜欢PySpark)并执行一些简单的操作:'sc.parallelize([]).map(lambda x:(x,y))。reduceByKey(lambda x,y:x + y).collect ()' - 你会看到它会有2个阶段,每个阶段有1个任务 – 0x0FFF 2015-01-21 12:27:06

相关问题