Apache spark 过滤9000万用户数据的最佳体系结构?

Apache spark 过滤9000万用户数据的最佳体系结构?,apache-spark,hadoop,apache-kafka,cassandra,Apache Spark,Hadoop,Apache Kafka,Cassandra,这纯粹是一个假设性的问题,因为我最近开始研究分布式系统 概述: 用户有一个购物应用程序 用户执行操作(注册、查看、购买、多视图等) 用户根据当前正在做的事情接收实时活动和建议 问题是: 为每秒可能超过3000万的传入事件提供实时建议 挑战: 筛选数据,应用建议,并将其发送回 到目前为止,我的想法如下。 使用Cassandra存储操作数据。(因为Cassandra具有高度可扩展性,我们不关心ACID保证,我们关心的是高可用性) 将HDFS与Spark和Kafka一起使用。(处理数

这纯粹是一个假设性的问题,因为我最近开始研究分布式系统

概述:
  • 用户有一个购物应用程序
  • 用户执行操作(注册、查看、购买、多视图等)
  • 用户根据当前正在做的事情接收实时活动和建议
问题是:
  • 为每秒可能超过3000万的传入事件提供实时建议
挑战:
  • 筛选数据,应用建议,并将其发送回

到目前为止,我的想法如下。
  • 使用Cassandra存储操作数据。(因为Cassandra具有高度可扩展性,我们不关心ACID保证,我们关心的是高可用性)

  • 将HDFS与Spark和Kafka一起使用。(处理数据,但我不确定)

这就是我想的流程:

  • 用户执行一个操作
  • 动作转到API(通过LBs)
  • 操作在Cassandra中注册
  • API通知工人(可能是芹菜?)刚刚发生的操作
  • 工人查询卡桑德拉的数据
  • 工作将数据发送给卡夫卡
  • 卡夫卡将数据发送给Spark
  • Spark使用机器学习处理数据
  • 新的自定义操作(即折扣、建议等)将根据用户的操作进行专门定制
  • Spark将数据发送回卡夫卡
  • 卡夫卡向用户发送数据
  • 用户将显示从服务器收到的自定义操作

  • 请纠正我的任何错误,或者如果有更好的,可扩展的方法来做它。我仍在学习所有这些不同的组件,以及它们如何组合在一起。

    我将从不同的角度来看待它:您希望能够以响应的方式向用户提供建议

  • 发送给每个用户的结果数据有多大?比如说10KB

  • 要生成该结果,必须搜索的数据库有多大?比如说1GB

  • 您选择的云服务器的i/o吞吐量是多少?假设一台服务器每秒可以服务10000个用户

  • 3000万个请求除以10000个用户等于3000台服务器

  • 因此,您的第一个问题是如何将1GB的数据复制到3000台服务器。如果您想要回复,第二个问题是如何同步3000份拷贝

    第一个并不难:将数据从一个中央拷贝复制到3000台服务器相当容易——这就是内容交付网络所做的。而且,如果在任何时候只有一小部分数据发生变化,那么它可以非常快速和高效

    对于响应,解决方案将取决于数据。假设的最坏情况是所有服务器立即需要任何一个答案,即3000台服务器向其他2999台服务器广播。这不太可能奏效

    如果所有服务器上不同时需要这些数据,那么您可以实现一种“电话树”方法,其中每个服务器通知10个其他服务器,然后再通知10个其他服务器,以此类推。但这限制了您部署服务器的灵活性


    无论如何,我希望这给了您一些思考和确定您正在考虑的软件是否满足问题需要的方法。

    很好的方法,但我不知道我是否同意服务器的计算。服务器可以处理的连接类型是什么?你说的是轮询、http轮询、web套接字吗?对于用户事件,10KB似乎也有点过多,我认为是200字节,可能更少。9000万用户平均每天发送5个事件,每个事件平均200字节,我们可能说的是每天1 mb的负载。9000万用户平均每天发送5个请求,我们说的是每天4.5亿个请求,450/84600=~5300个请求/秒。因此,根据您的计算,单个服务器将能够处理负载。但为了安全,我们可以扩展和复制。要永久存储这些事件,五年后我们将拥有:9000万*每天5个事件*200字节=90 GB*365天*5年=164 TB的存储如果我们使用宽列非关系数据库,我们可能会根据行的不同拥有更低/更大的存储大小,与将未填充列存储为“null”或类似类型的内容的关系列相反。因此,乍一看,宽列数据库确实更具吸引力。因为我们不关心一致性,所以这是一条路。我很难理解hadoop如何适应所有这些,因为我们讨论的是数据库中的数据,我不需要HDFS。我可以使用MQ和工人来处理数据。然后,我可以使用Pulsar/Kafka将活动/推荐信息实时反馈给用户。@Madd World。我使用的数字纯粹是说明性的。如果你应用你自己的数据,那么你可以看到问题的哪一部分是最关键的。我不能帮你对卡夫卡等作一个明确的推荐,因为我对真正的问题和你真实数据的性质了解不够。