【问题标题】:Sigar UnsatisfiedLinkError on Apache Storm topologyApache Storm 拓扑上的 Sigar UnsatisfiedLinkError
【发布时间】:2019-08-04 08:37:30
【问题描述】:

我正在配置为单个本地集群的机器上部署 Storm 拓扑。我已将conf/storm.yaml 配置为使用storm.scheduler: "org.apache.storm.scheduler.resource.ResourceAwareScheduler"。拓扑部署成功。但是,我收到来自Sigar 库的错误,它说无法获取进程ID 以在我的拓扑中使用CPUMetric。这是获取指标的拓扑配置:

config.registerMetricsConsumer(LoggingMetricsConsumer.class);
Map<String, String> workerMetrics = new HashMap<String, String>();
workerMetrics.put("CPU", "org.apache.storm.metrics.sigar.CPUMetric");
config.put(Config.TOPOLOGY_WORKER_METRICS, workerMetrics);

我已经将sigar-1.6.4.jarstorm-metrics-1.2.2.jar 库复制到apache-storm/lib 文件夹。这是错误:

2019-03-13 16:24:45.920 o.a.s.util Thread-10-__system-executor[-1 -1] [ERROR] Async loop died!
java.lang.UnsatisfiedLinkError: org.hyperic.sigar.Sigar.getPid()J
    at org.hyperic.sigar.Sigar.getPid(Native Method) ~[sigar-1.6.4.jar:?]
    at org.apache.storm.metrics.sigar.CPUMetric.<init>(CPUMetric.java:38) ~[storm-metrics-1.2.2.jar:1.2.2]
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[?:1.8.0_191]
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[?:1.8.0_191]
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[?:1.8.0_191]
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423) ~[?:1.8.0_191]
    at java.lang.Class.newInstance(Class.java:442) ~[?:1.8.0_191]
    at org.apache.storm.utils.Utils.newInstanceImpl(Utils.java:198) ~[storm-core-1.2.2.jar:1.2.2]
    at org.apache.storm.utils.Utils.newInstance(Utils.java:192) ~[storm-core-1.2.2.jar:1.2.2]
    at org.apache.storm.utils.Utils.newInstance(Utils.java:185) ~[storm-core-1.2.2.jar:1.2.2]
    at org.apache.storm.metric.SystemBolt.registerMetrics(SystemBolt.java:150) ~[storm-core-1.2.2.jar:1.2.2]
    at org.apache.storm.metric.SystemBolt.prepare(SystemBolt.java:143) ~[storm-core-1.2.2.jar:1.2.2]
    at org.apache.storm.daemon.executor$fn__10795$fn__10808.invoke(executor.clj:803) ~[storm-core-1.2.2.jar:1.2.2]
    at org.apache.storm.util$async_loop$fn__553.invoke(util.clj:482) [storm-core-1.2.2.jar:1.2.2]
    at clojure.lang.AFn.run(AFn.java:22) [clojure-1.7.0.jar:?]
    at java.lang.Thread.run(Thread.java:748) [?:1.8.0_191]

【问题讨论】:

    标签: java apache-storm sigar


    【解决方案1】:

    由于某种原因,Sigar 的本机部分不在 worker 的类路径中。本机文件位于资源目​​录的storm-metrics.jar 中。

    为什么要手动将storm-metrics 复制到storm/lib?确保存在拓扑依赖关系的最简单方法是使用 maven-shade-plugin 制作一个 fat jar。看看storm-starter是如何做到的https://github.com/apache/storm/blob/master/examples/storm-starter/pom.xml#L153

    我会检查工作进程的日志以验证storm-metrics.jar 文件是否在工作进程的类路径中。工作人员在启动期间很早就打印其类路径,主管也是如此。

    您提到您在单个本地集群上运行。我不确定您是指 Storm 的单节点安装,还是使用 LocalCluster(或等效的 storm local 命令)。如果您的意思是使用 LocalCluster,则需要添加 Storm-metrics 作为拓扑项目的依赖项。

    【讨论】:

    • 我使用这个命令来部署我的风暴作业:apache-storm-1.2.2/bin/storm jar /home/felipe/eclipse-workspace/explore-storm/target/explore-storm.jar org.sense.storm.App。我猜它是一个单节点 Apache Storm 集群,因为我是基于此:medium.com/real-time-streaming/…
    • 好的,该指南很好,应该可以使用。我认为您应该检查工作日志以查看storm-metrics 是否在工作类路径上。或者,您可以使用 fat jar 并添加 Storm-metrics 作为依赖项。
    • 当我打开worker.log 文件时,有一行2019-03-14 13:20:20.978 o.a.s.m.StormMetricRegistry main [INFO] Starting metrics reporters...,我也在那里找到storm-metrics-1.2.2.jar。当我使用 Extract required libraries into generated JAR 在 Eclipse IDE 上构建我的 Jar 文件时,日志文件会抱怨,因为有多个 default.yaml 文件。我还从pom.xml 文件中删除了&lt;scope&gt;provided&lt;/scope&gt;。没有取得任何结果...
    • StormMetricRegistry 日志行是storm-core 的一部分,没关系。我不确定 Eclipse 是如何做事的,但可以考虑使用 Maven 来构建拓扑。它抱怨多个 defaults.yaml 文件的原因是您将storm-core捆绑到您的jar中。确保它在 pom.xml 中提供了范围。 Storm-metrics 应该是编译范围。
    • 完美。有效。谢谢 =) 这是我的 pom.xml github.com/felipegutierrez/explore-storm/blob/master/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 2018-10-17
    • 2019-06-25
    • 2016-04-16
    • 2021-06-02
    相关资源
    最近更新 更多