RDG: RoCE 加速 Apache Spark 2.2 集群部署
创建于 2019 年 6 月 30 日。本参考部署指南 (RDG) 将演示 RoCE 加速的 Apache Spark 2.2.0 多节点集群部署流程,以及 NVIDIA 端到端 100 Gb/s 以太网解决方案。
文档目录
Created on Jun 30, 2019
Introduction
This Reference Deployment Guide (RDG) will demonstrate a multi-node cluster deployment procedure of RoCE Accelerated Apache Spark 2.2.0 and NVIDIA end-to-end 100 Gb/s Ethernet solution.
This document describes the process of installing a pre-built Spark 2.2.0 standalone cluster of 17 physical nodes running Ubuntu 16.04.3 LTS.
The HDFS cluster includes 1 namenode server and 16 datanodes.
We will show how to prepare network for RoCE traffic accordingly with NVIDIA recommendations and will provide all steps required on host and switch sides.
References
- Apache Spark™
- http://spark.apache.org/
- Running Spark on YARN - Spark 2.2.0 文档
- Cluster Mode Overview - Spark 2.2.0 文档
- SparkRDMA
- Apache Spark RDMA plugin
- Accelerating Shuffle: A Tailor-Made RDMA Solution for Apache Spark
- Accelerating Shuffle: A Tailor-Made RDMA Solution for Apache Spark
- HiBench - the big data benchmark suite
- NVIDIA Onyx™ Advanced Ethernet Operating System
- NVIDIA OpenFabrics Enterprise Distribution for Linux (MLNX_OFED)
Overview
What is Apache Spark™?
Apache Spark™ is an open-source, fast and general engine for large-scale data processing. Spark provides an interface for programming entire clusters with implicit data parallelism and fault-tolerance.
NVIDIA SparkRDMA Plugin
Apache Spark™ replaces MapReduce
MapReduce, as implemented in Hadoop, is a popular and widely-used engine. In spite of its popularity, MapReduce suffers from high-latency and its batch-mode response is painful for lots of applications that process and analyze data. Apache Spark is a general purpose engine like MapReduce, but is designed to run much faster and with many more workloads. One of the most interesting features of Spark is its efficient use of memory, while MapReduce has always worked primarily with data stored on disk.
Accelerating Spark Shuffle
Shuffling is the process of redistributing data across partitions (that is, re-partitioning) between stages of computation. It is a costly process that should be avoided when possible. In Hadoop, shuffle writes intermediate files to the disk. These files are pulled by the next step/stage. With Spark shuffle, datasets are kept in memory and make the data within reach. However, when working in a cluster, network resources are required for fetching data blocks, adding on overall execution time. The SparkRDMA plugin accelerates the network fetch of data blocks using RDMA/RoCE technology, which reduces CPU usage and overall execution time.

SparkRDMA Plugin
SparkRDMA plugin is a high-performance, scalable and efficient ShuffleManager open-source plugin for Apache Spark.
It utilizes RDMA/RoCE (Remote Direct Memory Access/ RDMA over Converged Ethernet) technology to reduce CPU cycles needed for Shuffle data transfers, reducing memory usage by reusing memory for transfers rather than copying data multiple times as the traditional TCP-stack does. SparkRDMA plugin is built to provide the best performance out-of-the-box. Additionally, it provides multiple configuration options to further tune SparkRDMA on a per-job basis.
SparkRDMA is build to provide the best performance out-of-the-box.
Performance
TeraSort benchmark show x1.53 overall reduced in execution time, Sort benchmark show x1.28 reduction in execution time.
Setup Overview
Before you start, make sure you are aware of the Apache Cluster multi-node cluster architecture, see Overview - Spark 2.2.0 文档 for more info.
Logical Design

Bill of Materials - BOM
In the distributed Spark/HDFS configuration described in this guide, we are using the following hardware specification.

This document, does not cover the server's storage aspect. You should configure the servers with the storage components appropriate to your use case (Data Set size)
Physical Network Connections

Network Configuration
In our reference we will use a single port per server. In case of a single port NIC we will wire the available port. In case of dual port NIC we will wire the 1st port to an Ethernet switch and will not use the 2nd port.
We will cover the procedure later in the Installing NVIDIA OFED section.
Each server is connected to the SN2700 switch by a 100GbE copper cable.
The switch port connectivity in our case is as follow:
- 1th port – connected to the Namenode Server
- 2st -17th ports – connected to Worker Servers
Server names with network configuration provided below
| Server type | Server name | Internal network - 100 GigE | Management network - 1 GigE |
|---|---|---|---|
| Node 01 (master) | clx-mld-41 | enp1f0: 31.31.31.41 | eno0: From DHCP (reserved) |
| Node 02 | clx-mld-42 | enp1f0: 31.31.31.42 | eno0: From DHCP (reserved) |
| 节点 | 主机名 | RoCE IP | 管理 IP |
|---|---|---|---|
| Node 03 | clx-mld-43 | enp1f0: 31.31.31.43 | eno0: From DHCP (reserved) |
| Node 04 | clx-mld-44 | enp1f0: 31.31.31.44 | eno0: From DHCP (reserved) |
| Node 05 | clx-mld-45 | enp1f0: 31.31.31.45 | eno0: From DHCP (reserved) |
| Node 06 | clx-mld-46 | enp1f0: 31.31.31.46 | eno0: From DHCP (reserved) |
| Node 07 | clx-mld-47 | enp1f0: 31.31.31.47 | eno0: From DHCP (reserved) |
| Node 08 | clx-mld-48 | enp1f0: 31.31.31.48 | eno0: From DHCP (reserved) |
| Node 09 | clx-mld-49 | enp1f0: 31.31.31.49 | eno0: From DHCP (reserved) |
| Node 10 | clx-mld-50 | enp1f0: 31.31.31.50 | eno0: From DHCP (reserved) |
| Node 11 | clx-mld-51 | enp1f0: 31.31.31.51 | eno0: From DHCP (reserved) |
| Node 12 | clx-mld-52 | enp1f0: 31.31.31.52 | eno0: From DHCP (reserved) |
| Node 13 | clx-mld-53 | enp1f0: 31.31.31.53 | eno0: From DHCP (reserved) |
| Node 14 | clx-mld-54 | enp1f0: 31.31.31.54 | eno0: From DHCP (reserved) |
| Node 15 | clx-mld-55 | enp1f0: 31.31.31.55 | eno0: From DHCP (reserved) |
| Node 16 | clx-mld-56 | enp1f0: 31.31.31.56 | eno0: From DHCP (reserved) |
| Node 17 | clx-mld-57 | enp1f0: 31.31.31.57 | eno0: From DHCP (reserved) |
网络交换机配置

如果您不熟悉 NVIDIA 交换机软件,请从 HowTo Get Started with NVIDIA switches 指南开始。更多信息请参考 MLNX-OS 用户手册,位于 docs.nvidia.com/networking/ → 交换机软件。
第一步:请将交换机操作系统更新到最新的 ONYX OS 软件。请使用此指南:HowTo Upgrade MLNX-OS Software on NVIDIA switch systems。
我们将通过使用 RDMA 传输来加速 Spark。RoCE 部署有几种行业标准的网络配置。欢迎参考 Recommended Network Configuration Examples for RoCE Deployment 获取我们的建议和说明。
在我们的部署中,我们将配置网络为无损,并在主机和交换机端使用 DSCP:
- 对于交换机端,请根据 Lossless RoCE Configuration for MLNX-OS 交换机 in DSCP-Based QoS Mode 文档配置交换机。
- 主机端将在后面的 在 Master 和 Workers 上安装 MLNX_OFED for Ubuntu 部分中介绍。
以下是我们的交换机配置,供参考。您可以复制/粘贴到交换机,但请注意这是干净的交换机配置,可能会破坏您现有的配置。
swx-mld-1-2 [standalone: master] > enable
swx-mld-1-2 [standalone: master] # configure terminal
swx-mld-1-2 [standalone: master] (config) # show running-config
##
## Running database "initial"
## Generated at 2018/03/10 09:38:38 +0000
## Hostname: swx-mld-1-2
##
##
## Running-config temporary prefix mode setting
##
no cli default prefix-modes enable
##
## License keys
##
license install LK2-RESTRICTED_CMDS_GEN2-44T1-4H83-RWA5-G423-GY7U-8A60-E0AH-ABCD
##
## Interface Ethernet buffer configuration
##
traffic pool roce type lossless
traffic pool roce memory percent 50.00
traffic pool roce map switch-priority 3
##
## LLDP configuration
##
lldp
##
## QoS switch configuration
##
interface ethernet 1/1-1/32 qos trust L3
interface ethernet 1/1-1/32 traffic-class 3 congestion-control ecn minimum-absolute 150 maximum-absolute 1500
##
## DCBX ETS configuration
##
interface ethernet 1/1-1/32 traffic-class 6 dcb ets strict
##
## Other IP configuration
##
hostname swx-mld-1-2
##
## AAA remote server configuration
##
# ldap bind-password ********
# radius-server key ********
# tacacs-server key ********
##
## Network management configuration
##
# web proxy auth basic password ********
##
## X.509 certificates configuration
##
#
# Certificate name system-self-signed, ID 108bb9eb3e99edff47fc86e71cba530b6a6b8991
# (public-cert config omitted since private-key config is hidden)
##
## Persistent prefix mode setting
##
cli default prefix-modes enable
Master 和 Worker 服务器的安装与配置
前提条件
更新 Master 和 Worker 服务器上的 Ubuntu 软件包
要更新/升级 Ubuntu 软件包,请运行以下命令。
sudo apt-get update # 获取可用更新列表
sudo apt-get upgrade -y # 严格升级当前包
在 Master 和 Worker 服务器上安装通用依赖
要安装通用依赖,请运行以下命令或逐行粘贴。
sudo apt-get install git bc
在 Master 和 Worker 服务器上安装 Java 8(推荐 Oracle Java)
sudo apt-get install python-software-properties
sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java8-installer
在 Master 和 Worker 服务器上向 Host 文件添加条目
编辑 host 文件:
sudo vi /etc/hosts
添加以下行(根据您的环境调整 IP 和主机名):
31.31.31.41 clx-mld-41
31.31.31.42 clx-mld-42
31.31.31.43 clx-mld-43
31.31.31.44 clx-mld-44
31.31.31.45 clx-mld-45
31.31.31.46 clx-mld-46
31.31.31.47 clx-mld-47
31.31.31.48 clx-mld-48
31.31.31.49 clx-mld-49
31.31.31.50 clx-mld-50
31.31.31.51 clx-mld-51
31.31.31.52 clx-mld-52
31.31.31.53 clx-mld-53
31.31.31.54 clx-mld-54
31.31.31.55 clx-mld-55
31.31.31.56 clx-mld-56
31.31.31.57 clx-mld-57
sudo vim /etc/hosts
现在添加namenoder(主节点)和工作节点的条目。
127.0.0.1 localhost
127.0.1.1 clx-mld-42.local.domain clx-mld-42
# The following lines are desirable for IPv6 capable hosts
::1 localhost ip6-localhost ip6-loopback
#ff02::1 ip6-allnodes
#ff02::2 ip6-allrouters
31.31.31.41 namenoder
31.31.31.42 clx-mld-42-r
31.31.31.43 clx-mld-43-r
31.31.31.44 clx-mld-44-r
31.31.31.45 clx-mld-45-r
31.31.31.46 clx-mld-46-r
31.31.31.47 clx-mld-47-r
31.31.31.48 clx-mld-48-r
31.31.31.49 clx-mld-49-r
31.31.31.50 clx-mld-50-r
31.31.31.51 clx-mld-51-r
31.31.31.52 clx-mld-52-r
31.31.31.53 clx-mld-53-r
31.31.31.54 clx-mld-54-r
31.31.31.55 clx-mld-55-r
31.31.31.56 clx-mld-56-r
31.31.31.57 clx-mld-57-r
所需软件
在安装和配置Apache Spark及SparkRDMA环境之前,必须下载以下软件。

创建网络文件系统(NFS)共享
在主服务器上安装NFS服务器。创建目录/share/spark_rdma并将其导出到所有工作服务器。
在所有工作服务器上安装NFS客户端。将主服务器导出的/share/spark_rdma挂载到本地目录/share/spark_rdma(与主服务器路径相同)。
配置SSH
我们将配置从主节点到所有从节点的无密码SSH访问。
-
在主节点和从节点上安装OpenSSH服务器和客户端。
sudo apt-get install openssh-server openssh-client -
在主节点上生成密钥对。
ssh-keygen -t rsa -P "" -
将主节点上
.ssh/id_rsa.pub文件的内容复制到所有节点(主节点和从节点)的.ssh/authorized_keys文件中。 -
检查是否可以从主节点访问从节点。
ssh clx-mld-41-r ssh clx-mld-42-r ssh clx-mld-43-r ... ssh clx-mld-57-r
下载Apache Spark
-
访问下载 | Apache Spark并下载Apache Spark™及
spark-2.2.0-bin-hadoop2.7.tgz到共享文件夹/share/spark_rdma。 -
选择Spark版本: 2.2.1 (Dec 01 2017) 2.2.0 (Jul 11 2017) 2.1.2 (Oct 09 2017) 2.1.1 (May 02 2017) 2.1.0 (Dec 28 2016) 2.0.2 (Nov 14 2016) 2.0.1 (Oct 03 2016) 2.0.0 (Jul 26 2016) 1.6.3 (Nov 07 2016) 1.6.2 (Jun 25 2016) 1.6.1 (Mar 09 2016) 1.6.0 (Jan 04 2016)
-
选择包类型: Pre-built for Apache Hadoop 2.7 and later Pre-built for Apache Hadoop 2.6 Pre-build with user-provided Apache Hadoop Source Code
-
下载Spark:spark-2.2.0-bin-hadoop2.7.tgz https://www.apache.org/dyn/closer.lua/spark/spark-2.2.0/spark-2.2.0-bin-hadoop2.7.tgz
-
使用2.2.0签名和校验和及项目发布密钥验证此版本。
注意: 从2.0版本开始,Spark默认使用Scala 2.11构建。Scala 2.10用户应下载Spark源码包并使用Scala 2.10支持构建。
下载NVIDIA SparkRDMA 2.0
下载SparkRDMA Release Version 2.0并保存到共享文件夹/share/spark_rdma。
petro-rudenko 于16天前发布 · 自发布以来有1个提交到master分支。
资源
全新实现的SparkRDMA,从头重新设计,以进一步提高可扩展性、健壮性,最重要的是性能。 此版本引入的新功能和能力包括:
- 全新的元数据(Map Output)获取协议——现在支持扩展到数万个分区,具有卓越的性能和可恢复性
- RdmaChannel中的软件级流控制——消除网络中的暂停风暴
- ODP(按需分页)支持——提高内存效率
附带了预构建的二进制文件。请按照README页面上的说明进行操作。
克隆HiBench Suite 7.0仓库
要克隆最新的HiBench仓库,请运行以下命令:
cd /share/spark_rdma
git clone https://github.com/intel-hadoop/HiBench.git
上述git clone命令会创建一个名为“HiBench”的子目录。克隆后,您可以选择构建特定分支(例如发布分支),通过调用以下命令:
cd HiBench
git checkout master # 其中master是所需分支(默认)
cd <Path to NFS share>
在主节点和工作节点上安装适用于Ubuntu的MLNX_OFED
本章介绍如何在安装了NVIDIA ConnectX®-5网卡的单台主机上安装和测试MLNX_OFED for Linux包。 更多信息请点击NVIDIA OFED for Linux用户手册。

下载NVIDIA OFED
-
验证系统是否安装了NVIDIA网络适配器(HCA/NIC):
lspci -v | grep Mellanox以下示例显示安装了NVIDIA HCA的系统:

-
根据您的操作系统将ISO镜像下载到主机。 镜像名称格式为
MLNX_OFED_LINUX-<ver>-<OS label><CPUarch>.iso。 您可以从以下位置下载: nvidia.com/en-us/networking > 产品 > Software > InfiniBand/VPI Drivers > NVIDIA MLNX_OFED
下载MLNX_OFED
-
从NVIDIA Networking Download Center下载MLNX_OFED_LINUX ISO镜像。

-
使用
MD5SUM工具确认下载文件的完整性。运行以下命令并将结果与下载页面提供的值进行比较:md5sum MLNX_OFED_LINUX-<ver>-<OS label>.iso
安装NVIDIA OFED
MLNX_OFED通过运行mlnxofedinstall脚本进行安装。安装脚本执行以下操作:
- 发现当前安装的内核。
- 卸载标准操作系统发行版或其他供应商商业堆栈中的任何软件堆栈。
- 安装MLNX_OFED_LINUX二进制RPM(如果当前内核可用)。
- 识别当前安装的InfiniBand和以太网网卡,并自动升级固件。
安装脚本会删除所有先前安装的NVIDIA OFED软件包并重新安装。系统会提示您确认删除旧软件包。
-
以root身份登录安装机器。
-
将下载的ISO复制到
/root。 -
挂载ISO镜像:
mkdir /mnt/iso mount -o loop /root/MLNX_OFED_LINUX-4.5-1.0.1.0-ubuntu16.04-x86_64.iso /mnt/iso cd /mnt/iso -
运行安装脚本:
./mlnxofedinstall --all -
安装成功后重启:
# /etc/init.d/openibd restart # reboot
ConnectX®-5端口可以单独配置为InfiniBand或以太网端口。默认情况下,两个ConnectX-5 VPI端口初始化为InfiniBand端口。
-
检查端口模式是否为以太网:
ibv_devinfo -
如果看到以下内容,则需要将接口端口类型更改为以太网:

将接口端口类型更改为以太网模式。在加载驱动程序后,使用mlxconfig脚本更改模式。
注意:LINK_TYPE_P1=2 表示以太网模式
a. 启动mst并查看端口名称:
mst start
mst status
b. 将端口模式更改为以太网:
mlxconfig -d /dev/mst/mt4121_pciconf0 s LINK_TYPE_P1=2
# 端口1设置为ETH模式
reboot
c. 查询以太网设备并打印用户空间可用的信息:
ibv_devinfo
d. 运行ibdev2netdev工具查看以太网设备与InfiniBand设备/端口之间的所有关联:
ibdev2netdev
e. 配置网络接口:
ifconfig ens13f0 31.31.31.28 netmask 255.255.255.0
f. 将以下行插入到/etc/network/interfaces文件中,位于以下行之后:
vim /etc/network/interfaces
auto eno1
iface eno1 inet dhcp
新行:
auto ens13f0
iface ens13f0 inet static
address 31.31.31.28
netmask 255.255.255.0
示例:
vim /etc/network/interfaces
auto eno1
iface eno1 inet dhcp
auto ens13f0
iface ens13f0 inet static
address 31.31.31.28
netmask 255.255.255.0
g. 检查网络配置是否正确:
ifconfig -a
基于L3(DSCP)的无损网络配置
这篇文章提供了在基于DSCP的QoS模式下,为安装了MLNX_OFED的NVIDIA设备配置RoCE无损网络的示例。
我们环境的示例:
符号说明
-
<interface>指父接口(例如ens13f0) -
<mlx-device>指mlx设备(例如mlx5_0),通过运行以下命令获取:ibdev2netdev -
<mst-device>指MST设备(例如/dev/mst/mt4121_pciconf0),通过运行以下命令获取:mst start mst status
配置:
mlnx_qos -i ens13f0 --trust dscp
echo 106 > /sys/class/infiniband/mlx5_0/tc/1/traffic_class
cma_roce_tos -d mlx5_0 -t 106
sysctl -w net.ipv4.tcp_ecn=1
mlnx_qos -i ens13f0 --pfc 0,0,0,1,0,0,0,0
验证MOFED
检查mofed版本和uverbs:
ofed_info -s
MLNX_OFED_LINUX-4.5-1.0.1.0
ls /dev/infiniband/uverbs1
在容器中运行InfiniBand带宽压力测试。
| 服务器 | 客户端 |
|---|---|
ib_write_bw -a -d mlx5_0 & |
ib_write_bw -a -F $server_IP -d mlx5_0 --report_gbits |
通过这种方式,您可以在容器之间运行RoCE带宽压力测试。
配置环境

注意: Spark、SparkRDMA插件和HADOOP的配置步骤在Master节点上执行。
解压Spark和SparkRDMA归档文件
cd /share/spark_rdma
tar -xzvf spark-2.2.0-bin-hadoop2.7.tgz
tar -xzvf spark-rdma-2.0.tgz
所有
脚本、JAR 包和配置文件位于新创建的目录 spark-2.2.0-bin-hadoop2.7 中。
Spark 配置
-
更新 bash 文件。
vim ~/.bashrc在文件末尾添加以下行:
export JAVA_HOME=/usr/lib/jvm/java-8-oracle/ export SPARK_HOME=/share/spark_rdma/spark-2.2.0-bin-hadoop2.7/ -
保存并关闭文件后,重新加载
.bashrc:source ~/.bashrc -
检查路径是否正确设置:
echo $JAVA_HOME echo $SPARK_HOME echo $LD_LIBRARY_PATH -
编辑
spark-env.sh。复制模板并重命名,添加主节点主机名、接口和临时目录:
cd /share/spark_rdma/spark-2.2.0-bin-hadoop2.7/conf cp spark-env.sh.template spark-env.sh vim spark-env.sh添加以下内容:
#export SPARK_MASTER_HOST=spark1-r export SPARK_MASTER_HOST=namenoder export SPARK_LOCAL_IP=`/sbin/ip addr show enp1f0 | grep "inet\b" | awk '{print $2}' | cut -d/ -f1` export SPARK_LOCAL_DIRS=/tmp/spark-tmp添加从节点:
vim /share/spark_rdma/spark-2.2.0-bin-hadoop2.7/conf/slaves添加以下行:
clx-mld-41-r clx-mld-42-r clx-mld-43-r ... clx-mld-57-r
Hadoop 配置
-
复制
conf/slaves到 Hadoop 配置目录:cp /share/spark_rdma/spark-2.2.0-bin-hadoop2.7/conf/slaves /share/spark_rdma/hadoop-2.7.4/etc/hadoop/slaves -
创建分布式文件系统:
sbin/slaves.sh mkdir /data/hadoop_tmp # 在 NVMe 磁盘上 -
编辑
current_config/core-site.xml:cd /share/spark_rdma/hadoop-2.7.4 vim current_config/core-site.xml添加以下配置:
<?xml-stylesheet type="text/xsl" href="https://networking-docs.nvidia.com/sol/configuration.xsl"?> <!-- Licensed 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. See accompanying LICENSE file. --> <!-- Put site-specific property overrides in this file. --> <configuration> <property> <name>fs.default.name</name> <value>hdfs://namenoder:9000</value> </property> <property> <name>hadoop.tmp.dir</name> <value>/data/hadoop_tmp</value> </property> </configuration> -
更新 bash 文件:
vim ~/.bashrc添加:
export HADOOP_HOME=/share/spark_rdma/hadoop-2.7.4/ -
重新加载
.bashrc:source ~/.bashrc -
检查路径:
echo $HADOOP_HOME -
编辑
current_config/hadoop-env.sh:vim current_config/hadoop-env.sh添加:
export JAVA_HOME=${JAVA_HOME} export HADOOP_HOME=/share/spark_rdma/hadoop-2.7.4/ export HADOOP_PREFIX=$HADOOP_HOME export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop/
HDFS 配置
-
编辑
current_config/hdfs-site.xml:vim current_config/hdfs-site.xml添加:
<!-- Put site-specific property overrides in this file. --> <configuration> <property> <name>dfs.datanode.dns.interface</name> <value>enp1f0</value> </property> <property> <name>dfs.replication</name> <value>1</value> </property> <property> <name>dfs.namenode.datanode.registration.ip-hostname-check</name> <value>false</value> </property> <property> <name>dfs.permissions</name> <value>false</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>/data/hadoop_tmp</value> </property> </configuration>
YARN 配置
注意:本示例中未使用 YARN,但您可以在部署中使用。
-
编辑
current_config/yarn-site.xml:vim current_config/yarn-site.xml添加:
<?xml version="1.0"?> <!-- Licensed 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. See accompanying LICENSE file. --> <configuration> <!-- Site specific YARN configuration properties --> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <property> <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name> <value>org.apache.hadoop.mapred.ShuffleHandler</value> </property> </configuration>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>namenoder:8025</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>namenoder:8030</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>namenoder:8032</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>namenoder:8034</value>
</property>
<property>
<name>yarn.resourcemanager.address</name>
<value>namenoder:8101</value>
</property>
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>40960</value>
</property>
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>40960</value>
</property>
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>2048</value>
</property>
<property>
<name>yarn.nodemanager.resource.cpu-vcores</name>
<value>20</value>
</property>
<property>
<name>yarn.nodemanager.disk-health-checker.enable</name>
<value>false</value>
</property>
<property>
<name>yarn.nodemanager.log-dirs</name>
<value>/tmp/yarn_nm/</value>
</property>
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
</configuration>
- 编辑
current_config/yarn-env.sh,指定 hadoop 目录:
vim current_config/yarn-env.sh
...
export HADOOP_HOME=/share/data/hadoop-2.7.4
....
- 将
current_config/*复制到etc/hadoop/:
cp current_config/* etc/hadoop/
- 在 NameNode 主机上执行以下命令格式化 HDFS:
bin/hdfs namenode -format
启动 Spark Standalone 集群
在 Hadoop 集群之上运行 Spark。

在 Master 上运行以下命令启动 Spark 服务:
cd /share/spark_rdma/spark-2.2.0-bin-hadoop2.7
sbin/start-all.sh
检查服务是否已启动
检查 Master 上的守护进程:
jps
33970 Jps
47928 ResourceManager
48121 NodeManager
47529 DataNode
47246 NameNode
检查 Slave 上的守护进程:
jps
1846 NodeManager
16491 Jps
1659 DataNode
检查 HDFS 和 YARN(可选)状态:
cd /share/spark_rdma/hadoop-2.7.4
bin/hdfs dfsadmin -report | grep Name
Name: 31.31.31.43:50010 (clx-mld-43-r)
Name: 31.31.31.47:50010 (clx-mld-47-r)
Name: 31.31.31.48:50010 (clx-mld-48-r)
Name: 31.31.31.45:50010 (clx-mld-45-r)
Name: 31.31.31.42:50010 (clx-mld-42-r)
Name: 31.31.31.41:50010 (namenoder)
...
Name: 31.31.31.57:50010 (clx-mld-57-r)
bin/hdfs dfsadmin -report | grep Name -c
8
bin/yarn node -list
18/02/20 16:56:31 INFO client.RMProxy: Connecting to ResourceManager at namenoder/31.31.31.41:8101
Total Nodes:8
Node-Id Node-State Node-Http-Address Number-of-Running-Containers
clx-mld-42-r:34873 RUNNING clx-mld-42-r:8042 0
clx-mld-47-r:35045 RUNNING clx-mld-47-r:8042 0
clx-mld-48-r:44996 RUNNING clx-mld-48-r:8042 0
clx-mld-46-r:45432 RUNNING clx-mld-46-r:8042 0
clx-mld-45-r:41307 RUNNING clx-mld-45-r:8042 0
...
clx-mld-57-r:44311 RUNNING clx-mld-57-r:8042 0
namenoder:41409 RUNNING namenoder:8042 0
停止集群
在 Master 上运行以下命令停止 Spark 服务:
cd /share/spark_rdma/spark-2.2.0-bin-hadoop2.7
sbin/stop-all.sh
NVIDIA 网卡性能调优
建议运行 mlnx_tune 工具,该工具将执行多项系统检查,并通知可能导致性能下降的任何潜在设置。您可以根据检查结果采取相应措施。
有关 mlnx_tune 的更多信息,请阅读此文章:HowTo Tune Your Linux Server for Best Performance Using the mlnx_tune Tool
该命令还会显示网络驱动程序使用的 CPU 核心,这些信息将用于后续的 Spark 性能调优。
sudo mlnx_tune
2017-08-16 14:47:17,023 INFO Collecting node information
2017-08-16 14:47:17,023 INFO Collecting OS information
2017-08-16 14:47:17,026 INFO Collecting CPU information
2017-08-16 14:47:17,104 INFO Collecting IRQ Balancer information
. . .
Local CPUs list [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
. . .
2018-02-16 14:47:18,777 INFO System info file: /tmp/mlnx_tune_180416_144716.log
运行 mlnx_tune 命令后,强烈建议设置 cpuList 参数(详见 SparkRDMA 插件文档的 Configuration Properties 部分)。
修改 spark.conf 文件,使用与 NVIDIA 设备关联的 NUMA 核心:
Local CPUs list [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
spark.shuffle.rdma.cpuList 0-15
更多深入性能资源请参考 NVIDIA 社区文章:Performance Tuning for NVIDIA 网卡
SparkRDMA 性能提示
- 压缩! Spark 默认启用压缩。使用压缩会导致节点间发送的数据包变小,但会以更高的 CPU 利用率为代价来压缩数据。由于 RDMA 网络具有高性能和低 CPU 开销的特性,建议在使用 SparkRDMA 时禁用压缩。在
spark.conf文件中设置:
spark.shuffle.compress false
spark.shuffle.spill.compress false
禁用压缩后,您可以回收之前用于数据压缩/解压缩的宝贵 CPU 周期,并在 RDMA 数据传输速度上获得额外的性能提升。
- 磁盘介质! 为了获得最高且最一致的性能结果,建议使用最高性能的磁盘介质。尽可能考虑使用 ramdrive 或 NVMe 设备作为 spark-tmp 和 hadoop tmp 文件。
结论
恭喜,您现在拥有一个 RDMA 加速的 Spark 集群,可以开始工作了。
接下来,我们将运行 HiBench 套件基准测试,以比较 TCP 与 RoCE 的性能。
附录 A:使用 SparkRDMA 运行 HiBench
HiBench 是一个大数据基准测试套件,可帮助评估不同大数据框架的速度、吞吐量和系统资源利用率。它包含一组 Hadoop、Spark 和流处理工作负载,包括 Sort、WordCount、TeraSort、Sleep、SQL 等。
PageRank、Nutch 索引、贝叶斯、Kmeans、NWeight 和增强型 DFSIO 等。
环境
- 实例类型和环境:参见设置概述
- 操作系统:Ubuntu 16.04.3 LTS
- Apache Hadoop:2.7.4,HDFS(1 个 NameNode,16 个 DataNode)
- Spark:2.2 独立模式,17 个节点
- 基准测试:设置 HiBench
- 测试日期:2018 年 3 月
环境
- 实例类型和环境:参见设置概述
- 操作系统:Ubuntu 16.04.3 LTS
- Apache Hadoop:2.7.4,HDFS(1 个 NameNode,16 个 DataNode)
- Spark:2.2 独立模式,17 个节点
- 基准测试:设置 HiBench
- 测试日期:2018 年 4 月
基准测试运行
重现 Terasort 结果的步骤:
-
在 HiBench 的
conf目录中配置 Hadoop 和 Spark 设置。 -
在
HiBench/conf/hibench.conf中设置:hibench.scale.profile bigdata # Mapper number in hadoop, partition number in Spark hibench.default.map.parallelism 1000 # Reducer nubmer in hadoop, shuffle partition number in Spark hibench.default.shuffle.parallelism 700 -
在
HiBench/conf/workloads/micro/terasort.conf中设置:hibench.terasort.bigdata.datasize 1890000000 -
运行
HiBench/bin/workloads/micro/terasort/prepare/prepare.sh和HiBench/bin/workloads/micro/terasort/spark/run.sh -
打开
HiBench/report/hibench.report:Type Date Time Input_data_size Duration(s) Throughput(bytes/s) Throughput/node ScalaSparkTerasort 2018-03-26 19:13:52 189000000000 79.931 2364539415 2364539415 -
在
HiBench/conf/spark.conf中添加:spark.driver.extraClassPath /PATH/TO/spark-rdma-2.0-for-spark-SPARK_VERSION-jar-with-dependencies.jar spark.executor.extraClassPath /PATH/TO/spark-rdma-2.0-for-spark-SPARK_VERSION-jar-with-dependencies.jar spark.shuffle.manager org.apache.spark.shuffle.rdma.RdmaShuffleManager spark.shuffle.compress false spark.shuffle.spill.compress false -
运行
HiBench/bin/workloads/micro/terasort/spark/run.sh -
打开
HiBench/report/hibench.report:Type Date Time Input_data_size Duration(s) Throughput(bytes/s) Throughput/node ScalaSparkTerasort 2018-03-26 19:13:52 189000000000 79.931 2364539415 2364539415 ScalaSparkTerasort 2018-03-26 19:17:13 189000000000 52.166 3623049495 3623049495总体提升:

重现 Scala sort 结果的步骤:
-
在
HiBench/conf/hibench.conf中设置:hibench.scale.profile bigdata # Mapper number in hadoop, partition number in Spark hibench.default.map.parallelism 1000 # Reducer nubmer in hadoop, shuffle partition number in Spark hibench.default.shuffle.parallelism 7000 -
运行
HiBench/bin/workloads/micro/sort/prepare/prepare.sh和HiBench/bin/workloads/micro/sort/spark/run.sh -
打开
HiBench/report/hibench.report:Type Date Time Input_data_size Duration(s) Throughput(bytes/s) Throughput/node ScalaSparkSort 2018-04-03 19:13:24 307962225944 37.898 8126081216 8126081216 ScalaSparkSort 2018-04-03 21:16:56 307962098703 48.608 6335625796 6335625796总体提升:

完成!
相关文档
- Spark Setup
- SPARK POC
- SPARK Example using Kubernetes on PSG Cluster
- Tips and tricks
- Coding Guidelines
- How to set up CUDF environment
- Set Up for Spark-XGBoost Development
- Build XGBoost
- Run Unit Test with Maven
- How to set up Spark Jupyter notebook with Toree
RDG:RoCE 加速的 Apache Spark 2.2 集群部署
创建于 2019 年 6 月 30 日
简介
本参考部署指南 (RDG) 将演示 RoCE 加速的 Apache Spark 2.2 多节点集群部署过程。

