我有一个算法必须在可以并行化的图形上执行大量计算,虽然我可以使用Hadoop将这些计算分配给映射器,然后在reducers上恢复结果,但我正在努力并且开始认为我可能正在使用Hadoop来做一些我不应该使用Hadoop的东西(你知道,当你有一把锤子时,一切看起来像钉子)。
您可以在https://gist.github.com/brenes/79d980708aae463079b8查看算法的ruby版本,但在排序方面,它是这样的:
第三步必须重复很多次(与图中的节点数成比例),所以我觉得它非常适合Map步骤。然后,计数任务将是一个Reducer步骤(事实上,LongSumReducer类完全适合)。
问题在于前两个步骤。我以为我可以创建图形并在自定义的InputFormat类上获得配置,因此我的自定义Reader可以向每个映射器发送一个随机节点。
这样,输入实际上不是基于通过HDFS共享的文件,因为读取图形(我的输入文件)只能由主节点执行,而映射器将接收所有内容。
当JobSubmitter尝试编写Splits时会出现问题,因为它们实际上不是文件拆分而且我得到一些错误,因为(我认为)它会尝试创建对我的结构毫无意义的splitFiles。
为了检查我是否可以创建图表等,我创建了algorim的简化版本:
您可以在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做到这一点吗?还是我想用锤子拧?
谢谢!
编辑:当我继续努力时,我创建(并链接)了一个标签,这样您就可以在我发布问题时看到代码
答案 0 :(得分:0)
虽然我没有正确的方法去做,但我找到了解决方法。
我的解决方案是在Hadoop流程之外移动第一步并在Hadoop作业开始之前在我的Job类上执行它们。
流程将是:
然后每个映射器接收一行临时随机节点文件(随机节点)并解析图形文件和配置文件,以便它执行所需的操作。
您可以查看代码的最新版本:https://github.com/wild-fire/controllability-samping-algorithm/tree/master,特别是Job类:https://github.com/wild-fire/controllability-samping-algorithm/blob/master/src/jobs/SamplingAlgorithm.java。
由于我没有Hadoop的经验,我不确定这是否是正确的方法,或者只是一个讨厌的解决方法,但我认为这个答案可以帮助其他人解决同样的问题。 / p>