我听说有人在 Google Nexus 上成功运行了 MapReduce。没有更多关于在 Android 上运行完整集群 MapReduce 的性能的信息。
我真的很想在手机上以相对少量数据的非集群模式运行mapreduce,完全使用hadoop真的值得吗?哪里有精简版的吗?还有其他选择吗?
最佳答案
使用像 MapReduce 这样的进程的全部意义在于将工作负载分散到多台计算机上,同时实现当前计算机上不可能实现的并发性。如果您没有任何计划联合多个 Android 设备,那么几乎不需要使用像 hadoop 这样的东西。
如果您可以加载设备上的所有数据(这就是您所说的可以做到的)。与并行运行算法最接近的方法是使用多个线程并拆分数据集。您不必进行映射缩减式编程即可获得并行编程的优势,并且将算法开发为生产者/消费者模型可能会更容易。但是,如果你只是想拥有它,这里是一种方法。
我将从两个 BlockingQueues(队列内和队列外)和一个用于从文件(即生产者)读取数据的线程开始。创建一个线程池以从入队列中读取并写入出队列。每个线程将对输入之一(即消费者)进行计算,并将其结果发布到出队列,以便生产者可以接收结果。对入队列和出队列进行一次遍历将完成映射缩减过程的一半。这通常称为生产者/消费者。您可以使用这种风格的架构做很多事情。
如果您想要执行完整的映射缩减,请重复该过程,以便您的缩减步骤并行运行。生产者将按键从 map 中收集所有结果,并将这些结果反馈到队列中。现在,每个消费者将执行归约步骤,并将其结果发布回输出队列,生产者将在其中进行最终排序并将结果呈现给 UI。
因此,生产者的完整状态转换将是:
- 解析输入文件,并创建要放入队列中的工作负载。
- 从出队列中读取结果,直到所有映射进程完成。
- 按键合并结果。
- 将具有相同键的所有结果作为一个工作单元写入队列中。对收到的所有唯一 key 重复此操作。
- 读取输出队列中返回的所有结果。
消费者状态转换将是:
- 从队列中读取一个工作单元。
- 对该工作单元执行 map 逻辑。
- 将结果 + key 写入出队列。
- 从队列中读取一个工作单元。
- 对该工作单元执行归约逻辑。
- 将结果写入出队列。
Android 上的 Viola map 缩减样式框架。
关于android - 在可移植设备上运行 MapReduce,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4238377/