用于任务并行化的Spark-streaming

时间:2016-06-02 13:41:48

标签: apache-spark spark-streaming

我正在设计一个具有以下流程的系统:

  1. 通过网络下载Feed文件(基于行)
  2. 将元素解析为对象
  3. 过滤无效/不必要的对象
  4. 对部分元素执行阻止IO(HTTP请求)
  5. 保存到数据库
  6. Flow diagram

    我一直在考虑使用Spark-streaming实现系统主要用于任务并行化,资源管理,容错等。

    但我不确定这是火花流的正确用例,因为我不仅仅将它用于指标和数据处理。 此外,我不确定Spark-streaming如何处理阻止IO任务。

    Spark-streaming是否适合此用例?或许我应该寻找另一种技术/框架?

2 个答案:

答案 0 :(得分:2)

Spark的核心是一个通用的并行计算框架。 Spark Streaming添加了一个抽象来支持使用微批处理的流处理。 我们当然可以在Spark Streaming上实现这样一个用例。

为了“扇出”I / O操作,我们需要在两个级别确保正确的并行度:

  • 首先,在分区之间均匀分布数据: 数据的初始分区将取决于所使用的流式源。对于这个用例,它看起来像custom receiver可能是要走的路。收到批处理后,我们可能需要使用dstream.repartition(n)到更大数量的分区,这些分区应大致匹配为该作业分配的执行者数量的2-3倍。

  • Spark为每个执行的任务使用1个核心(可配置)。每个分区执行任务。这假设我们的任务是CPU密集型并且需要一个完整的CPU。为了优化阻塞I / O的执行,我们希望为许多操作多路复用该核心。我们通过直接在分区上运行并使用经典的并发编程来并行化我们的工作来实现这一目标。

鉴于feedLinesDstream的原始流,我们可以这样: (*在Scala中.Java版本应该类似,但是像LOC的x倍)

val feedLinesDstream = ??? // the original dstream of feed lines
val parsedElements = feedLinesDstream.map(parseLine)
val validElements = parsedElements.filter(isValid _)
val distributedElements = validElements.repartition(n) // n = 2 to 3 x #of executors

// multiplex execution at the level of each partition
val data =  distributedElements.mapPartitions{ iter =>
   implicit executionContext = ??? // obtain a thread pool for execution
   val futures = iter.map(elem => Future(ioOperation(elem)))
   // traverse the future resulting in a future collection of results
   val res = Future.sequence(future) 
   Await.result(res, timeout)
}
data.saveToCassandra(keyspace, table)

答案 1 :(得分:1)

  

Spark-streaming是否适合此用例?或许我应该看看   对于另一种技术/框架?

在考虑使用Spark时,您应该问自己自己几个问题:

  1. 我的应用程序在当前状态下的规模是多少?未来它将在哪里发展? (Spark通常用于大数据应用程序,其中数百万个进程将在一秒钟内发生)

  2. 我喜欢哪种语言? (Spark可以在 Java,Scala,Python, R 中实现)

  3. 我将使用什么数据库? (Apache Spark等技术通常采用大型数据库结构实现,如 HBase

  4.   

    此外,我不确定Spark-streaming如何处理阻止IO任务。

    Stack Overflow上已经有一个关于使用Scala中的Spark阻止IO任务的answer。它应该给你一个开始,但要回答这个问题,这是可能的。

    最后,阅读文档很重要,你可以找到Spark的here