2015-05-10 52 views
4

我有一个算法必须对可以并行化的图表执行大量计算,我虽然可以使用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来做到这一点吗?还是我想用锤子拧?

谢谢!

编辑:由于我坚持工作,我创建(和链接)标签,所以你可以看到代码我张贴的问题

回答

0

此刻虽然我没有一个适当的方式做到这一点我”我找到了一个解决方法。

我的解决方案是移动的第一步Hadoop的流量外,并执行他们对我的工作类Hadoop的工作开始之前。

的流动将是:

  • 解析图。
  • 获取第一配置。
  • 坚持上的文件此配置。
  • 获取节点的随机列表,并坚持他们到另一个文件。
  • 进这个文件到正规的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中的经验,我不知道这是做它,还是讨厌的解决方法正确的方法,但是我觉得这个答案可能HEL其他有同样的问题。