【问题标题】:Giraph Job running in local mode always始终以本地模式运行的 Giraph 作业
【发布时间】:2016-09-02 08:29:23
【问题描述】:

我在 Hadoop 2.6.0 上运行 Giraph 1.1.0。 mapredsite.xml 看起来像这样

<configuration>

<property>
  <name>mapreduce.framework.name</name>
  <value>yarn</value>
  <description>The runtime framework for executing MapReduce jobs. Can be one of
    local, classic or yarn.</description>
</property>

<property>
<name>mapreduce.map.memory.mb</name>
<value>4096</value>
<name>mapreduce.reduce.memory.mb</name>
<value>8192</value>
</property>
<property>
<name>mapreduce.map.java.opts</name>
<value>-Xmx3072m</value>
<name>mapreduce.reduce.java.opts</name>
<value>-Xmx6144m</value>
</property>
<property>
<name>mapred.tasktracker.map.tasks.maximum</name>
<value>4</value>
</property>
<property>
<name>mapred.map.tasks</name>
<value>4</value>
</property>
</configuration>

giraph-site.xml 看起来像这样

<configuration>
<property>
        <name>giraph.SplitMasterWorker</name>
        <value>true</value>
</property>
<property>
        <name>giraph.logLevel</name>
        <value>error</value>
</property>
</configuration>

我不想在本地模式下运行作业。我还将环境变量 MAPRED_HOME 设置为 HADOOP_HOME。这是运行程序的命令。

hadoop jar myjar.jar hu.elte.inf.mbalassi.msc.giraph.betweenness.BetweennessComputation /user/$USER/inputbc/inputgraph.txt /user/$USER/outputBC 1.0 1

当我运行此代码计算图中顶点的中介中心性时,我得到以下异常

Exception in thread "main" java.lang.IllegalArgumentException: checkLocalJobRunnerConfiguration: When using LocalJobRunner, you cannot run in split master / worker mode since there is only 1 task at a time!
        at org.apache.giraph.job.GiraphJob.checkLocalJobRunnerConfiguration(GiraphJob.java:168)
        at org.apache.giraph.job.GiraphJob.run(GiraphJob.java:236)
        at hu.elte.inf.mbalassi.msc.giraph.betweenness.BetweennessComputation.runMain(BetweennessComputation.java:214)
        at hu.elte.inf.mbalassi.msc.giraph.betweenness.BetweennessComputation.main(BetweennessComputation.java:218)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:497)
        at org.apache.hadoop.util.RunJar.run(RunJar.java:221)
        at org.apache.hadoop.util.RunJar.main(RunJar.java:136)

我应该怎么做才能确保作业不在本地模式下运行?

【问题讨论】:

  • 当我运行示例 SimpleShortestPathsComputation 时,奇怪的是我没有得到这个异常。作业不在本地模式下运行。

标签: hadoop mapreduce illegalargumentexception giraph


【解决方案1】:

几天前我遇到了这个问题。幸运的是我通过这样做解决了它。

修改配置文件mapred-site.xml,确保属性'mapreduce.framework.name'的值为'yarn'并添加属性'mapreduce.jobtracker.address',如果有值为'yarn'不是。

mapred-site.xml 如下所示:

<configuration>
   <property>
     <name>mapreduce.framework.name</name>
     <value>yarn</value>
   </property>
   <property>
     <name>mapreduce.jobtracker.address</name>
     <value>yarn</value>
   </property>
</configuration>

修改mapred-site.xml后重启hadoop。然后运行你的程序,设置'-w'后面的值大于1,'giraph.SplitMasterWorker'的值为'true'。它可能会工作。

至于问题的原因,我只是引用某人的说法: 这些属性是为单节点执行而设计的,必须 在节点集群中执行事物时发生更改。在这种情况下, jobtracker 必须指向将执行的机器之一 NodeManager 守护进程(Hadoop 从属)。至于框架,应该是 改为“纱线”。

【讨论】:

    【解决方案2】:

    我们可以看到,在LocalJobRunner 中的配置检查失败的堆栈跟踪中,这有点误导,因为它使我们假设我们在本地模型中运行。您已经找到了负责任的配置选项:giraph.SplitMasterWorker 但是在您的情况下,您将其设置为true。但是,在带有最后一个参数1 的命令行上,您指定只使用一个工作人员。因此框架决定你必须在本地模式下运行。作为解决方案,您有两种选择:

    • giraph.SplitMasterWorker 设置为false,尽管您在集群上运行。
    • 通过将最后一个参数更改为命令行调用来增加工作人员的数量。

      hadoop jar myjar.jar hu.elte.inf.mbalassi.msc.giraph.betweenness.BetweennessComputation /user/$USER/inputbc/inputgraph.txt /user/$USER/outputBC 1.0 4

    有关本地模式问题的详细信息,请参阅my other answer at SO (Apache Giraph master / worker mode)

    【讨论】:

    • 当我尝试将工人数量增加到 4 时,我得到以下异常 _ 使用 LocalJobRunner 时,必须只有一个工人,因为一次只有 1 个任务!_
    • 当我运行示例 SimpleShortestPathsComputation 时,奇怪的是我没有得到这个异常。该作业未在本地模式下运行
    【解决方案3】:

    如果您想从节点中拆分主节点,您可以使用:

    -ca giraph.SplitMasterWorker=true

    还可以指定您可以使用的工人数量:

    -w #

    其中“#”是您要使用的工人数。

    【讨论】:

    • 在我的 giraph-site.xml 中,giraph.SplitMasterWorker 已经设置为 true。关于worker的数量,命令中的第四个参数实际上指定了worker的数量,在这种情况下为1。
    • 这个答案与问题无关。 OP 已经具有您仅在配置文件中提到的确切配置。工人人数的规定是错误的。代码见:github.com/mbalassi/msc-thesis/blob/master/src/main/java/hu/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多