我对Apache Spark有疑问。我在Ubuntu桌面上设置了Apache Spark独立群集。然后我在spark_env.sh
文件中写了两行:SPARK_WORKER_INSTANCES=4
和SPARK_WORKER_CORES=1
。 (如果我在编辑export
文件后启动群集,我发现在spark_env.sh
文件中不需要spark_env.sh
。)
我希望在我的单个桌面上有4个工作器实例,让它们分别占用1个CPU核心。结果是这样的:
top - 14:37:54 up 2:35, 3 users, load average: 1.30, 3.60, 4.84
Tasks: 255 total, 1 running, 254 sleeping, 0 stopped, 0 zombie
%Cpu0 :100.0 us, 0.0 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu1 : 1.7 us, 0.3 sy, 0.0 ni, 98.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu2 : 41.6 us, 0.0 sy, 0.0 ni, 58.4 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu3 :100.0 us, 0.0 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu4 : 0.3 us, 0.0 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu5 : 0.3 us, 0.3 sy, 0.0 ni, 99.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu6 : 59.0 us, 0.0 sy, 0.0 ni, 41.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu7 :100.0 us, 0.0 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem: 16369608 total, 11026436 used, 5343172 free, 62356 buffers
KiB Swap: 16713724 total, 360 used, 16713364 free. 2228576 cached Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
10829 aaaaaa 20 0 42.624g 1.010g 142408 S 101.2 6.5 0:22.78 java
10861 aaaaaa 20 0 42.563g 1.044g 142340 S 101.2 6.7 0:22.75 java
10831 aaaaaa 20 0 42.704g 1.262g 142344 S 100.8 8.1 0:24.86 java
10857 aaaaaa 20 0 42.833g 1.315g 142456 S 100.5 8.4 0:26.48 java
1978 aaaaaa 20 0 1462096 186480 102652 S 1.0 1.1 0:34.82 compiz
10720 aaaaaa 20 0 7159748 1.579g 32008 S 1.0 10.1 0:16.62 java
1246 root 20 0 326624 101148 65244 S 0.7 0.6 0:50.37 Xorg
1720 aaaaaa 20 0 497916 28968 20624 S 0.3 0.2 0:02.83 unity-panel-ser
2238 aaaaaa 20 0 654868 30920 23052 S 0.3 0.2 0:06.31 gnome-terminal
我认为前4行中的java
是Spark工作者。如果它是正确的,那么有四个Spark工作人员很好,每个人都使用1个物理核心(例如,101.2%
)。
但是我看到使用了5个物理核心。其中,CPU0, CPU3, CPU7
被充分利用。我认为一个Spark工作者正在使用其中一个物理内核。没关系。
但是,CPU2
和CPU6
的使用级别分别为41.6%
和59.0%
。它们总计100.6%
,我认为一个工作者的工作分配给这两个物理核心。
使用SPARK_WORKER_INSTANCES=4
和SPARK_WORKER_CORES=1
,这是正常情况吗?或者这是一些错误或问题的迹象?
答案 0 :(得分:1)
这是完全正常的行为。每当Spark使用术语核心时,它实际上意味着进程或线程,并且没有一个绑定到单个核心或处理器。
在任何多任务处理环境中,都不会连续执行进程。相反,操作系统不断在不同的进程之间切换,每个进程只获得可用处理器时间的一小部分。