【问题标题】:How to scale an algorithm/service/system with multiple machines?如何使用多台机器扩展算法/服务/系统?
【发布时间】:2016-06-29 00:11:33
【问题描述】:

我最近接受了一些采访,被问到一些规模问题是很正常的。 例如,您有一个很长的单词列表(dict)和字符列表作为输入,设计一个算法来找出 dict 中包含字符列表中所有字符的最短单词。然后面试官问如何将你的算法扩展到多台机器上。 另一个例子是您为城市的一个十字路口设计了一个交通灯控制系统。您如何将此控制系统扩展到具有许多交叉路口的整个城市。 一直对这种“尺度”问题一无所知,欢迎大家提出建议和cmets。

【问题讨论】:

  • 听起来您应该根据这些采访对分布式计算进行一些研究。我的面试(刚毕业)都没有问过这些类型的问题,所以我假设你申请的职位希望你知道这些东西。

标签: algorithm distributed-computing system-design large-scale


【解决方案1】:

您的第一个问题与您的第二个问题完全不同。事实上,城市交通信号灯的控制是本地化的操作。附近有可以调整的盒子和检测等候车辆的灯顶部的光学传感器。我想如果你需要优化一些流的目标函数,你可以将信息路由到一个服务器进程,那么它可以变成如何在多台机器上扩展这个服务器进程。

我不是分布式算法设计方面的专家,它跨越了整个研究领域。但是本科面试的问题通常不是那么专业。毕竟,他们不是在采访专门研究这些领域的研究生。以你的第一个问题为例,确实很笼统。

通常,这些问题涉及多个数据结构(多个列表和哈希表)交互(连接、迭代等)以解决问题。一旦你制定了一个基本的解决方案,扩展基本上就是在许多机器上复制该解决方案并同时使用输入的分区运行它们。 (当然,在很多情况下,即使不是不可能,也很难,但面试问题不会那么难)

也就是说,您有许多相同的工作人员分担输入工作负载并同时工作,但这些工作人员是不同机器中的进程。这带来了通信协议和网络延迟等问题,但我们将忽略这些以达到基础。

最常见的扩展方式是让工作人员持有较小数据结构的副本,并让他们将较大的数据结构拆分为工作负载。在您的示例(第一个问题)中,字符列表的大小很小,因此您将为每个工作人员提供一份列表的副本,以及用于处理该列表的字典的一部分。请注意,反过来是行不通的,因为每个持有字典的工作人员总共会消耗大量内存,并且不会为您节省任何扩展。

如果您的问题变得更大,那么您可能需要更多的拆分层,这也意味着您需要一种方法来组合接受拆分输入的工作人员的输出。这是MapReduce 框架及其衍生框架的一般概念和动机。

希望对你有帮助...

【讨论】:

    【解决方案2】:

    对于第一个问题,如何在不同机器上同时运行的字符列表中搜索包含所有字符的单词。 (还不是最短的)。我会以map-reduce 为基础。

    首先,这个问题实际上可以在不同的机器上同时运行。这是因为对于数据库中的每个单词,您可以在另一台机器上检查它(所以要检查另一个单词,您不必等待上一个单词或下一个单词,您可以将每个单词发送到不同的计算机以检查)。

    使用map-reduce,您可以将map每个单词作为value,然后检查它是否包含字符列表中的每个字符。

    Map(Word, keyout, valueout){
        //Word comes from dbase, keyout & valueout is input for Reduce
        if(check if word contain all char){
            sharedOutput(Key, Word)//Basically, you send the word to a shared file. 
        //The output shared file, should be managed by the 'said like' hadoop
        }
    }
    

    Map 运行之后,您可以从共享文件中的数据库中获取所需的所有 Word。至于reduce 步骤,您实际上可以使用一些简单的步骤来根据它的长度减少它。多田,你得到的是最短的。

    至于第二个问题,我想到了多线程。这实际上是一个彼此无关的问题。我的意思是每个路口都有自己的计时器,对吗?所以为了能够处理大量的交叉点,你应该使用多线程。

    简单的术语是使用处理器中的每个内核来控制每个交叉点。而不是逐个循环遍历所有交叉点。您可以将它们分配在每个核心中,以便处理更快。

    【讨论】:

      猜你喜欢
      • 2015-12-26
      • 2010-10-21
      • 2014-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多