谷歌数据流与Apache Spark对比

32

我正在调查< strong >Google Dataflow和< strong >Apache Spark,以决定哪个更适合我们的大数据分析业务需求。

我发现在Spark平台上有Spark SQLMLlib用于结构化数据查询和机器学习。

我想知道Google Dataflow 平台上是否有相应的解决方案?


对于机器学习,您的数据流可能会输出一个云存储文件,然后将其提供给预测 API。 - Zig Mandel
@ZigMandel 看起来 Spark 在机器学习方面是更加集成化的解决方案。 - Browny Lin
我也和 @BrownyLin 有着相同的看法,但我不确定,也许他可以指出那项调查? :) - gsamaras
4个回答

53

如果您能详细说明您的具体用例,将有助于进行“大数据分析”。简短回答是...这取决于情况 :-)

以下是与Google云数据流、Spark和Hadoop MR相关的一些关键架构要点。

  • 资源管理:Cloud Dataflow是一个完全按需执行环境。具体来说,当您在Dataflow中执行作业时,资源仅为该作业分配,并且在作业之间没有资源共享/争用。与Spark或MapReduce集群相比,您通常会部署X节点的集群,然后提交作业并调整节点资源。当然,您可以构建和拆除这些集群,但Dataflow模型旨在针对资源管理方面的无需操作。如果要根据作业需求优化资源使用,则Dataflow是控制成本并几乎忘记资源调整的稳定模型。如果您喜欢多租户样式的集群,我建议您查看Google云Dataproc,因为它提供了像Dataflow一样的按需集群管理方面,但更专注于类Hadoop工作负载,例如MR、Spark、Pig等。

  • 交互性:目前 Cloud Dataflow不提供交互模式。这意味着一旦您提交作业,工作资源就绑定到已提交的图形,大部分数据按需加载到资源中。如果您想通过内存RDD将数据加载到集群中,然后动态执行查询,则Spark可能是更好的模型。挑战在于,随着您的数据大小和查询复杂性增加,您必须处理开发运营。现在,如果您的大多数查询可以用SQL语法表示,您可能需要查看BigQuery。BigQuery提供了Dataflow的“按需”方面,并使您能够交互式地执行对大量数据(例如PB级)的查询。我认为BigQuery最大的优点是您不必思考/担心硬件配置来处理您的数据大小。这意味着随着数据大小的增长,您不必考虑硬件(内存和磁盘大小)配置。

  • 编程模型:Dataflow的编程模型更多地体现了函数式的特点,而不是传统的MapReduce模型。在API基本原语方面,Spark和Dataflow有很多相似之处。需考虑以下因素:1)Dataflow的主要编程语言是Java,Python SDK正在开发中。Dataflow Java SDK已经开源并移植到Scala上。目前,Spark在SDK表面选择上更具有优势,包括GraphX、Streaming、Spark SQL和ML等方面。2)Dataflow是一种统一的批处理和流处理DAG开发编程模型。目标是消除在批处理和流处理模型之间转换时的复杂性和成本。同一图形可以在任一模式下无缝运行。3)目前,Cloud Dataflow不支持收敛/迭代型的图形执行。如果需要像MLib这样强大的功能,则应选择Spark。请记住,这是目前的情况。

  • 流处理和窗口化:Dataflow(建立在统一编程模型之上)的架构旨在成为高度可靠、持久、可扩展的执行环境,用于流处理。Dataflow与Spark的主要区别之一是,Dataflow使您能够轻松地按照真实事件时间处理数据,而不仅仅是在其到达图表时处理数据。您可以将数据窗口化为基于事件时间或到达时间的固定窗口、滑动窗口、会话窗口或自定义窗口。Dataflow还提供了触发器(应用于窗口),使您能够控制如何处理迟到的数据。总体而言,您可以调整正确性控制水平以满足分析需求。例如,假设您有一个与100个边缘节点交互的移动游戏。这些节点每秒创建数万个与游戏相关的事件。假设一组节点无法与您的后端流分析系统通信。在Dataflow的情况下,一旦数据到达,您可以控制如何处理与查询正确性需求相关的数据。Dataflow还提供了在流中升级流作业的能力。例如,假设您在一个变换中发现了一个逻辑错误。您可以升级正在运行的作业,而不会丢失现有的窗口状态。总之,您可以保持业务的运行。

总之: - 如果您主要进行ETL样式的工作(过滤、整形、连接等),或者批处理样式的MapReduce,那么Dataflow是一个很好的选择,如果您想要最小化devOps方面的工作。 - 如果您需要实现ML样式的图形,请选择Spark路径,并尝试Dataproc - 如果您正在做ML,而且您首先需要做ETL以清理您的训练数据,请使用Dataflow和Dataproc的混合方式实现。 - 如果您需要交互性,Spark是一个可靠的选择,但是如果您能够用SQL表达查询,则BigQuery也是如此。 - 如果您需要在流中处理ETL和/或MR作业,则Dataflow是一个可靠的选择。


那么...您有哪些应用场景呢?


1
感谢您清晰的解释,我的场景类似于某种实时推荐系统。 - Browny Lin

4

我尝试过以下两种方式:

Dataflow仍然非常年轻,没有“开箱即用”的解决方案来处理机器学习(即使您可以在转换中实现算法),但您可以将处理后的数据输出到云存储中,并稍后使用另一个工具读取。

建议使用Spark,但您需要自己管理集群。然而,有一个很好的替代方案:Google Dataproc。

您可以使用Spark开发分析工具,并通过一个命令部署它们到您的集群上,Dataproc将管理集群本身,无需调整配置。


3
我使用Spark和DataFlow构建代码。让我分享一下我的想法。
Spark/DataProc: 我经常使用Spark(Pyspark)进行ETL。您可以使用SQL和任何编程语言。有很多函数可用(包括窗口函数)。构建数据框架并编写转换,它可以非常快速。一旦数据被缓存,对数据框架的任何操作都将很快。
您只需在GCS上构建Hive外部表即可。然后,您可以使用Spark进行ETL并将数据加载到BigQuery中。这是批处理。
对于流媒体,您可以使用Spark Streaming并将数据加载到BigQuery中。
现在,如果您已经有了集群,则必须考虑是否要迁移到Google Cloud。我发现Data proc(Google Cloud Hadoop / Spark)提供的服务更好,因为您不必担心太多的集群管理。
DataFlow:它被称为Apache Beam。在这里,您可以使用Java / Python或任何其他语言编写代码。您可以在任何框架(Spark / MR / Flink)中执行代码。这是一个统一的模型。在这里,您可以进行批处理和流数据处理。

1
谷歌现在提供了两种编程模型 - MapReduce 和 Spark。它们分别是 Cloud DataFlow 和 Cloud DataProc。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接