我有一个算法需要在一个可以并行化的图上执行大量计算,我想使用Hadoop将这些计算分配给映射器,然后在规约器上恢复结果,但我正在努力尝试,开始认为可能我不应该使用Hadoop来做这件事(你知道,当你手里只有一把锤子,看起来所有东西都像钉子)。你可以查看这个算法的Ruby版本https://gist.github.com/brenes/79d980708aae463079b8,简而言之,它是这样的:
问题出在前两个步骤上。我认为我可以创建图并在自定义InputFormat类中获取配置,因此我的自定义Reader只需向每个Mapper发送一个随机节点。
这样,输入并不是基于在HDFS上共享的文件,因为读取图表(即我的输入文件)仅由主节点执行,而Mappers将接收所有内容。
当JobSubmitter尝试编写拆分时,问题就出现了,因为它们实际上不是文件拆分,并且我会因为(我认为)它尝试创建对我的结构毫无意义的拆分文件而出现一些错误。
只是为了检查我是否可以创建图表等,我创建了算法的简化版本,其中包括:
问题是,当我运行作业(带有两个参数,图形文件的路径和输出文件夹的路径)时,会出现错误:
- 我们有一个图。
- 我们获取一个配置(节点和边的列表),帮助我们控制整个图。
- 我们摆脱这个配置中的一个(随机)节点,并获得一系列备选配置。然后我们从其中选择一个配置(随机)作为所选配置。
- 对于每个节点,我们计算它出现在多少个所选配置中。
问题出在前两个步骤上。我认为我可以创建图并在自定义InputFormat类中获取配置,因此我的自定义Reader只需向每个Mapper发送一个随机节点。
这样,输入并不是基于在HDFS上共享的文件,因为读取图表(即我的输入文件)仅由主节点执行,而Mappers将接收所有内容。
当JobSubmitter尝试编写拆分时,问题就出现了,因为它们实际上不是文件拆分,并且我会因为(我认为)它尝试创建对我的结构毫无意义的拆分文件而出现一些错误。
只是为了检查我是否可以创建图表等,我创建了算法的简化版本,其中包括:
- 我们有一个图表。(InputFormat和Reader)
- 我们获取图表的每个边缘。(Mapper)
- 对于每个节点,我们计算它有多少条边缘(Reducer)
问题是,当我运行作业(带有两个参数,图形文件的路径和输出文件夹的路径)时,会出现错误:
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实现这个目标?或者我是在用锤子来拧螺丝吗?
谢谢!
编辑:当我继续工作时,我创建了(并链接了)一个标签,这样您就可以在发布问题时看到代码。