【问题标题】:How to pass -javagent /path/to/newrelic.jar parameter to the JVM running a HiveMetaStore server如何将 -javagent /path/to/newrelic.jar 参数传递给运行 HiveMetaStore 服务器的 JVM
【发布时间】:2023-04-04 03:18:01
【问题描述】:

我尝试让 Ne​​wrelic Java 代理在 docker 容器中运行,以监控在 docker 容器中运行的 HiveMetaStore 服务器。

为了在 JVM 启动期间启动 Newrelic 代理,我必须将-javaagent /path/to/newrelic.jar 标志传递给 JVM。

我试过了:

hive --service metastore  -javaagent  /path/to/newrelic.jar 

这在 HiveMetaStore 服务器代码中出现“无法识别的选项”而失败,它根本不应该结束。

hive 脚本调用 bin/ext/metastore.sh 脚本,该脚本依次调用

exec $HADOOP jar $JAR $CLASS "$@" 

所以我尝试修补这个调用:

exec $HADOOP -javaagent /path/to/newrelic.jar jar  $JAR $CLASS "$@" 

这也失败了。

然后我深入研究了 hadoop 脚本。最后libexec//hadoop_functions.sh中的函数hadoop_java_exec调用:

exec "${JAVA}" "-Dproc_${command}" ${HADOOP_OPTS} "${class}" "$@"

所以我修补了这段代码:

exec "${JAVA}" "-javaagent /path/to/newrelic.jar" "-Dproc_${command}" ${HADOOP_OPTS} "${class}" "$@"

这又失败了。

最后但并非最不重要的一点是,我认识到可以通过 HADOOP _OPTS(在 libexec/hadoop_functions.sh 中)传递 java 属性:

   function hadoop_finalize_hadoop_opts                        
    {                                               
     hadoop_translate_cygwin_path HADOOP_LOG_DIR
     hadoop_add_param HADOOP_OPTS hadoop.log.dir "-Dhadoop.log.dir=${HADOOP_LOG_DIR}"
     hadoop_add_param HADOOP_OPTS hadoop.log.file "-Dhadoop.log.file=${HADOOP_LOGFILE}"
     …
    }

但我不知道如何使用这种机制传递 -javaagent:/path/to/newrelic.jar。

有没有人曾经尝试过这个并且可以提供帮助?

如果这是一个愚蠢的问题,我深表歉意。预先感谢,Ute

【问题讨论】:

  • 你好,你可以试试这样,看看它是否有效 exec $HADOOP jar $JAR $CLASS -javaagent /path/to/newrelic.jar "$@"
  • discuss.newrelic.com 社区会更好地回答这个问题
  • 您好 Parvaz,我尝试了您的建议。看起来 -javaagent 参数传递了 Hadoop 代码,然后在 HiveMetaStore 代码中结束,并带有以下错误消息:Unrecognized option: -javaagent:/opt/newrelic-agent-5.10.0/newrelic.jar
  • agrument 不应该传递给 HiveMetaStore 代码,而是传递给 JVM 以启动 NewRelic Agent。
  • Salman,我刚刚将问题发布到了 Discussion.newrelic.com 社区。谢谢指点。

标签: java hadoop hive newrelic


【解决方案1】:
function hadoop_finalize_hadoop_opts                        
    {                                               
     hadoop_translate_cygwin_path HADOOP_LOG_DIR
     hadoop_add_param HADOOP_OPTS hadoop.log.dir "-Dhadoop.log.dir=${HADOOP_LOG_DIR}"
     hadoop_add_param HADOOP_OPTS hadoop.log.file "-Dhadoop.log.file=${HADOOP_LOGFILE}"
     …
     hadoop_add _param HADOOP_OPTS java.javaagent -javaagent:${NEWRELIC_AGENT_HOME}\/newrelic.jar
    }

添加最后一条语句以启动代理。我在容器中看到:

/usr/lib/jvm/default-jvm/bin/java -Dproc_jar -Dproc_metastore , … , NullAppender - javaagent:/opt/newrelic-agent-5.10.0/newrelic.jar   org.apache.hadoop.util.RunJar /opt/apache-hive-3.1.2-bin/lib/hive-metastore-3.1.2.jar org.apache.hadoop.hive.metastore.HiveMetaStore

我还不了解“NullAppender”,但至少代理现在似乎正在运行。

【讨论】:

    猜你喜欢
    • 2011-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 2022-08-19
    • 2015-11-26
    • 1970-01-01
    相关资源
    最近更新 更多