在NUMA下,处理器访问它自己的本地存储器的速度比非本地存储器(存储器的地方到另一个处理器之间共享的处理器或存储器)快一些。
在使用spark standalone或者yarn时,如果碰到跨cpu核数访问的情况,可以修改相应的代码。
Yarn:
--- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/DefaultContainerExecutor.java
+++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/DefaultContainerExecutor_patched.java
private static final int WIN_MAX_PATH = 260;
+ //Soji
+ private static int count = 0;
+
protected final FileContext lfs;
public DefaultContainerExecutor() {
@@ -78,7 +81,11 @@
DefaultContainerExecutor(FileContext lfs) {
this.lfs = lfs;
}
-
+
+ protected int updateCount(){
+ //Change '4' to nummber of NUMA nodes on your system
+ return count++%4;
+ }
protected void copyFile(Path src, Path dst, String owner) throws IOException {
lfs.util().copy(src, dst);
}
@@ -310,9 +317,11 @@
private final class UnixLocalWrapperScriptBuilder
extends LocalWrapperScriptBuilder {
private final Path sessionScriptPath;
+ private int count;
public UnixLocalWrapperScriptBuilder(Path containerWorkDir) {
super(containerWorkDir);
+ this.count=0;
this.sessionScriptPath = new Path(containerWorkDir,
Shell.appendScriptExtension("default_container_executor_session"));
}
@@ -342,6 +351,7 @@
throws IOException {
DataOutputStream out = null;
PrintStream pout = null;
+ int numanode = updateCount();
try {
out = lfs.create(sessionScriptPath, EnumSet.of(CREATE, OVERWRITE));
pout = new PrintStream(out, false, "UTF-8");
@@ -353,7 +363,10 @@
pout.println("echo $$ > " + pidFile.toString() + ".tmp");
pout.println("/bin/mv -f " + pidFile.toString() + ".tmp " + pidFile);
String exec = Shell.isSetsidAvailable? "exec setsid" : "exec";
- pout.println(exec + " /bin/bash \"" +
+ //pout.println("#numanode is "+numanode);
+ //pout.println(exec + " /bin/bash \"" +
+ pout.println(exec +" numactl --membind="+numanode+" --cpunodebind="+numanode+ " /bin/bash \"" +
+ //pout.println(exec +" numactl --localalloc --cpunodebind="+numanode+ " /bin/bash \"" +
launchDst.toUri().getPath().toString() + "\"");
} finally {
IOUtils.cleanup(LOG, pout, out);
Standalone: