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);
}
}