2

如何将参数传递给Application.javaclass ?就像我们如何(String[] args)在 java 中传递 main 方法一样?

找不到任何参考资料。有人可以分享这方面的知识吗?

非常感谢。

4

2 回答 2

2

您可以将参数作为配置传递。此配置将作为参数传递给 Application.java 中的 populateDAG() 方法。

配置为org.apache.hadoop.conf.Configuration。您可以将其指定为 xml。xml 语法请参考https://hadoop.apache.org/docs/r2.6.1/api/org/apache/hadoop/conf/Configuration.html

可以通过不同的方式指定属性:

  1. ~/.dt/dt-site.xml:默认情况下,apex cli 将查找此文件(~ 是您的主目录)。您应该将此文件用于环境中所有应用程序共有的属性。

  2. -confapex cli 上的选项:apex cli 上的启动命令提供-conf了指定属性的选项。您需要指定配置 xml 的路径。您应该将此文件用于特定于特定应用程序或特定于该应用程序启动的属性。

  3. -Dproperty-name=value:apex cli 上的启动命令提供 -D 选项来指定属性。您可以指定多个属性,例如 -Dproperty-name1=value1 -Dproperty-name2=value2 等。

指定运算符属性的语法如下:

<property>
      <name>dt.application.applicationName.operator.OperatorIdentifier.prop.property-name1</name>
      <value>value1</value>
</property>  

<property>
      <name>dt.application.applicationName.operator.OperatorIdentifier.prop.property-name2</name>
      <value>value2</value>
</property>  

OperatorIdentifier/name 是您在 populateDAG() 中用于 dag.addOperator() 的字符串标识符。

于 2016-06-16T05:57:57.447 回答
0

由于接受的答案仅详细描述了如何指定运算符属性或使用~/.dt/dt-site.xml或 Apex CLI,这里是一个简单的示例,如何指定您可以在Application.java(即在populateDag()方法中)使用的属性。

在文件中指定 XML 中的属性:resources/META-INF/properties.xml像这样:

<configuration>
  <!-- Specify some arbitrary app configs -->
  <property>
    <name>prop1</name>
    <value>val1</value>
  </property>
  <property>
    <name>prop2</name>
    <value>val2</value>
  </property>

  <!-- Specify some other configs, i.e. operator properties -->
  <property>
    <name>dt.application.applicationName.operator.OperatorIdentifier.prop.property-name1</name>
    <value>value1</value>
  </property>

</configuration>

然后在你的Application.java你可以得到这样的属性:

public class Application implements StreamingApplication
{

  @Override
  public void populateDAG(DAG dag, Configuration conf)
  {
    String prop1 = conf.get("prop1");
    String prop2 = conf.get("prop2", "defaultValue"); // when the property is not set in XML, a default can be used

    // populate your DAG here ...
  }
}

setup()如果您在方法执行之前需要运算符中的属性(例如在运算符的构造函数中),则此方法可能非常有用,而不是使用运算符属性。

于 2017-10-20T08:57:00.983 回答