java - Apache Storm 拓扑上的 Sigar UnsatisfiedLinkError
问题描述
我正在配置为单个本地集群的机器上部署 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.jar
和storm-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]
解决方案
由于某种原因,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 作为拓扑项目的依赖项。
推荐阅读
- javascript - 添加在使用 javascript 加载网站时不需要可见的大部分 HTML 是否是一种不好的做法?
- pdf - Puppeteer PDF,页脚和内容在同一行?
- php - PHP中的数组比较和重新排序
- azure-ad-b2c - Azure Active Directory B2C - IE 问题
- r - caret::train 包中 type = 'prob' 参数的问题
- loops - ASP.Net Core MVC 更新模型
- typescript - 如何在单击按钮时在 nginx 中的多个页面中重定向
- react-native - React Native Production App 在异常时显示空白屏幕
- list - 从序言中的其他列表创建第二个列表
- flutter - 我正在尝试在 Flutter 中实现 mapbox_gl api。如何将 mapbox 访问令牌设置为系统变量或环境变量