我有一个算法必须对可以并行化的图表执行大量计算,我虽然可以使用Hadoop将这些计算分配给映射器,然后恢复结果还原器,但我很挣扎,并开始认为,也许我正在使用Hadoop的东西,我不应该使用Hadoop(你知道,当你有一把锤子一切看起来像钉子)。通过图表Hadoop作业的结构
你可以看看在https://gist.github.com/brenes/79d980708aae463079b8算法的红宝石版本,但在排序,它是这样的:
- 我们有一个图表。
- 我们得到一个配置(节点和边的列表),它可以帮助我们控制整个图。
- 我们摆脱了这个配置中的一个(随机)节点并获得了一系列替代配置。然后我们得到其中一种配置(随机)作为选择的配置。
- 对于每个节点,我们指望它多少选择的配置是英寸
第三步必须重复很多次(正比于图中的节点的数量),所以我虽然它会完美适合Map步骤。然后,计数任务将是一个Reducer步骤(实际上,LongSumReducer类完全适合)。
问题出现了两个第一步。我以为我可以创建图形并获取自定义InputFormat类的配置,因此我的自定义Reader可以将随机节点发送给每个映射器。
这样,输入并不是真正基于在HDFS上共享的文件,因为读取图形(这将是我的输入文件)仅由主节点执行,映射器将接收所有内容。
问题出现在JobSubmitter尝试编写拆分时,因为它们实际上并不是文件拆分,我得到一些错误,因为(我认为)它试图创建对我的结构没有意义的拆分文件。
只是为了检查,我可以创建图形,等等,我创建了一个确实的algorim的简化版本:
- 我们有一个图表。 (InputFormat和Reader)
- 我们得到图的每个边。 (映射)
- 对于每个节点,我们指望有多少边缘具有(减速)
您可以在https://github.com/wild-fire/controllability-samping-algorithm/tree/stack-overflow-30151672
在这个简化版本看看问题是,当我运行作业(有两个参数,路径到图形文件和路径的输出文件夹),我得到一个错误:
Exception in thread "main" java.lang.NullPointerException
at org.apache.hadoop.mapreduce.split.JobSplitWriter.writeNewSplits(JobSplitWriter.java:132)
at org.apache.hadoop.mapreduce.split.JobSplitWriter.createSplitFiles(JobSplitWriter.java:79)
at org.apache.hadoop.mapreduce.JobSubmitter.writeNewSplits(JobSubmitter.java:603)
at org.apache.hadoop.mapreduce.JobSubmitter.writeSplits(JobSubmitter.java:614)
at org.apache.hadoop.mapreduce.JobSubmitter.submitJobInternal(JobSubmitter.java:492)
at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1296)
at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1293)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:415)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1628)
at org.apache.hadoop.mapreduce.Job.submit(Job.java:1293)
at org.apache.hadoop.mapreduce.Job.waitForCompletion(Job.java:1314)
at jobs.SamplingAlgorithm.main(SamplingAlgorithm.java:29)
我一直在寻找关于非文件输入拆分,但只有我发现事情的教程解释文件输入分裂,所以我开始怀疑,我可以使用Hadoop来做到这一点吗?还是我想用锤子拧?
谢谢!
编辑:由于我坚持工作,我创建(和链接)标签,所以你可以看到代码我张贴的问题