一、目的
在尚硅谷学习用Flink配置状态后端的项目中,运行报错Exception in thread "main" java.lang.IllegalArgumentException: Can not create a Path from an empty string
二、Flink的状态后端(state backend)类型
(一)MemoryStateBackend
1、内存级的状态后端,会将键控状态作为内存中的对象进行管理,将它们存储在TaskManager的JVM堆上;2、而将 checkpoint 存储在 JobManager 的内存中。
(二)FsStateBackend
1、将checkpoint 存到远程的持久化文件系统(FileSystem)上。
2、而对于本地状态,跟 MemoryStateBackend 一样,也会存在 TaskManager 的 JVM 堆上。
(三)RocksDBStateBackend
1、将所有状态序列化后,存入本地的 RocksDB 中存储。
2、注意:RocksDB 的支持并不直接包含在 flink 中,需要引入依赖
三、报错详情
Exception in thread "main" java.lang.IllegalArgumentException: Can not create a Path from an empty string
at org.apache.flink.core.fs.Path.checkAndTrimPathArg(Path.java:168)
at org.apache.flink.core.fs.Path.<init>(Path.java:181)
at org.apache.flink.runtime.state.filesystem.FsStateBackend.<init>(FsStateBackend.java:140)
at cn.kgc.apitest.state.StateTest4_FaultTolerance.main(StateTest4_FaultTolerance.java:31)
四、报错原因
经查,无法从空字符串创建路径是因为状态后端配置的尚硅谷代码里
FsStateBackend和RocksDBStateBackend的参数为空,所以无法通过checkpoint
(一)尚硅谷代码
(二)本地代码
五、解决措施
(一)注释掉这两行代码
// env.setStateBackend( new FsStateBackend(""));
// env.setStateBackend( new RocksDBStateBackend(""));
(二)改好后运行项目
1、先运行IDEA项目
2、然后在XShell中输入数据
3、在IDEA中出现运行结果
运行成功,没有报错!
又解决了一个问题,日清日高!