jjzjj

algorithm - 图上的 Hadoop 作业结构

coder 2024-01-06 原文

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

您可以在 https://gist.github.com/brenes/79d980708aae463079b8 查看该算法的 ruby​​ 版本但是,在某种程度上,它是这样的:

  • 我们有一个图表。
  • 我们得到一个配置(节点和边的列表)来帮助我们控制整个图。
  • 我们摆脱了这种配置的一个(随机)节点,并获得了一系列替代配置。然后我们得到这些配置之一(随机)作为选择的配置。
  • 对于每个节点,我们计算它有多少个选择的配置。

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

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

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

当 JobSubmitter 尝试写入拆分时,问题就来了,因为它们并不是真正的文件拆分,而且我遇到了一些错误,因为(我认为)它试图创建对我的结构没有意义的拆分文件。

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

  • 我们有一个图表。 (输入格式和阅读器)
  • 我们得到图的每条边。 (映射器)
  • 对于每个节点,我们计算它有多少条边(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 做到这一点吗?还是我想用锤子拧螺丝?

谢谢!

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

最佳答案

虽然我没有合适的方法来做到这一点,但我找到了解决方法。

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

流程是:

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

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

你可以看看最后一版的代码: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 的经验,所以我不确定这是正确的方法还是只是一个糟糕的解决方法,但我认为这个答案可以帮助其他人解决同样的问题。

关于algorithm - 图上的 Hadoop 作业结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30151672/

有关algorithm - 图上的 Hadoop 作业结构的更多相关文章

  1. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

    我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

  2. ruby-on-rails - date_field_tag,如何设置默认日期? [ rails 上的 ruby ] - 2

    我想设置一个默认日期,例如实际日期,我该如何设置?还有如何在组合框中设置默认值顺便问一下,date_field_tag和date_field之间有什么区别? 最佳答案 试试这个:将默认日期作为第二个参数传递。youcorrectlysetthedefaultvalueofcomboboxasshowninyourquestion. 关于ruby-on-rails-date_field_tag,如何设置默认日期?[rails上的ruby],我们在StackOverflow上找到一个类似的问

  3. ruby-on-rails - openshift 上的 rails 控制台 - 2

    我将我的Rails应用程序部署到OpenShift,它运行良好,但我无法在生产服务器上运行“Rails控制台”。它给了我这个错误。我该如何解决这个问题?我尝试更新ruby​​gems,但它也给出了权限被拒绝的错误,我也无法做到。railsc错误:Warning:You'reusingRubygems1.8.24withSpring.UpgradetoatleastRubygems2.1.0andrun`gempristine--all`forbetterstartupperformance./opt/rh/ruby193/root/usr/share/rubygems/rubygems

  4. ruby-on-rails - 相关表上的范围为 "WHERE ... LIKE" - 2

    我正在尝试从Postgresql表(table1)中获取数据,该表由另一个相关表(property)的字段(table2)过滤。在纯SQL中,我会这样编写查询:SELECT*FROMtable1JOINtable2USING(table2_id)WHEREtable2.propertyLIKE'query%'这工作正常:scope:my_scope,->(query){includes(:table2).where("table2.property":query)}但我真正需要的是使用LIKE运算符进行过滤,而不是严格相等。然而,这是行不通的:scope:my_scope,->(que

  5. ruby - 是否有用于序列化和反序列化各种格式的对象层次结构的模式? - 2

    给定一个复杂的对象层次结构,幸运的是它不包含循环引用,我如何实现支持各种格式的序列化?我不是来讨论实际实现的。相反,我正在寻找可能会派上用场的设计模式提示。更准确地说:我正在使用Ruby,我想解析XML和JSON数据以构建复杂的对象层次结构。此外,应该可以将该层次结构序列化为JSON、XML和可能的HTML。我可以为此使用Builder模式吗?在任何提到的情况下,我都有某种结构化数据-无论是在内存中还是文本中-我想用它来构建其他东西。我认为将序列化逻辑与实际业务逻辑分开会很好,这样我以后就可以轻松支持多种XML格式。 最佳答案 我最

  6. hadoop安装之保姆级教程(二)之YARN的配置 - 2

    1.1.1 YARN的介绍 为克服Hadoop1.0中HDFS和MapReduce存在的各种问题⽽提出的,针对Hadoop1.0中的MapReduce在扩展性和多框架⽀持⽅⾯的不⾜,提出了全新的资源管理框架YARN. ApacheYARN(YetanotherResourceNegotiator的缩写)是Hadoop集群的资源管理系统,负责为计算程序提供服务器计算资源,相当于⼀个分布式的操作系统平台,⽽MapReduce等计算程序则相当于运⾏于操作系统之上的应⽤程序。 YARN被引⼊Hadoop2,最初是为了改善MapReduce的实现,但是因为具有⾜够的通⽤性,同样可以⽀持其他的分布式计算模

  7. ruby-on-rails - 一般建议和推荐的文件夹结构 - Sinatra - 2

    您将如何构建一个简单的Sinatra应用程序?我正在制作,我希望该应用具有以下功能:“应用程序”更像是一个包含所有信息的管理仪表板。然后另一个应用程序将通过REST访问信息。我还没有创建仪表板,只是从数据库中获取东西session和身份验证(尚未实现)您可以上传图片,其他应用可以显示这些图片我已经使用RSpec创建了一个测试文件通过Prawn生成报告目前的设置是这样的:app.rbtest_app.rb因为我实际上只有应用程序和测试文件。到目前为止,我已经将Datamapper用于ORM,将SQLite用于数据库。这是我的第一个Ruby/Sinatra项目,所以欢迎任何和所有建议-我应

  8. ruby-on-rails - Ruby - 如何从 ruby​​ 上的 .pfx 文件中提取公钥、rsa 私钥和 CA key - 2

    我有一个.pfx格式的证书,我需要使用ruby​​提取公共(public)、私有(private)和CA证书。使用shell我可以这样做:#ExtractPublicKey(askforpassword)opensslpkcs12-infile.pfx-outfile_public.pem-clcerts-nokeys#ExtractCertificateAuthorityKey(askforpassword)opensslpkcs12-infile.pfx-outfile_ca.pem-cacerts-nokeys#ExtractPrivateKey(askforpassword)o

  9. ruby-on-rails - 在所有延迟的作业之前 Hook - 2

    是否可以在所有delayed_job任务之前运行一个方法?基本上,我们试图确保每个运行delayed_job的服务器都有我们代码的最新实例,所以我们想运行一个方法来在每个作业运行之前检查它。(我们已经有了“check”方法并在别处使用它。问题只是关于如何从delayed_job中调用它。) 最佳答案 现在有一种官方方法可以通过插件来做到这一点。这篇博文通过示例清楚地描述了如何执行此操作http://www.salsify.com/blog/delayed-jobs-callbacks-and-hooks-in-rails(本文中描述

  10. 带有 attr_accessor 的类上的 Ruby instance_eval - 2

    我了解instance_eval和class_eval之间的基本区别。我在玩弄时发现的是一些涉及attr_accessor的奇怪东西。这是一个例子:A=Class.newA.class_eval{attr_accessor:x}a=A.newa.x="x"a.x=>"x"#...expectedA.instance_eval{attr_accessor:y}A.y="y"=>NoMethodError:undefinedmethod`y='forA:Classa.y="y"=>"y"#WHATTT?这是怎么回事:instance_eval没有访问我们的A类(对象)然后它实际上将它添加到

随机推荐