在Kafka消息上调度并启动Spark Jobs

时间:2019-07-29 18:33:21

标签: apache-spark spark-streaming spark-streaming-kafka

我有一个外部数据源,可通过Kafka发送数据。

事实上,这不是真实数据,而是指向数据的链接。

 <canvas id="canvas" style='background-color:#EEE;' width='500px' height='500px'></canvas>

只有一个主题,但是它包含$('p').each(function(index) { $(this).attr('tabindex', index) }).on('keyup', function(e) { e.preventDefault; if (e.keyCode == 39) { $('[TabIndex="' + Number(Number($(this).attr('tabindex')) + 1) + '"]').focus(); } if (e.keyCode == 37) { $('[TabIndex="' + Number(Number($(this).attr('tabindex')) - 1) + '"]').focus(); } }); 字段,我需要在该字段上执行一项工作。

数据不是连续的,而是更像作业-它包含一组数据,应在单个批处理中处理。下一个主题是独立的。所有相同类型的主题都应同步处理。

选项:

  1. 使用Spark Streaming。

    看来这不是适合我的方案的解决方案。而且没有内置的功能将"type": "job_type_1" "urls": [ "://some_file" "://some_file" ] 视为数据而不是路径列表

  2. 创建一个中间服务,该中间服务将分派请求并启动具体作业。在这种情况下,什么是传递20Kb +数据到作业的最佳方法,因为提交火花可能不会花费很多争论

  3. 创建一个长期运行的spark应用程序,其中将包含纯Kafka使用者,并在每条消息上创建Spark Session并执行作业。

不确定这将正常工作,如何停止等等,

  1. ???

更新

到目前为止,我的解决方案是创建一个长期运行的Spark作业,该作业将使用Kafka API(不是spark)连接到Kafka,进行订阅,检索URL列表,调度作业类型,然后执行spark作业与type一起使用,因此Spark应用将使用标准的value API

1 个答案:

答案 0 :(得分:1)

您可以在一个Spark会话中运行多个Spark作业。在传入流上启动火花流作业。将结果收集到主节点,并同时触发查询。例如...

class KafkaStreamingExample {

  val conf = new SparkConf().setAppName("Spark Pi")
  def main(args:Array[String]):Unit =  {
    val spark = SparkSession.builder.config(conf).enableHiveSupport().getOrCreate()
    val ssc = new StreamingContext(spark.sparkContext, Seconds(1))

    val kafkaParams = Map[String, Object](
      "bootstrap.servers" -> "localhost:9092,anotherhost:9092",
      "key.deserializer" -> classOf[StringDeserializer],
      "value.deserializer" -> classOf[StringDeserializer],
      "group.id" -> "use_a_separate_group_id_for_each_stream",
      "auto.offset.reset" -> "latest",
      "enable.auto.commit" -> (false: java.lang.Boolean)
    )

    val topics = Array("topicA", "topicB")
    val stream = KafkaUtils.createDirectStream[String, String](
      ssc,
      PreferConsistent,
      Subscribe[String, String](topics, kafkaParams)
    )

    stream.foreachRDD((rdd,time) =>{

      val queriesToRun = rdd.map(_.value()).collect()

      queriesToRun.par.foreach(query => {
        spark.sql(query)
      })
    })
  }
}