我们正处于转变大型企业当前数据架构的初期阶段,我目前正在构建一个Spark Streaming ETL框架,在该框架中,我们会将所有源都连接到目的地(源/目的地可能是Kafka主题,Flume,HDFS,等)通过转化。看起来像这样:SparkStreamingEtlManager.addEtl(Source, Transformation*, Destination)SparkStreamingEtlManager.streamEtl()streamingContext.start()
假设是,由于我们只有一个SparkContext,因此将所有ETL管道部署在一个应用程序/jar中。
问题在于,batchDuration是上下文本身的属性,而不是ReceiverInputDStream的属性(这是为什么?)。因此,我们是否需要多个Spark集群,或者允许多个SparkContext并部署多个应用程序?还有其他方法可以控制每个接收方的批处理持续时间吗?
如果我的任何假设是幼稚的或需要改写的,请告诉我。谢谢!
最佳答案
以我的经验,不同的流具有不同的调优要求。吞吐量,等待时间,接收方的容量,要遵守的SLA等。
为了满足这种多样性,我们需要配置每个Spark Streaming作业以解决所述特异性。因此,不仅是批处理间隔,而且还包括内存和cpu,数据分区,正在执行的节点数(在负载受网络限制时)之类的资源。
因此,每个Spark Streaming作业都将成为Spark群集上的一个单独的作业部署。这也将允许彼此独立地监视和管理单独的管道,并有助于进一步优化过程。
在我们的案例中,我们使用Mesos + Marathon管理运行3600x24x7的Spark Streaming作业集。
关于hadoop - 如何设置具有不同批处理持续时间的多个Spark Streaming作业?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29612726/