【问题标题】:How to start Hadoop, Accumulo, and ZooKeeper from a java program?如何从 java 程序启动 Hadoop、Accumulo 和 ZooKeeper?
【发布时间】:2013-09-13 18:16:44
【问题描述】:

我正在尝试将 bash 脚本转换为 java 程序。在这个脚本中,我运行 Hadoop、Zookeeper 和 Accumulo 的启动脚本:

/hadoop/bin/start_all.sh  
/zookeeper/bin/zkServer.sh start  
/accumulo/bin/start_all.sh  

这在脚本中很简单。如果程序已经在运行,我可以再次调用这些启动脚本没有问题,程序将简单地输出它们已经在运行以及它们的 pid。

我试图弄清楚是否有办法在 java 程序中执行此操作。 Hadoop/ZooKeeper/Accumulo API 中是否有一些隐藏命令,我可以在其中运行 Class.run(configs),它会启动或尝试启动 Hadoop/ZooKeeper/Accumulo?

我的下一步是我可能可以使用 jsch 来运行 ssh 命令,但这似乎并没有真正将 bash 脚本抛在后面。

编辑:executing hadoop example jar files from java 在这个问题中,提问者正在使用运行时执行启动命令。这是启动 Hadoop 的合适方式吗?如果有要使用的命令,我宁愿使用原生 Hadoop API。

【问题讨论】:

  • 我不禁想知道为什么...介意解释一下?
  • @DonaldMiner 我正在编写一个程序,使非技术人员可以轻松启动这些程序。
  • Cloudera 经理/Ambari?木偶?这里似乎有些不对劲……非技术人员可能不应该启动和停止 hadoop 服务。
  • @DonaldMiner 它更适合单节点实例封闭演示。最终,管理可能会由您提到的服务之一运行。感谢您的健全性检查。 :)

标签: java bash hadoop apache-zookeeper accumulo


【解决方案1】:

在我看来,没有任何特定的 API 可以启动 Hadoop 服务或 Zookeeper 服务。 以org.apache.hadoop.hdfs.server.namenode.NameNode类为例

虽然您可以使用以上类中的main()来启动服务。

从脚本中,Hadoop 使用类似以下的内容来启动服务,使用参数调用不同类的 main() 函数。

nohup $_JAVA_EXEC -Dproc_$COMMAND $JAVA_HEAP_MAX $HADOOP_OPTS -classpath "$CLASSPATH" $CLASS "$@" > "$_HADOOP_DAEMON_OUT" 2>&1 < /dev/null

其中,CLASS = org.apache.hadoop.hdfs.server.namenode.NameNode 其他的不言自明。

【讨论】:

  • 实际上,我想要一个可以通过 Java 程序运行的解决方案,我已经有了可以在脚本中正常运行的代码。这看起来不像是你会投入到 Java 程序中的东西......我很抱歉在接受后退出。我错误地阅读了您的解决方案。
  • 好吧,我不介意,但据我所知,您没有特定的 API,正如我已经提到的那样。我的目的是展示 Hadoop 是如何实际启动名称节点的。因此,如果 Hadoop 本身使用上述类来启动它,可能没有其他方法。
  • 我也确实提到了 main() 方法,只是为您突出显示了它。从任何其他 Java 类你都可以,但问题是你需要参数。我可能在这里错了。
  • 你是对的。我想我将使用 RuntimeException 在我的 main() 中启动这些进程,使用典型的终端命令,因为我可以等待进程完成。感谢您的更新。
  • 刚刚添加了更多信息。我可能没有正确说明 main() 函数在 org.apache.hadoop.hdfs.server.namenode.NameNode 类中,Hadoop 使用它来启动传递参数的名称节点服务。
猜你喜欢
  • 1970-01-01
  • 2017-11-20
  • 1970-01-01
  • 2019-08-23
  • 1970-01-01
  • 2015-09-25
  • 1970-01-01
  • 1970-01-01
  • 2014-12-18
相关资源
最近更新 更多