图上hadoop作业的算法结构

xv8emn3q  于 2021-06-02  发布在  Hadoop
关注(0)|答案(1)|浏览(556)

我有一个算法,必须在一个可以并行化的图上执行大量的计算,我想我可以使用hadoop将这些计算分配给Map器,然后恢复还原器上的结果,但我正在努力,开始认为也许我使用hadoop是为了一些我不应该使用hadoop的东西(你知道,当你有锤子的时候,一切看起来都像钉子)。
你可以看看ruby版本的算法https://gist.github.com/brenes/79d980708aae463079b8 但是,在某种程度上,它是这样的:
我们有一个图表。
我们得到了一个配置(节点和边的列表),可以帮助我们控制整个图形。
我们去掉了这个配置的一个(随机)节点,得到了一系列可选配置。然后我们得到其中一个配置(随机)作为所选配置。
对于每个节点,我们计算它处于多少个选定的配置中。
第三步必须重复很多次(与图中的节点数成比例),所以我认为它非常适合Map步骤。然后,计数任务将是一个reducer步骤(实际上,longsumreducer类非常适合)。
问题来自两个第一步。我想我可以创建一个图并在一个定制的inputformat类上获得配置,这样我的定制阅读器就可以向每个Map器发送一个随机节点。
这样,输入实际上并不基于通过hdfs共享的文件,因为读取图形(这将是我的输入文件)仅由主节点执行,Map器将接收所有内容。
当jobsubmitter尝试写入拆分时会出现问题,因为它们不是真正的文件拆分,而且我会遇到一些错误,因为(我认为)它尝试创建对我的结构毫无意义的拆分文件。
为了检查我是否可以创建图表等,我创建了algorim的简化版本,它可以:
我们有一个图表(输入格式和读取器)
我们得到了图的每一条边(Map器)
对于每个节点,我们计算它有多少条边(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做到这一点吗?还是我想用锤子拧?
谢谢!
编辑:当我继续工作的时候,我创建了一个标签,这样你就可以在我发布问题的时候看到代码

qjp7pelc

qjp7pelc1#

虽然我没有一个合适的方法来做这件事,但我找到了一个解决办法。
我的解决方案是将第一步移到hadoop流之外,并在hadoop作业开始之前在我的作业类上执行它们。
流程为:
分析图表。
获取第一个配置。
将此配置保留在文件上。
获取节点的随机列表并将它们持久化到另一个文件中。
将此文件馈送到常规hadoop作业。
然后,每个Map器接收一行临时随机节点文件(随机节点),并解析图形文件和配置文件,以便执行所需的操作。
您可以查看代码的最新版本:https://github.com/wild-fire/controllability-samping-algorithm/tree/master 特别是职业课:https://github.com/wild-fire/controllability-samping-algorithm/blob/master/src/jobs/samplingalgorithm.java.
由于我没有hadoop方面的经验,我不确定这是正确的方法还是一个糟糕的解决方法,但我认为这个答案可以帮助其他人解决同样的问题。

相关问题