Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 图上Hadoop作业的结构_Algorithm_Hadoop_Graph - Fatal编程技术网

Algorithm 图上Hadoop作业的结构

Algorithm 图上Hadoop作业的结构,algorithm,hadoop,graph,Algorithm,Hadoop,Graph,我有一个算法,必须在一个可以并行化的图形上执行大量计算,我想我可以使用Hadoop将这些计算分配给映射器,然后在还原器上恢复结果,但我正在努力,并开始认为也许我使用Hadoop是为了一些我不应该使用Hadoop的东西(你知道,当你有锤子时,一切看起来都像钉子) 您可以在上查看该算法的ruby版本,但排序如下: 我们有一个图表 我们得到一个配置(节点和边的列表),这将帮助我们控制整个图形 我们去掉这个配置的一个(随机)节点,得到一系列可选配置,然后我们得到其中一个配置(随机)作为所选配置 对于每

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

您可以在上查看该算法的ruby版本,但排序如下:

  • 我们有一个图表
  • 我们得到一个配置(节点和边的列表),这将帮助我们控制整个图形
  • 我们去掉这个配置的一个(随机)节点,得到一系列可选配置,然后我们得到其中一个配置(随机)作为所选配置
  • 对于每个节点,我们计算它所选择的配置数量
第三步必须重复很多次(与图中的节点数成比例),因此我认为它非常适合映射步骤。然后,计数任务将是一个Reducer步骤(事实上,LongSumReducer类非常适合)

问题来自前两个步骤。我想我可以创建图形并在自定义InputFormat类上获得配置,这样我的自定义阅读器就可以向每个映射器发送一个随机节点

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

当JobSubmiter试图编写拆分时,问题就来了,因为它们不是真正的文件拆分,我会遇到一些错误,因为(我认为)它试图创建对我的结构毫无意义的拆分文件

为了检查我是否可以创建图形等,我创建了一个简化版的algorim,它可以:

  • 我们有一个图表。(输入格式和读取器)
  • 我们得到图形的每一条边
  • 对于每个节点,我们计算它有多少条边(减速器)
您可以在以下位置查看此简化版本:

问题是,当我运行作业(使用两个参数,图形文件的路径和输出文件夹的路径)时,我得到一个错误:

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做到这一点吗?还是我想用锤子来拧

谢谢


编辑:在我继续工作的过程中,我创建(并链接)了一个标记,这样你就可以在我发布问题时看到代码了

尽管我没有合适的方法,但我已经找到了解决方法

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

流程将是:

  • 解析图形
  • 获取第一个配置
  • 将此配置保留在文件上
  • 获取节点的随机列表,并将它们保存到另一个文件中
  • 将此文件馈送到常规Hadoop作业
然后,每个映射器接收一行临时随机节点文件(随机节点),并解析图形文件和配置文件,以便执行所需的操作

您可以查看代码的最新版本,特别是Job类

由于我没有Hadoop方面的经验,我不确定这是正确的方法还是一个糟糕的解决方法,但我认为这个答案可以帮助其他人解决同样的问题