一个基于图形的Hadoop作业结构

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

谢谢!

编辑:当我继续工作时,我创建了(并链接了)一个标签,这样您就可以在发布问题时看到代码。

1个回答

0

虽然我没有一个正确的方法来做到这一点,但我已经找到了一个解决方法。

我的解决方案是将第一步移出Hadoop流程,在Hadoop作业开始之前在我的Job类中执行它们。

流程如下:

  • 解析图形。
  • 获取第一个配置。
  • 将此配置持久化到文件中。
  • 获取节点的随机列表,并将其持久化到另一个文件中。
  • 将此文件提供给常规Hadoop作业。

然后,每个mapper都会接收临时随机节点文件(一个随机节点)的一行,并解析图形文件和配置文件,以执行所需的操作。

您可以查看代码的最新版本: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的经验,我不确定这是否是正确的方法,还是一个恶心的解决方法,但我认为这个答案可以帮助其他遇到同样问题的人。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接