Flink on yarn 加载失败plugins失效问题解决
flink版本:1.13.6
1. 问题
flink 任务运行在yarn集群,plugins加载失效,导致通过扩展资源获取任务参数失效
2. 问题定位
- yarn容器的jar包及插件信息,jar包是正常上传
- 源码定位 加载plugins入口,TaskManagerRunner.class PluginUtils.createPluginManagerFromRootFolder 源码加载扩展资源参数入口TaskManagerRunner.class ExternalResourceUtils.createStaticExternalResourceInfoProviderFromConfig 日志信息 定位PluginConfig源码
3. 方案
重写覆盖集群的PluginConfig.java,优先从configurtaion获取
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0(the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.flink.core.plugin;import com.alibaba.fastjson.JSON;import org.apache.commons.lang3.StringUtils;import org.apache.flink.configuration.*;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import java.io.File;import java.nio.file.Path;import java.util.Arrays;import java.util.Objects;import java.util.Optional;
/** Stores the configuration for plugins mechanism. */
@SuppressWarnings("OptionalUsedAsFieldOrParameterType")
public class PluginConfig {
private static final Logger LOG = LoggerFactory.getLogger(PluginConfig.class);
private static final String PUPU_FLINK_PLUGINS_DIR ="flink_plugins_dir";
private final Optional<Path> pluginsPath;
private final String[] alwaysParentFirstPatterns;
private PluginConfig(Optional<Path> pluginsPath, String[] alwaysParentFirstPatterns){
pluginsPath.ifPresent(path -> LOG.info("pluginsPath: {}", path));
LOG.info("alwaysParentFirstPatterns: {}", Arrays.stream(alwaysParentFirstPatterns).toArray());
this.pluginsPath = pluginsPath;
this.alwaysParentFirstPatterns = alwaysParentFirstPatterns;}
public Optional<Path>getPluginsPath(){return pluginsPath;}
public String[]getAlwaysParentFirstPatterns(){return alwaysParentFirstPatterns;}
public static PluginConfig fromConfiguration(Configuration configuration){return new PluginConfig(
getPluginsDir(configuration).map(File::toPath),
CoreOptions.getPluginParentFirstLoaderPatterns(configuration));}
public static Optional<File> getPluginsDir(Configuration configuration){
String pluginsDir = configuration.get(ConfigOptions.key(PUPU_FLINK_PLUGINS_DIR).stringType().defaultValue(null));if(StringUtils.isBlank(pluginsDir)){
pluginsDir =
System.getenv()
.getOrDefault(
ConfigConstants.ENV_FLINK_PLUGINS_DIR,
ConfigConstants.DEFAULT_FLINK_PLUGINS_DIRS);}
File pluginsDirFile = new File(pluginsDir);if(!pluginsDirFile.isDirectory()){
LOG.warn("The plugins directory [{}] does not exist.", pluginsDirFile);return Optional.empty();}return Optional.of(pluginsDirFile);}}
本文转载自: https://blog.csdn.net/qq_27242695/article/details/134056372
版权归原作者 老鼠扛刀满街找猫@ 所有, 如有侵权,请联系我们删除。
版权归原作者 老鼠扛刀满街找猫@ 所有, 如有侵权,请联系我们删除。