java - 在 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 项目以包含这个类?
对此的任何帮助将不胜感激。
解决方案
我终于找到了问题所在。两者之间有区别:
storm.scheduler: “org.apache.storm.scheduler.resource.ResourceAwareScheduler”
和
storm.scheduler: "org.apache.storm.scheduler.resource.ResourceAwareScheduler"
即使是来自 StackOverflow 的代码突出显示也应该对我有所帮助。我觉得我好笨。这是一个温和的提醒,即使来自官方文档的复制粘贴也是不好的!希望这对其他兄弟有所帮助。
推荐阅读
- laravel - 如何在 laravel 护照中创建登录 api 而无需注册 api 但创建令牌并将其存储在数据库中应该存在于登录 api 中
- microservices - 需要防御带有 CosmosDB 的事件溯源架构的古怪挑战
- reactjs - 在 AWS ampify 中部署时,页面在提交后重定向到 index.html
- javascript - 如何在javascript中创建转换构造函数?
- python - 使用 SQLite 插入命令时解决“无法识别的令牌”错误
- php - 成功连接到数据库后,PhP 代码将无法正确分配
- angular - 无法以正确的路径显示上传的图像
- listview - 在listview xamarin表单中滚动时图像消失
- python - 无法通过在某些搜索框中使用主题标签来生成结果
- ios - 带有 DocumentBrowserView 的 AVPlayer