我们正处于转变大型企业当前数据架构的开始阶段,我正在构建一个Spark Streaming ETL框架,我们将所有源连接到目的地(源/目的地可能是Kafka主题,Flume ,HDFS等)通过转换。这看起来像是:
SparkStreamingEtlManager.addEtl(Source, Transformation*, Destination)
SparkStreamingEtlManager.streamEtl()
streamingContext.start()
假设是,因为我们应该只有一个SparkContext,所以我们将在一个应用程序/ jar中部署所有ETL管道。
这个问题是batchDuration是上下文本身的属性而不是ReceiverInputDStream的属性(这是为什么?)。我们是否需要拥有多个Spark群集,或者允许多个SparkContexts并部署多个应用程序?有没有其他方法来控制每个接收器的批处理持续时间?
如果我的任何假设是天真的或需要改写,请告诉我。谢谢!
答案 0 :(得分:3)
根据我的经验,不同的流有不同的调整要求。吞吐量,延迟,接收方容量,要遵守的SLA等。
为了满足这种多样性,我们需要配置每个Spark Streaming作业以解决所述特异性问题。因此,不仅是批处理间隔,还有内存和CPU等资源,数据分区,执行节点数(当负载是网络绑定时)。
因此,每个Spark Streaming作业都成为Spark Cluster上的单独作业部署。这也将允许彼此独立地监控和管理单独的管道,并有助于进一步微调过程。
在我们的例子中,我们使用Mesos + Marathon来管理运行3600x24x7的Spark Streaming作业集。