Skip to content

Commit 6d965d5

Browse files
author
tangzhankun
authored
Merge pull request #2 from yeyuqiang/YARN-6507-decouple
decouple fpga framework from fpga plugin
2 parents b29c86e + 78db3af commit 6d965d5

File tree

8 files changed

+89
-92
lines changed

8 files changed

+89
-92
lines changed

hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/conf/YarnConfiguration.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1303,6 +1303,13 @@ public static boolean isAclEnabled(Configuration conf) {
13031303
public static final String NM_FPGA_RESOURCE_ENABLED =
13041304
NM_FPGA_RESOURCE_PREFIX + "enabled";
13051305

1306+
/**
1307+
* Settings for fpga vendor plugin
1308+
*/
1309+
@Private
1310+
public static final String NM_FPGA_PLUGIN_CLASS =
1311+
NM_PREFIX + "fpga.plugin.class";
1312+
13061313
/**
13071314
* FPGA as a resource is disabled by default.
13081315
**/

hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/util/resource/ResourceUtils.java

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -395,12 +395,9 @@ public static Map<String, ResourceInformation> getNodeResourceInformation(
395395
/**
396396
* Function to get the device allowed infomation. The value format should be comma separated majorNumber:minorNumber
397397
*
398-
* <property>
399-
* <name>yarn.nodemanager.resource-types.MCP.allowed</name>
400-
* <value>244:0,245:1</value>
401-
* </property>
398+
* @param conf
402399
* @return a map of resource type and allowed value string
403-
* */
400+
*/
404401
public static Map<String, String> getResourceTypeAllowedValue(Configuration conf) {
405402
Map<String, String> allowedDevices = new HashMap<>();
406403
for (Map.Entry<String, String> entry : conf) {

hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/resources/Fpga/AbstractFpgaPlugin.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121

2222
import org.apache.hadoop.classification.InterfaceAudience;
2323
import org.apache.hadoop.classification.InterfaceStability;
24-
import org.apache.hadoop.conf.Configuration;
2524

2625
import java.util.List;
2726

@@ -35,7 +34,7 @@
3534
@InterfaceStability.Unstable
3635
public interface AbstractFpgaPlugin {
3736

38-
boolean initPlugin(String s, Configuration configuration);
37+
boolean initPlugin();
3938

4039
String getExistingIPID(int major, int minor);
4140

@@ -46,7 +45,7 @@ public interface AbstractFpgaPlugin {
4645
* */
4746
String downloadIP(String id, String dstDir);
4847

49-
boolean configureIP(String ipPath, FpgaResourceAllocator.FpgaAllocation fpgaAllocations);
48+
boolean configureIP(String ipPath, List<String> addresses);
5049

51-
boolean cleanupFpgas(FpgaResourceAllocator.FpgaAllocation fpgaAllocations);
50+
boolean cleanupFpgas(List<String> address);
5251
}

hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/resources/Fpga/FpgaPluginChain.java

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,6 @@
1919

2020
package org.apache.hadoop.yarn.server.nodemanager.containermanager.linux.resources.Fpga;
2121

22-
import org.apache.hadoop.conf.Configuration;
23-
import org.apache.hadoop.yarn.server.nodemanager.containermanager.linux.resources.ResourceHandlerException;
24-
2522
import java.util.ArrayList;
2623
import java.util.HashMap;
2724
import java.util.List;
@@ -52,9 +49,9 @@ public List<AbstractFpgaPlugin> getPlugins() {
5249
return new ArrayList<>(plugins.values());
5350
}
5451

55-
public boolean initPlugin(String s, Configuration configuration) {
52+
public boolean initPlugin() {
5653
for (AbstractFpgaPlugin plugin : plugins.values()) {
57-
if (!plugin.initPlugin(s,configuration)) {
54+
if (!plugin.initPlugin()) {
5855
return false;
5956
}
6057
}

hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/resources/Fpga/FpgaResourceHandlerImpl.java

Lines changed: 33 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,16 +27,17 @@
2727
import org.apache.hadoop.classification.InterfaceStability;
2828
import org.apache.hadoop.conf.Configuration;
2929
import org.apache.hadoop.yarn.api.records.ContainerId;
30-
import org.apache.hadoop.yarn.api.records.Resource;
3130
import org.apache.hadoop.yarn.api.records.ResourceInformation;
3231
import org.apache.hadoop.yarn.conf.YarnConfiguration;
32+
import org.apache.hadoop.yarn.exceptions.YarnRuntimeException;
3333
import org.apache.hadoop.yarn.server.nodemanager.containermanager.container.Container;
3434
import org.apache.hadoop.yarn.server.nodemanager.containermanager.linux.privileged.PrivilegedOperation;
3535
import org.apache.hadoop.yarn.server.nodemanager.containermanager.linux.resources.CGroupsHandler;
36-
import org.apache.hadoop.yarn.server.nodemanager.containermanager.linux.resources.Fpga.plugins.IntelMCPFpgaPlugin;
3736
import org.apache.hadoop.yarn.server.nodemanager.containermanager.linux.resources.ResourceHandlerException;
3837
import org.apache.hadoop.yarn.util.resource.ResourceUtils;
3938

39+
import java.lang.reflect.Constructor;
40+
import java.lang.reflect.InvocationTargetException;
4041
import java.util.ArrayList;
4142
import java.util.List;
4243
import java.util.Map;
@@ -55,11 +56,31 @@ public class FpgaResourceHandlerImpl implements FpgaResourceHandler {
5556

5657
private CGroupsHandler cGroupsHandler;
5758

58-
public FpgaResourceHandlerImpl(CGroupsHandler cGroupsHandler) {
59+
public FpgaResourceHandlerImpl(CGroupsHandler cGroupsHandler, Configuration conf) {
60+
61+
LOG.info("FPGA Plugin Chain init.");
62+
5963
allocator = new FpgaResourceAllocator();
6064
//init all plugins based on configurations or hardcode
6165
pluginChain = new FpgaPluginChain();
62-
pluginChain.addPlugin(new IntelMCPFpgaPlugin());
66+
67+
String[] fpgaPluginClassStrs = conf.getStrings(YarnConfiguration.NM_FPGA_PLUGIN_CLASS);
68+
if(fpgaPluginClassStrs == null) {
69+
LOG.info("No FPGA plugin can be loaded.");
70+
} else {
71+
72+
for (String fpgaPluginClass : fpgaPluginClassStrs) {
73+
LOG.info("FPGA Plugin Class " + fpgaPluginClass);
74+
try {
75+
Constructor<?> constructor = Class.forName(fpgaPluginClass).getConstructor();
76+
AbstractFpgaPlugin fpgaPlugin = (AbstractFpgaPlugin) constructor.newInstance();
77+
pluginChain.addPlugin(fpgaPlugin);
78+
LOG.info(fpgaPluginClass + " loaded");
79+
} catch (NoSuchMethodException | ClassNotFoundException | IllegalAccessException | InstantiationException | InvocationTargetException e) {
80+
throw new YarnRuntimeException(e);
81+
}
82+
}
83+
}
6384
this.cGroupsHandler = cGroupsHandler;
6485
}
6586

@@ -89,7 +110,7 @@ public String getRequestedIPID(Container container) {
89110
public List<PrivilegedOperation> bootstrap(Configuration configuration) throws ResourceHandlerException {
90111
// get vendor plugin type, major and minor number from configuration
91112
// add FPGA devices to allocator
92-
if (!pluginChain.initPlugin("", configuration)){
113+
if (!pluginChain.initPlugin()){
93114
throw new ResourceHandlerException("Fpga plugin initialization failed", null);
94115
}
95116
//get major number and minor number from configuration node-resource.xml
@@ -161,7 +182,13 @@ public List<PrivilegedOperation> preStart(Container container) throws ResourceHa
161182
if (null == ipFilePath) {
162183
throw new ResourceHandlerException("Fpga plugin failed to download IP", null);
163184
}
164-
if (!tempPlugin.configureIP(ipFilePath, allocation)) {
185+
List<FpgaResourceAllocator.FpgaDevice> allowed = allocation.getAllowed();
186+
List<String> addresses = new ArrayList<>();
187+
for(int i = 0; i < allowed.size(); i++) {
188+
addresses.add(allowed.get(i).getMajor() + ":" + allowed.get(i).getMinor());
189+
}
190+
191+
if (!tempPlugin.configureIP(ipFilePath, addresses)) {
165192
throw new ResourceHandlerException("Fpga plugin failed to configure IP", null);
166193
}
167194
//update the allocator that we update an IP of a device

hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/resources/Fpga/plugins/IntelMCPFpgaPlugin.java

Lines changed: 0 additions & 48 deletions
This file was deleted.

hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/resources/ResourceHandlerModule.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ private static FpgaResourceHandlerImpl getFpgaResourceHandler(
9595
YarnConfiguration.DEFAULT_NM_FPGA_RESOURCE_ENABLED);
9696
if (fpgaEnabled) {
9797
return new FpgaResourceHandlerImpl(
98-
getInitializedCGroupsHandler(conf));
98+
getInitializedCGroupsHandler(conf), conf);
9999
}
100100
return null;
101101
}

hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/resources/TestFpgaResourceHandler.java

Lines changed: 41 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,21 @@
1+
/**
2+
* Licensed to the Apache Software Foundation (ASF) under one
3+
* or more contributor license agreements. See the NOTICE file
4+
* distributed with this work for additional information
5+
* regarding copyright ownership. The ASF licenses this file
6+
* to you under the Apache License, Version 2.0 (the
7+
* "License"); you may not use this file except in compliance
8+
* with the License. You may obtain a copy of the License at
9+
*
10+
* http://www.apache.org/licenses/LICENSE-2.0
11+
*
12+
* Unless required by applicable law or agreed to in writing, software
13+
* distributed under the License is distributed on an "AS IS" BASIS,
14+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15+
* See the License for the specific language governing permissions and
16+
* limitations under the License.
17+
*/
18+
119
package org.apache.hadoop.yarn.server.nodemanager.containermanager.linux.resources;
220

321
import org.apache.hadoop.conf.Configuration;
@@ -6,12 +24,10 @@
624
import org.apache.hadoop.yarn.server.nodemanager.containermanager.container.Container;
725
import org.apache.hadoop.yarn.server.nodemanager.containermanager.linux.resources.Fpga.AbstractFpgaPlugin;
826
import org.apache.hadoop.yarn.server.nodemanager.containermanager.linux.resources.Fpga.FpgaResourceHandlerImpl;
9-
import org.apache.hadoop.yarn.server.nodemanager.containermanager.linux.resources.Fpga.plugins.IntelMCPFpgaPlugin;
1027
import org.junit.Assert;
1128
import org.junit.Before;
1229
import org.junit.Test;
1330
import org.mockito.Mockito;
14-
import org.omg.CORBA.Any;
1531

1632

1733
import java.util.HashMap;
@@ -21,32 +37,34 @@
2137
import static org.mockito.Mockito.verify;
2238
import static org.mockito.Mockito.when;
2339

40+
2441
public class TestFpgaResourceHandler {
2542
private FpgaResourceHandlerImpl fpgaResourceHandler;
2643
private Configuration configuration;
44+
45+
/**
46+
* it's better to define allowed devices in the node-resource.xml:
47+
* <property>
48+
* <name>yarn.nodemanager.resource-types.MCP</name>
49+
* <value>2</value>
50+
* </property>
51+
* <property>
52+
* <name>yarn.nodemanager.resource-types.MCP.allowed</name>
53+
* <value>244:0,245:1</value>
54+
* </property>
55+
* <property>
56+
* <name>yarn.nodemanager.resource-types.DCP</name>
57+
* <value>2</value>
58+
* </property>
59+
* <property>
60+
* <name>yarn.nodemanager.resource-types.DCP.allowed</name>
61+
* <value>100:0,100:1</value>
62+
* </property>
63+
*/
2764
@Before
2865
public void setup() {
29-
/**
30-
* it's better to define allowed devices in the node-resource.xml:
31-
* <property>
32-
* <name>yarn.nodemanager.resource-types.MCP</name>
33-
* <value>2</value>
34-
* </property>
35-
* <property>
36-
* <name>yarn.nodemanager.resource-types.MCP.allowed</name>
37-
* <value>244:0,245:1</value>
38-
* </property>
39-
* <property>
40-
* <name>yarn.nodemanager.resource-types.DCP</name>
41-
* <value>2</value>
42-
* </property>
43-
* <property>
44-
* <name>yarn.nodemanager.resource-types.DCP.allowed</name>
45-
* <value>100:0,100:1</value>
46-
* </property>
47-
* */
48-
fpgaResourceHandler = new FpgaResourceHandlerImpl(mock(CGroupsHandler.class));
4966
configuration = new YarnConfiguration();
67+
fpgaResourceHandler = new FpgaResourceHandlerImpl(mock(CGroupsHandler.class), configuration);
5068
configuration.set(YarnConfiguration.NM_RESOURCES_PREFIX + "MCP.allowed", "244:0,245:1");
5169
}
5270

@@ -111,7 +129,7 @@ public void testPreStartWithMultiplePlugins() throws ResourceHandlerException {
111129

112130
private static AbstractFpgaPlugin mockPlugin(String type) {
113131
AbstractFpgaPlugin plugin = mock(AbstractFpgaPlugin.class);
114-
when(plugin.initPlugin(Mockito.anyString(), Mockito.anyObject())).thenReturn(true);
132+
when(plugin.initPlugin()).thenReturn(true);
115133
when(plugin.getFpgaType()).thenReturn(type);
116134
when(plugin.getExistingIPID(Mockito.anyInt(), Mockito.anyInt())).thenReturn("LZO");
117135
when(plugin.cleanupFpgas(Mockito.anyObject())).thenReturn(true);

0 commit comments

Comments
 (0)