2016-09-25 48 views
1

我正在尝试使用独立/内部Spark群集(不是纱线或Mesos)来设置Spark群集。我试图理解如何构建事物。Spark调度/体系结构混淆

这里是我的理解:

  • 一个节点需要设置作为主
  • 一个或多个节点需要设置为工人
  • 我写(在Java中)的应用程序将被传递创建火花上下文的主的ip:端口
  • 当我在java应用程序上运行任何代码时,在spark上下文中,例如filter/collect,该代码将自动在工作节点上运行。

我的问题是:

  • 我需要设置为运行驱动程序单独的服务器/节点,或可以/应该可以从主站/工作者的一个节点上运行?

  • 如果我想要定期运行我的过滤器/收集代码,我是否需要在驱动程序中自己处理调度问题?

  • 编辑:它看起来像提交作业的推荐方式是通过bash脚本?这似乎是一个手动过程。这在生产中如何处理?

回答

1
  1. 您可以从非工作节点的应用程序 - 这就是所谓的客户端模式。如果您在某个工作节点中运行应用程序,则称为集群模式。他们都是可能的。

  2. 请看看Spark Streaming,看起来它会符合您的要求。您可以指定每收集一小时的数据并开始计算。您还可以创建将执行​​的cron任务。

  3. 是的,推荐的方式,如果通过​​脚本。然而,您可以从马拉松Oozie的cron作业运行此脚本。这取决于你想要做什么。

如果您想了解更多信息,请写更多关于你的使用情况,我会尽力评论后

更新与更精确的信息来更新我的回答:我建议在看Spark Streaming - 它有连接器Kafka,您可以通过foreachRDD编写聚合或自定义处理,以处理从特定主题收到的数据。 伪代码算法:

val ssc = new StreamingContext(sparkConf, Seconds(2)) 
val directKafkaStream = KafkaUtils.createDirectStream[ 
    [key class], [value class], [key decoder class], [value decoder class] ](
    streamingContext, [map of Kafka parameters], [set of topics to consume]) 
val topicFirst = directKafkaStream.filter (_._1 == "topic1") 
val topic2 = directKafkaStream.filter (_._1 == "topic2") 

topicFirst.foreachRDD (rdd => { 
    // do some processing with data collected from specified time window 
}); 

关于cron的,你可以ivoke nohup与​​。然而,如果你必须以很小的时间间隔执行它,那么最好有一个长时间运行的作业比很多小作业要好。但是,Spark Streaming似乎对你有好处,他们会有一个长时间运行的工作。必填字数示例为here :)

+0

我需要监视几个kafka主题。每个主题都需要一个不同的工作来处理它。例如,主题a将由作业a处理,主题b由作业b处理,等等。所有作业需要共享相同的主/工作节点。 任何想法如何设计这个?谢谢。 –

+0

如果一项工作是通过cron等运行的,那么它是否会运行一次并退出,或者是否需要保留在内存中,并在需要时重复它自己? –

+0

@ClickUpvote我已经添加了一个更新 - 请看看Spark Streaming,看起来它会符合您的要求。您将有一个长时间运行的作业,将由Spark在指定的时间间隔触发 –