首页 > 解决方案 > 在 Storm 2.1.0 中找不到 ResourceAwareScheduler

问题描述

我正在使用 Storm 2.1.0 并想使用Resource Aware Scheduler。我按照文档中的说明在我的conf/storm.yaml中添加了以下行:

storm.scheduler: “org.apache.storm.scheduler.resource.ResourceAwareScheduler”

但是当我执行它时崩溃,我可以在logs/nimbus.log./bin/storm nimbus中看到以下日志:

2020-06-25 16:02:09.962 o.a.s.d.n.Nimbus main [INFO] Using custom scheduler: “org.apache.storm.scheduler.resource.ResourceAwareScheduler”
2020-06-25 16:02:09.963 o.a.s.u.Utils main [ERROR] Received error in thread main.. terminating server...
java.lang.Error: java.lang.RuntimeException: java.lang.ClassNotFoundException: “org.apache.storm.scheduler.resource.ResourceAwareScheduler”
    at org.apache.storm.utils.Utils.handleUncaughtException(Utils.java:653) ~[storm-client-2.1.0.jar:2.1.0]
    at org.apache.storm.utils.Utils.handleUncaughtException(Utils.java:632) ~[storm-client-2.1.0.jar:2.1.0]
    at org.apache.storm.utils.Utils.lambda$createDefaultUncaughtExceptionHandler$2(Utils.java:1014) ~[storm-client-2.1.0.jar:2.1.0]
    at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:1057) [?:1.8.0_252]
    at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:1052) [?:1.8.0_252]
    at java.lang.Thread.dispatchUncaughtException(Thread.java:1959) [?:1.8.0_252]
Caused by: java.lang.RuntimeException: java.lang.ClassNotFoundException: “org.apache.storm.scheduler.resource.ResourceAwareScheduler”
    at org.apache.storm.utils.ReflectionUtils.newInstance(ReflectionUtils.java:48) ~[storm-client-2.1.0.jar:2.1.0]
    at org.apache.storm.daemon.nimbus.Nimbus.makeScheduler(Nimbus.java:658) ~[storm-server-2.1.0.jar:2.1.0]
    at org.apache.storm.daemon.nimbus.Nimbus.<init>(Nimbus.java:569) ~[storm-server-2.1.0.jar:2.1.0]
    at org.apache.storm.daemon.nimbus.Nimbus.<init>(Nimbus.java:474) ~[storm-server-2.1.0.jar:2.1.0]
    at org.apache.storm.daemon.nimbus.Nimbus.<init>(Nimbus.java:468) ~[storm-server-2.1.0.jar:2.1.0]
    at org.apache.storm.daemon.nimbus.Nimbus.launchServer(Nimbus.java:1307) ~[storm-server-2.1.0.jar:2.1.0]
    at org.apache.storm.daemon.nimbus.Nimbus.launch(Nimbus.java:1332) ~[storm-server-2.1.0.jar:2.1.0]
    at org.apache.storm.daemon.nimbus.Nimbus.main(Nimbus.java:1337) ~[storm-server-2.1.0.jar:2.1.0]
Caused by: java.lang.ClassNotFoundException: “org.apache.storm.scheduler.resource.ResourceAwareScheduler”
    at java.net.URLClassLoader.findClass(URLClassLoader.java:382) ~[?:1.8.0_252]
    at java.lang.ClassLoader.loadClass(ClassLoader.java:418) ~[?:1.8.0_252]
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:352) ~[?:1.8.0_252]
    at java.lang.ClassLoader.loadClass(ClassLoader.java:351) ~[?:1.8.0_252]
    at java.lang.Class.forName0(Native Method) ~[?:1.8.0_252]
    at java.lang.Class.forName(Class.java:264) ~[?:1.8.0_252]
    at org.apache.storm.utils.ReflectionUtils.newInstance(ReflectionUtils.java:46) ~[storm-client-2.1.0.jar:2.1.0]
    at org.apache.storm.daemon.nimbus.Nimbus.makeScheduler(Nimbus.java:658) ~[storm-server-2.1.0.jar:2.1.0]
    at org.apache.storm.daemon.nimbus.Nimbus.<init>(Nimbus.java:569) ~[storm-server-2.1.0.jar:2.1.0]
    at org.apache.storm.daemon.nimbus.Nimbus.<init>(Nimbus.java:474) ~[storm-server-2.1.0.jar:2.1.0]
    at org.apache.storm.daemon.nimbus.Nimbus.<init>(Nimbus.java:468) ~[storm-server-2.1.0.jar:2.1.0]
    at org.apache.storm.daemon.nimbus.Nimbus.launchServer(Nimbus.java:1307) ~[storm-server-2.1.0.jar:2.1.0]
    at org.apache.storm.daemon.nimbus.Nimbus.launch(Nimbus.java:1332) ~[storm-server-2.1.0.jar:2.1.0]
    at org.apache.storm.daemon.nimbus.Nimbus.main(Nimbus.java:1337) ~[storm-server-2.1.0.jar:2.1.0]

我知道没有找到该课程,但没想到会这样。我刚刚从他们的官方网站下载了最新版本的 Storm(二进制版本),我检查了源代码是否存在该类(确实存在),Zookeeper 已启动并运行,我按照给定的说明启用了这个调度程序。我可能忘记了什么,但我完全不知道是什么。

但无论如何,让我们继续这个调查。在Nimbus.java 中,它初始化调度程序:

private static IScheduler makeScheduler(Map<String, Object> conf, INimbus inimbus) {
    String schedClass = (String) conf.get(DaemonConfig.STORM_SCHEDULER);
    IScheduler scheduler = inimbus == null ? null : inimbus.getForcedScheduler();
    if (scheduler != null) {
        LOG.info("Using forced scheduler from INimbus {} {}", scheduler.getClass(), scheduler);
    } else if (schedClass != null) {
        LOG.info("Using custom scheduler: {}", schedClass);
        scheduler = ReflectionUtils.newInstance(schedClass);
    } else {
        LOG.info("Using default scheduler");
        scheduler = new DefaultScheduler();
    }
    return scheduler;
}

以下日志告诉我它正在尝试获取正确的调度程序:

... Nimbus main [INFO] Using custom scheduler: “org.apache.storm.scheduler.resource.ResourceAwareScheduler”

然后,它调用ReflectionUtils.newInstance()ReflectionUtils.java中实现:

public static <T> T newInstance(String klass) {
    try {
        return newInstance((Class<T>) Class.forName(klass));
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
}

似乎从这里引发了异常,因为它无法找到该类ResourceAwareScheduler。我仔细检查过,该类存在于给定位置。在这个阶段,我不得不承认它达到了我对 Java 的了解。我想在ReflectionUtils.java中手动导入这个类吗?它具有类的完整路径,所以我认为没有必要。我应该如何配置这个 Maven 项目以包含这个类?

对此的任何帮助将不胜感激。

标签: javamavenapache-storm

解决方案


我终于找到了问题所在。两者之间有区别:

storm.scheduler: “org.apache.storm.scheduler.resource.ResourceAwareScheduler”

storm.scheduler: "org.apache.storm.scheduler.resource.ResourceAwareScheduler"

即使是来自 StackOverflow 的代码突出显示也应该对我有所帮助。我觉得我好笨。这是一个温和的提醒,即使来自官方文档的复制粘贴也是不好的!希望这对其他兄弟有所帮助。


推荐阅读