怎么建公司免费网站,电脑建立网站,多张图做网站背景,内蒙古网站建设云聚1、为什么 Flink 要做 Plugins#xff1a;解决依赖冲突的终极方案 在真实生产里#xff0c;依赖冲突几乎不可避免#xff1a; 不同云厂商 SDK 依赖不同版本的 HTTP client、Jackson、Netty……不同监控系统 reporter 依赖各自生态的库Connector/Format 未来也会引入更多第…1、为什么 Flink 要做 Plugins解决依赖冲突的终极方案在真实生产里依赖冲突几乎不可避免不同云厂商 SDK 依赖不同版本的 HTTP client、Jackson、Netty……不同监控系统 reporter 依赖各自生态的库Connector/Format 未来也会引入更多第三方依赖Flink 的插件机制核心目标就是严格隔离插件之间不能互相访问类允许冲突共存不同插件可以携带同名但不同版本的依赖库无需 relocationshade 重定位不用为了避免冲突去改包名、做 fat jar 的 relocation一句话插件把“依赖地狱”从系统 classpath 里赶了出去。2、插件隔离与目录结构一个插件一个 ClassLoader插件必须放在plugins/目录下每个插件一个子目录子目录名随便起子目录里可以放多个 jar。示例结构flink-dist ├── conf ├── lib ... └── plugins ├── s3 │ ├── aws-credential-provider.jar │ └── flink-s3-fs-hadoop.jar └── azure └── flink-azure-fs-hadoop.jar关键点每个插件目录都会创建自己的 ClassLoader插件之间完全隔离flink-s3-fs-hadoop与flink-azure-fs-hadoop即使依赖冲突也没关系插件 jar 可以带上自己的依赖而不用 relocation3、“白名单访问”与 SPI为什么不会出现两个 FileSystem 类插件隔离得这么狠那 Flink Runtime 怎么调用插件实现答案是SPIService Provider Interfaces 白名单包访问。3.1 白名单包插件可以访问 Flink lib/ 的部分包Flink 允许插件访问lib/中某些被 whitelist 的包。尤其重要的是所有必要的 SPI 都通过system classloader加载这确保任意时刻系统里只存在一个org.apache.flink.core.fs.FileSystem版本singleton requirement为什么必须 singletonRuntime 需要一个稳定的入口类型来与插件交互如果同名接口在不同 ClassLoader 下出现多个版本类型检查会直接炸典型ClassCastException / ServiceLoader 找不到实现3.2 ServiceLoader靠 META-INF/services 发现服务实现Flink 使用java.util.ServiceLoader发现插件服务实现因此你在打包尤其 shading时必须确保META-INF/services/*的服务声明文件被保留否则常见现象是jar 在那儿但 Flink 就是“看不见”你的实现。3.3 日志框架也被白名单了Flink 还 whitelist 了最常见的 logger 框架保证Flink core、插件、用户代码日志能统一输出不至于每个插件自己打一套日志体系4、FileSystem 插件实战必须放 plugins别放 libFlink 的所有文件系统都是可插拔的推荐也应该以插件方式使用。安装方法非常简单把对应 jar 从opt/拷贝到plugins/some-folder/启动 Flink 之前完成。例子mkdir./plugins/s3-fs-hadoopcp./opt/flink-s3-fs-hadoop-2.2.0.jar ./plugins/s3-fs-hadoop/4.1 重点避坑S3 文件系统不能放 lib/文档里非常关键的一句flink-s3-fs-presto和flink-s3-fs-hadoop只能作为插件使用因为它们已经移除了 relocations放到 libs/ 会导致系统故障所以请记住这条硬规则S3 FS jar 只能放 plugins放 lib 高概率炸集群。4.2 另一个避坑凭证 Provider 不再能从 lib/ 访问由于插件隔离更严格文件系统插件不能再访问lib/里的 credential providers需要的 provider jar 必须放到同一个插件目录里示例里也体现了这一点plugins/s3/ aws-credential-provider.jar flink-s3-fs-hadoop.jar实战建议只要你遇到“找不到某个 credentials provider 类”的 ClassNotFoundException第一反应就是是不是 provider jar 放错目录了放 lib 或者放另一个插件目录5、Metric Reporter 插件同样的插件化收益Flink 自带的 metric reporters 也支持作为插件使用。收益与 FileSystem 类似reporter 依赖可以独立携带避免与别的 reporter 或 connector 的依赖冲突升级/替换 reporter 更可控具体 reporter 配置项在 metrics 文档中6、一套“插件落地”的推荐规范为了让后续运维与排障更省心建议你们在集群里统一约定每个插件一个目录plugins/plugin-name/...目录名用“能力/厂商/组件”命名s3-fs-presto、azure-fs-hadoop、gs-fs-hadoop、oss-fs-hadoop所有该插件需要的依赖都跟着放同目录尤其 credential provider插件 jar 升级用“目录级替换”避免残留旧 jar7、常见问题速查你大概率会遇到的插件放了但不生效检查plugins/dir结构、jar 是否在启动前就位、以及META-INF/services是否被保留ClassNotFound / NoClassDefFoundError凭证类provider jar 是否放到了同一个插件目录而不是 lib/S3 FS 放 lib 后集群异常立刻移回 plugins并清理 lib 中的相关 jar日志不输出/重复绑定确认 logger 框架版本与 Flink 的 whitelist 兼容尽量别在插件里塞多套 logger 绑定