Sigar UnsatisfiedLinkError в топологии Apache Storm - PullRequest
0 голосов
/ 13 марта 2019

Я развертываю топологию Storm на моей машине, настроенной как один локальный кластер. Я настроил conf/storm.yaml для использования storm.scheduler: "org.apache.storm.scheduler.resource.ResourceAwareScheduler". Топология успешно развернута. Однако я получаю сообщение об ошибке из библиотеки Sigar, в котором говорится, что невозможно получить идентификатор процесса для использования 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]

1 Ответ

1 голос
/ 13 марта 2019

По какой-то причине родная часть Sigar не находится на пути к классу рабочего. Собственные файлы находятся внутри storm-metrics.jar в каталоге ресурсов.

Почему вы вручную копируете метрики шторма в шторм / lib? Самый простой способ убедиться, что ваши топологические зависимости присутствуют, - создать толстый файл с помощью плагина maven-shade-plugin. Посмотрите, как это делает шторм-стартер https://github.com/apache/storm/blob/master/examples/storm-starter/pom.xml#L153.

Я бы проверил журнал работника, чтобы убедиться, что файл storm-metrics.jar находится в пути к классам рабочего процесса. Рабочий печатает свой путь к классу очень рано во время загрузки, как и руководитель.

Вы упоминаете, что работаете в одном локальном кластере. Я не уверен, имеете ли вы в виду установку Storm с одним узлом или если вы используете LocalCluster (или, что то же самое, команду storm local). Если вы имеете в виду, что используете LocalCluster, вам нужно добавить метрики шторма как зависимость вашего проекта топологии.

...