图表上的Hadoop作业结构

时间:2015-05-10 12:55:06

标签: algorithm hadoop graph

我有一个算法必须在可以并行化的图形上执行大量计算,虽然我可以使用Hadoop将这些计算分配给映射器,然后在reducers上恢复结果,但我正在努力并且开始认为我可能正在使用Hadoop来做一些我不应该使用Hadoop的东西(你知道,当你有一把锤子时,一切看起来像钉子)。

您可以在https://gist.github.com/brenes/79d980708aae463079b8查看算法的ruby版本,但在排序方面,它是这样的:

  • 我们有一张图。
  • 我们得到一个配置(节点和边缘列表),可以帮助我们控制整个图形。
  • 我们摆脱了这种配置的一个(随机)节点,并获得了一系列替代配置。然后我们得到其中一个配置(随机)作为选择的配置。
  • 对于每个节点,我们计算它所选择的配置数量。

第三步必须重复很多次(与图中的节点数成比例),所以我觉得它非常适合Map步骤。然后,计数任务将是一个Reducer步骤(事实上,LongSumReducer类完全适合)。

问题在于前两个步骤。我以为我可以创建图形并在自定义的InputFormat类上获得配置,因此我的自定义Reader可以向每个映射器发送一个随机节点。

这样,输入实际上不是基于通过HDFS共享的文件,因为读取图形(我的输入文件)只能由主节点执行,而映射器将接收所有内容。

当JobSubmitter尝试编写Splits时会出现问题,因为它们实际上不是文件拆分而且我得到一些错误,因为(我认为)它会尝试创建对我的结构毫无意义的splitFiles。

为了检查我是否可以创建图表等,我创建了algorim的简化版本:

  • 我们有一个图表。 (输入格式和读者)
  • 我们得到了图的每个边缘。 (映射)
  • 对于每个节点,我们计算它有多少条边(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 :(得分:0)

虽然我没有正确的方法去做,但我找到了解决方法。

我的解决方案是在Hadoop流程之外移动第一步并在Hadoop作业开始之前在我的Job类上执行它们。

流程将是:

  • 解析图表。
  • 获取第一个配置。
  • 将此配置保留在文件中。
  • 获取一个随机的节点列表,并将它们保存到另一个文件中。
  • 将此文件提供给常规Hadoop作业。

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

您可以查看代码的最新版本: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>