简单Java映射/简化框架
有人能给我介绍一个简单的、开源的Map/Reduce framework/API for Java吗?似乎没有太多证据表明存在这样的事情,但其他人可能知道不同的情况 当然,我能找到的最好的工具是Hadoop MapReduce,但它不符合“简单”标准。我不需要运行分布式作业的能力,只需要让我在一台多核机器上运行map/reduce样式的作业,在一个JVM中,使用标准的Java5样式并发简单Java映射/简化框架,java,mapreduce,Java,Mapreduce,有人能给我介绍一个简单的、开源的Map/Reduce framework/API for Java吗?似乎没有太多证据表明存在这样的事情,但其他人可能知道不同的情况 当然,我能找到的最好的工具是Hadoop MapReduce,但它不符合“简单”标准。我不需要运行分布式作业的能力,只需要让我在一台多核机器上运行map/reduce样式的作业,在一个JVM中,使用标准的Java5样式并发 写自己并不难,但我宁愿不写。我使用以下结构 int procs = Runtime.getRuntime().
写自己并不难,但我宁愿不写。我使用以下结构
int procs = Runtime.getRuntime().availableProcessors();
ExecutorService es = Executors.newFixedThreadPool(procs);
List<Future<TaskResult>> results = new ArrayList();
for(int i=0;i<tasks;i++)
results.add(es.submit(new Task(i)));
for(Future<TaskResult> future:results)
reduce(future);
int procs=Runtime.getRuntime().availableProcessors();
ExecutorService es=Executors.newFixedThreadPool(procs);
列表结果=新建ArrayList();
例如(int i=0;i几年前,当我得到一台8核机器时,我为自己创建了一个一次性的,但我对它不是很满意。我从来没有让它像我希望的那样简单易用,而且内存密集型任务的扩展性也不好
如果你没有得到任何真正的答案,我可以分享更多,但其核心是:
public class LocalMapReduce<TMapInput, TMapOutput, TOutput> {
private int m_threads;
private Mapper<TMapInput, TMapOutput> m_mapper;
private Reducer<TMapOutput, TOutput> m_reducer;
...
public TOutput mapReduce(Iterator<TMapInput> inputIterator) {
ExecutorService pool = Executors.newFixedThreadPool(m_threads);
Set<Future<TMapOutput>> futureSet = new HashSet<Future<TMapOutput>>();
while (inputIterator.hasNext()) {
TMapInput m = inputIterator.next();
Future<TMapOutput> f = pool.submit(m_mapper.makeWorker(m));
futureSet.add(f);
Thread.sleep(10);
}
while (!futureSet.isEmpty()) {
Thread.sleep(5);
for (Iterator<Future<TMapOutput>> fit = futureSet.iterator(); fit.hasNext();) {
Future<TMapOutput> f = fit.next();
if (f.isDone()) {
fit.remove();
TMapOutput x = f.get();
m_reducer.reduce(x);
}
}
}
return m_reducer.getResult();
}
}
我还将注意到这是一个非常精练的map reduce算法,包括一个reduce worker,它同时执行reduce和merge操作。我意识到这可能是事后的事,但您可能想看看JDK7中的类
有一个在JDK6下工作的后端口库,没有任何问题,因此您不必等到下一个千年才开始使用它。它位于原始执行器和hadoop之间,为在当前JVM中处理map reduce作业提供了一个框架。您看过了吗?签出了吗?而akka是r实际上,这是一个基于分布式参与者模型的并发框架,您可以用很少的代码简单地实现很多事情。使用它可以很容易地将工作划分为多个部分,它可以自动充分利用多核机器,并且能够使用多台机器来处理工作。与使用线程不同,它感觉更自然对我来说
我有一个使用akka的Java。这不是最简单的map reduce示例,因为它使用了futures;但它应该让您大致了解其中所涉及的内容。我的map reduce示例演示了几个主要方面:
- 如何分配工作
- 如何分配工作:akka有一个非常简单的消息传递系统和一个工作参与者,您可以配置其日程安排。一旦我学会了如何使用它,我就无法停止。它非常简单灵活。我很快就使用了我的四个CPU核。这对于实现服务来说非常好
- 如何知道工作何时完成,结果何时准备好处理:这实际上是最难理解和最令人困惑的部分,除非你已经熟悉期货。你不需要使用期货,因为还有其他选择。我之所以使用期货,是因为我想让人们去探索更短的东西
如果您有任何疑问,StackOverflow实际上有一个很棒的akka QA部分。我喜欢在Java中使用并行。该框架为具有共享内存的多核机器实现了某些并行模式(即主从、映射/减少、管道、分叉和分治)。这种技术称为“算法框架”。图案可以嵌套
具体来说,有骨架和肌肉。肌肉完成实际工作(分割、合并、执行和条件)。骨架表示并行模式,但“While”、“for”和“If”除外,这在嵌套模式时很有用
可以在框架内找到示例。我需要了解一下如何使用肌肉和骨骼,但克服了这个障碍后,我非常喜欢这个框架。您可能想看看Functionals 4 Java的项目网站:它介绍了过滤器,映射并简化到8之前的java版本。我认为值得一提的是,这些问题在java 8之前已经成为历史。例如:
int heaviestBlueBlock =
blocks.filter(b -> b.getColor() == BLUE)
.map(Block::getWeight)
.reduce(0, Integer::max);
换句话说:单节点MapReduce在Java 8中可用
有关更多详细信息,请参见在Hazelcast的v3.2中引入了MapReduce API(请参见)。虽然Hazelcast旨在用于分布式系统,但它在单节点设置中运行良好,而且相当轻量级。您可以尝试LeoTask:一种并行任务运行和结果聚合框架
它是免费和开源的:
以下是其API的简要介绍:
它是一个轻量级的框架,使用所有可用的CPU核在一台计算机上工作
它具有以下特点:
- 自动并行参数空间探测
- 灵活且基于配置的结果聚合
- 只关注关键逻辑的编程模型
- 可靠的自动中断恢复
和公用事业:
- 动态和可克隆的网络结构
- 与Gnuplot的集成
- 基于通用网络模型的网络生成
- DelimiterDerander:一个复杂的阅读器,可以像数据库一样浏览CSV(逗号分隔值)文件
- 基于Mersenne-Twister算法的快速随机数发生器
- ImageJ项目中的集成曲线过滤器
嗯。。。那不是地图还原,那只是一个裸体的执行者。你想要的是简单的。循环将工作映射为任务
任务,并可用于合并或减少单个结果。我意识到我可以编写自己的map/reduce框架,但我不想这样做。它非常复杂,需要使用现成的通用解决方案。@skaffman,您需要比最简单的解决方案更复杂但比完整解决方案更简单的解决方案。金锁解决方案也许你可以说你的最低要求是什么。介于“执行者”和“hadoop”之间。我开着
int heaviestBlueBlock =
blocks.filter(b -> b.getColor() == BLUE)
.map(Block::getWeight)
.reduce(0, Integer::max);