【问题标题】:Social-networking: Hadoop, HBase, Spark over MongoDB or Postgres?社交网络:Hadoop、HBase、Spark over MongoDB 还是 Postgres?
【发布时间】:2015-02-28 02:30:11
【问题描述】:

我正在构建一个社交网络,其中包含各种功能,其中许多功能由大数据密集型工作负载(例如机器学习)提供支持。例如:推荐系统、搜索引擎和时序序列匹配器。

鉴于我目前有 5 个用户——但预计会有显着增长——我应该使用哪些指标来决定:

  • Spark(带/不带 HBase over Hadoop)
  • MongoDB 或 Postgres

将 Postgres 视为一种减少它和 Spark 之间移植压力的方法(使用适用于两者的 SQL 抽象层)。 Spark 看起来很有趣,可以想像各种 ML、SQL 和 Graph 问题它都可以快速回答。 MongoDB 是我通常使用的,但我发现它的缩放和 map-reduce 功能非常有限。

【问题讨论】:

  • 所有这些技术都可以很好地扩展到 5 个以上的用户:)。最好选择你最了解的。在这个阶段,功能开发比扩展更重要。也就是说,Spark 确实非常适合批处理。
  • @DanielDarabos:我完全不同意。仅仅因为熟悉而选择错误的技术可能会使您在开发的后期阶段花费大量时间。问 Facebook,我知道他们可以告诉你一些故事来证实这一点。此外,作为开发人员,您应该使用正确的工具来完成工作,而不是用螺丝刀敲打钉子。
  • 我的印象是这个项目处于原型设计阶段。现在写的东西无论如何都会被扔掉。 在此阶段之后,当您更清楚地了解需求时,您可以做出更好的技术决策。这是我的看法,但我当然没有写 Facebook :)。
  • 我希望借此机会学习最适合解决此问题的技术堆栈。 Facebook 的例子就是一个很好的例子。所以要回答我的堆栈问题,我应该怎么做?

标签: mongodb postgresql hadoop apache-spark bigdata


【解决方案1】:

我认为您搜索软件堆栈/架构的方向是正确的:

  • 处理不同类型的负载:批处理、实时计算等。
  • 随着业务增长而扩大规模和速度
  • 成为维护良好且受支持的实时软件堆栈
  • 为特定领域的计算(例如机器学习等)提供通用库支持。

就这些优点而言,Hadoop + Spark 可以为您提供所需的优势。 Hadoop 目前相对成熟,可以批量处理大规模数据。它支持可靠且可扩展的存储(HDFS)和计算(Mapreduce/Yarn)。通过添加 Spark,您可以利用 Spark 添加的存储 (HDFS) 和实时计算(性能)。

在开发方面,Java/Scala 原生支持这两个系统。在 stackoverflow 和其他任何地方,库支持和性能调整都很丰富。至少有一些机器学习库(Mahout、Mlib)与 hadoop、spark 一起使用。

对于部署,AWS 和其他云提供商可以为 hadoop/spark 提供主机解决方案。那里也不是问题。

【讨论】:

  • 谢谢,我应该注意我使用的是 Python(我知道 Spark 也支持 Python,并且在各种 Hadoop 项目上有各种包装器)。它处理低延迟查询的能力如何? - 缩小到 1 个节点(起初)。 - 我注意到一些图形和 SQL 支持,以及关于在范式之间移动 + 带来的优势的讨论。 - 你能详细说明吗?
  • 使用 Python,对于 Hadoop,它主要是流式接口,其中数据被传递到 Python 代码的标准输入,结果被发送到标准输出,以供框架洗牌或归约。使用 Spark,通过包装器或 Python FFI,可以以与 Java 类似的方式查询数据。 Spark 的数据处理接口非常类似于函数式编程。 :) Python 程序员应该有宾至如归的感觉。有各种性能基准比较 Spark(快约 100 倍)和 Hadoop。这必须在您自己的数据集上进行测试。总的来说,这两个系统都应该在单节点上运行良好,并在未来提供长期的可扩展性。
  • 谢谢,赞成。对于通用的 CRUD,我应该使用 Spark 的 SQL,社交网络组件 Spark 的 GraphX 和分析 MLib、Mahout 等吗? - 还是我过度简化/复杂化了?
  • 是的。我的理解是这是一般准则。使用不同的处理语言方言,可以轻松使用外部系统/数据或利用团队的现有技能。在封面之下,数据结构主要是 Spark 中的 RDD。这种架构有助于构建异构系统,从而更轻松地与外部源或系统交互。
  • 谢谢,刚刚给你赏金。不过,仍在查看其他答案,例如:您对 @suiterdev 所说的不使用 Spark 作为通用 CRUD 层有何看法?
【解决方案2】:

我们使用 Spark +Hbase + Apache Phoenix + Kafka +ElasticSearch,到目前为止扩展很容易。

*Phoenix 是 Hbase 的 JDBC 驱动程序,它允许将 java.sql 与 hbase、spark(通过 JDBCrdd)和 ElasticSearch(通过 JDBC River)一起使用,它确实简化了集成。

【讨论】:

  • 有趣。您能否扩展您的用例,并可能包括一些通用(CRUD)、实时分析、搜索、批处理分析等的延迟基准? - 另外我应该注意,我使用的是 Python,而不是 JVM 上的一种语言。
  • Phoenix 在这里有一些性能数据:phoenix.apache.org/performance.html
  • 我觉得我现在更倾向于 Apache Phoneix。仅供参考:有一个用于从 Python 与 JDBC 对话的库。
【解决方案3】:

您是否希望保持纯粹的开源?如果您打算在某个时候进入企业,许多 Hadoop 企业发行版都包含捆绑的 Spark 分析。

我有偏见,但是,还有 Datastax Enterprise 产品,它将 Cassandra、Hadoop 和 Spark、Apache SOLR 和其他组件捆绑在一起。它在许多主要的互联网实体中使用,特别是对于您提到的应用程序。 http://www.datastax.com/what-we-offer/products-services/datastax-enterprise

您还想考虑如何托管它。

如果您留在云中,则不必选择,您将能够(取决于您的云环境,但是,以 AWS 为例)使用 Spark 进行连续批处理,使用 Hadoop MapReduce 进行长期处理时间线分析(分析长时间积累的数据)等,因为存储将与收集和处理解耦。将数据放入 S3 中,稍后使用您需要的任何引擎对其进行处理。

如果您将托管硬件,构建 Hadoop 集群将使您能够混合硬件(框架支持的异构硬件),将为您提供强大而灵活的存储平台和多种分析工具,包括HBase 和 Hive,并为您提到的大多数其他东西提供端口,例如 Hadoop 上的 Spark(不是端口,实际上是 Spark 的原始设计。)它可能是最通用的平台,可以部署/扩展便宜,因为不需要每个节点的硬件都相同。

如果您是自托管的,使用其他集群选项将强制您满足硬件要求,以后可能难以扩展。

【讨论】:

  • 是的,我正试图专注于纯粹的开源。虽然 MapR 看起来确实不错,但 Hortonworks 也是如此……虽然还没有研究过 Datastax。因此,您的建议是使用 Cassandra 进行通用 CRUD,使用 Solr 进行搜索,使用 Spark 进行实时分析,使用 Hadoop MapReduce 进行长期分析?
  • 嗯,这真的取决于你的用例。 Cassandra 具有最快的写入和流式读取,但它是一个键值存储,类似于 HBase,但具有更具体的实现。您的数据模型可能非常适合它,或者其他东西可能会更好。 Solr 作为搜索已经/正在获得相当大的吸引力,Spark 是当前近实时分析的首选,而 MapReduce,或其抽象 Pig 和 Hive,或 Impala 之类的变体,让您可以执行常规操作具有 DBMS 感觉的大规模经济运营。
  • 好的,如果我要在 Cassandra 和 Spark 之间为我的通用 CRUD 组件进行选择,我将如何做出选择? - Solr、ElasticSearch 和 Luscene 没有任何问题,但我不急于将搜索添加到我的项目中,所以我暂时将其放在一边。 - 事务支持会很好,但最终我怀疑我是否需要跨许多组件。
  • 就像我说的,取决于您的用例,这应该决定您的数据模型,这将指导您的摄取方法,这应该指导您的存储。老实说,这些堆栈的构建方式是松散耦合的,所以你可以交换东西。为了回答直接的评论,Spark 并不是真正的收集方法。您编写 Spark 代码以将数据转化为信息。所以,根本不是C。 Cassandra 是键值存储的可靠选择。 HBase 也是如此。柱状存储可能更适合您。或者也许是一个 ORM 商店。在您的数据模型更加成熟之前,无法进行该调用。
  • 那么让我们来谈谈极其通用的最简单的模型。身份验证和用户配置文件。在 Redis 中存储访问令牌。模型不应该在 Spark 中,这就是你的意思吗? - 所以我应该使用 HBase 或 Cassandra 吗?
【解决方案4】:

在我看来,这更多地取决于您的要求和您将拥有的数据量,而不是用户数量——这也是一个要求——。 Hadoop(又名 Hive/Impala、HBase、MapReduce、Spark 等)可以很好地处理每天 GB/TB 的大量数据,并且可以很好地水平扩展。

在我使用过的大数据环境中,我一直使用 Hadoop HDFS 来存储原始数据,并利用分布式文件系统使用 Apache Spark 分析数据。结果存储在像 MongoDB 这样的数据库系统中,以获得低延迟查询或具有许多并发用户的快速聚合。然后我们使用 Impala 进行需求分析。使用这么多技术时的主要问题是很好地扩展基础设施和分配给每种技术的资源。例如,Spark 和 Impala 消耗大量内存(它们在内存引擎中),因此将 MongoDB 实例放在同一台机器上是个坏主意。

我还建议您使用图形数据库,因为您正在构建社交网络架构;但是我没有这方面的经验...

【讨论】:

    【解决方案5】:

    我不得不承认我有点偏见,但是如果你想学习新东西,你有大量的空闲时间,你愿意阅读很多,并且你有资源(在基础设施方面),选择 HBase*,你不会后悔的。当您可以实时拥有数十亿个原子计数器时,就会开启一个充满可能性和有趣功能的全新世界。

    *与 Hadoop、Hive、Spark 一起...

    【讨论】:

      【解决方案6】:

      我想您应该将数据存储和数据处理分开。特别是“Spark 还是 MongoDB?”不是好问,而是“Spark 还是 Hadoop 还是 Storm?”还有“MongoDB、Postgres 还是 HDFS?”

      无论如何,我都会避免让数据库进行处理。

      【讨论】:

      • 所以我正在使用 Phoenix 调查 HBase。关于分离,我在逻辑上同意,但对身体有两种看法。将所有数据存储在一层中不是更好吗,例如:HDFS? - 还是速度不存在? - 我可以将 Spark 视为最上面的那个快速层吗?
      • 说明 HDFS 中的任何进程数据。这很好,但是您想对数据一些事情,对吧? HDFS 不为你提供处理,只是提供一种快速访问数据的方式。也许如果你能分享一个实际的用例(“机器学习”不是一个用例),我们更容易理解你在寻找什么。
      • “推荐系统、搜索引擎和时间序列匹配器。”,例如根据 10,000 多名潜在与会者的个人计划/日历优化会议时间。
      • 10,000 并不是一个很大的数字,我想说。特别是在使用 HDFS 时,我猜所有数据可能都适合一个 HDFS 块,这意味着您不能很好地利用数据局部性。但是假设您的应用程序使用 PostgreSQL,那么您可以使用 Spark 的 JdbcRDD 从那里导入数据,然后使用 RDD 操作来计算您的结果。但请先检查 Spark 的计算模型,看看它们是否与您想做的计算相匹配,以及您是否需要它的分布式。
      • 给定 n=10000r=17472(每年半小时时段),那么 [naïve] 时间复杂度为 $\mathcal{O}(nr)$。即:17,472,000。如果不是 $\log \log$,我也许可以通过阅读有关序列匹配的文献得到 $\mathcal{O}(n \log r)$,但这是不确定的。无论如何,您现在可以将其视为大数据问题。
      猜你喜欢
      • 2013-08-22
      • 2019-06-26
      • 1970-01-01
      • 2017-12-20
      • 1970-01-01
      • 2015-01-30
      • 2011-05-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多