亚马逊AWS官方博客

AWS Graviton3 加速 Flink 作业执行:Benchmark

AWS 于 2022 年 5 月宣布推出 Graviton3,使用 ARM Neoverse 内核定制设计的 ARM 架构构建,针对提供高性能和能效进行了优化。与 Graviton2 相比,AWS Graviton3 的计算性能提高了 25%;并于 2023 年 11 月 16 日宣布在中国区域推出 C7g、M7g 和 R7g 实例

客户在评估将他们的大数据工作负载转移到 AWS Graviton3 过程中,许多人询问,在典型的流式处理引擎 Flink 工作负载中是否可以实现比同等配置 x86 实例更具性能和性价比优势。

在这篇文章中,将比较 5 种相同配置的 EC2 实例在执行 Nexmark Benchmark 时的性能和成本。

性能对比:

  • r6g.2xlarge 相比 r5.2xlarge ,完成时间节省 14%
  • r7g.2xlarge 相比 r5.2xlarge ,完成时间节省 48%
  • r7g.2xlarge 相比 r6i.2xlarge ,完成时间节省 28%

成本对比:

以上述 5 种实例在 us-east-2 区域的 1 年期无预付 RI 价格的有效小时费率为基础,计算执行 Nexmark Benchmark 所需的成本:

进一步,以 r5.2xlarge 的 Benchmark 成本为基准进行归一化处理,得到如下比较结果:

其中:

  • r6g.2xlarge 相比 r5.2xlarge ,成本节省31%
  • r7g.2xlarge 相比 r5.2xlarge ,成本节省 53%
  • r7g.2xlarge 相比 r6i.2xlarge ,成本节省 38%

本文后续内容将详细描述如何搭建 Flink 集群并执行 Nexmark Benchmark 测试。

Benchmark 工具介绍

NEXMark 是一个开源的基准测试工具,主要用于测试和评估流处理引擎的性能,为流处理系统提供了公平和全面的性能基准测试,可以指导流系统的优化和性能比较。

Nexmark 主要特点:

– 实现了流处理的标准化基准测试,可以对比不同流处理系统的性能,例如 Flink、Spark Streaming 等。

– 模拟了 3 类常见的流处理场景:事件监控、查询分析和数据管道处理。

– 模型设计基于真实的公开数据集,更贴近实际情况。

– 编写了等价的 SQL 和 Java 代码,可以测试多种系统。

– 提供了详细的测试报告,评估延迟、吞吐量、查询表现等。

– 有单机和集群两种运行模式,可以测试不同规模。

– 可以扩展自定义的工作负载进行新场景测试。

– Nexmark 为 Apache 基金会下的开源项目,可以免费使用。

Nexmark 对在线拍卖系统上表示的三个实体模型的多个查询:

  • Person:代表提交拍卖物品和/或在拍卖中出价的人。
  • Auction:代表正在拍卖的物品。
  • Bid:代表对拍卖中的物品的出价。

源事件总数为 1 亿,源每秒生成 10M 条记录,3 个流处理作业的比例是 Bid:92%,Auction:6%,Person:2%。

Nexmark 提供了编号从 q0~q22 的 23 个查询任务,其中 q1 ~ q8 来自原始 NEXMark 查询,q0 和 q9 ~ q13 来自 Apache Beam,其他作为扩展覆盖更多场景。

观测指标:

为了评估性能,Nexmark 使用了两个性能测量术语:核心(Cores)和时间(Time)。

  • Cores 是流处理系统使用的 CPU 使用率。流处理系统如何有效利用 CPU 资源,每个核心贡献多少吞吐量,是流处理性能基准测试的重要方面。对于 Flink,Nexmark 在每个工作节点上部署一个 CPU 使用情况收集器,并将使用情况指标发送给基准运行程序进行汇总。
  • Time 是流处理系统执行指定数量的事件的成本时间。通过 Cores * Time,我们可以知道流处理系统使用了多少资源来处理指定数量的事件。

您还可以通过 NEXMark research paper 和 Apache Beam Nexmark 了解更多详情。

Benchmark 组网

在本博客中采用如下规格的 EC2 实例搭建 Flink Standalone 集群,环境搭建过程以 r7g.2xlarge 规格为例进行。

  • 节点数:3 * r7g.2xlarge
    • 节点 1: 作为 Flink master/worker 角色的合设节点
    • 节点 2/3:worker 角色的单独节点
  • EBS 磁盘:40GB GP3(默认性能)
  • 操作系统:Amazon Linux 2
  • 软件:
    • Flink 1.17.2
    • Amazon Corretto 11

部署 Flink Standalone 集群

创建 EC2 实例

本次 Benchmark 中使用 3 节点的 Flink Standalone 集群,包含 1 个 master/worker 合设节点和 2 个独立 worker 节点。您可以参考教程:Amazon EC2 Linux 实例入门完成 3 台 EC2 实例的创建。

注意:请将 3 个节点方式在同一个 Subnet 子网中。

部署 Flink Standalone 集群环境

通过 SSH 登录到 3 台 EC2 实例,分别执行下面命令,安装必要的基础软件:

## 生成密钥
sudo su - root
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
chmod 0600 ~/.ssh/authorized_keys
## 安装 JDK
yum install -y java-11-amazon-corretto git htop screen 
echo "export JAVA_HOME=$(ls -d /usr/lib/jvm/java)" >> ~/.bashrc
echo "export FLINK_HOME=/root/flink-benchmark/flink-1.17.2" >> ~/.bashrc
source /root/.bashrc
java --version
## 安装 maven
cd /root/
wget https://dlcdn.apache.org/maven/maven-3/3.9.5/binaries/apache-maven-3.9.5-bin.tar.gz
tar zxf apache-maven-3.9.5-bin.tar.gz
echo "export PATH=$PATH:/root/apache-maven-3.9.5/bin" >> ~/.bashrc
source /root/.bashrc
mvn -v

将 下列 3 个 IPADDR_ 变量设置为 3 台 EC2 实例的 VPC IP 地址,这里以 10.10.20.10~12 为例进行演示。在您环境中部署时,请根据实际情况进行替换。在所有 3 台 EC2 实例上继续执行下列命令:

IPADDR_MASTER="10.10.20.10"
IPADDR_WORKER1="10.10.20.11"
IPADDR_WORKER2="10.10.20.12"
cat << EOF >> /etc/hosts
$IPADDR_MASTER master
$IPADDR_WORKER1 worker1
$IPADDR_WORKER2 worker2
EOF
cd .ssh
cat id_rsa.pub 
vim authorized_keys
### 将 master 和 worker1,2 节点的【cat ~/.ssh/id_rsa.pub】 的输出结果
### 添加到所有节点的 authorized_keys 文件

在 Master 节点继续执行下面操作:完成 Flink 和 Nexmark 安装。

下载和解压缩 Flink 软件包:

mkdir /root/flink-benchmark
cd /root/flink-benchmark
wget https://dlcdn.apache.org/flink/flink-1.17.2/flink-1.17.2-bin-scala_2.12.tgz
tar zxf flink-1.17.2-bin-scala_2.12.tgz

配置 masters 和 workers 文件:

echo master:8081 > flink-1.17.2/conf/masters
echo worker1 >> flink-1.17.2/conf/workers
echo worker2 >> flink-1.17.2/conf/workers

下载 Nexmark 源码并完成构建:

cd /root/flink-benchmark
git clone https://github.com/nexmark/nexmark.git
mv nexmark nexmark-src
cd nexmark-src/nexmark-flink
./build.sh
mv nexmark-flink.tgz /root/flink-benchmark
cd /root/flink-benchmark
tar xzf nexmark-flink.tgz
cp /root/flink-benchmark/nexmark-flink/lib/*.jar /root/flink-benchmark/flink-1.17.2/lib

编辑 Nexmark 配置文件 nexmark-flink/conf/flink-conf.yaml:

sed -i "s/jobmanager.rpc.address: localhost/jobmanager.rpc.address: master/g" nexmark-flink/conf/flink-conf.yaml
sed -i "s/taskmanager.numberOfTaskSlots: 1/taskmanager.numberOfTaskSlots: 8/g" nexmark-flink/conf/flink-conf.yaml
sed -i "s/taskmanager.memory.process.size: 8G/taskmanager.memory.process.size: 48G/g" nexmark-flink/conf/flink-conf.yaml
sed -i "s/parallelism.default: 8/parallelism.default: 24/g" nexmark-flink/conf/flink-conf.yaml
sed -i "s/file:\/\/\/path\/to\/checkpoint/file:\/\/\/root\/checkpoint/g" nexmark-flink/conf/flink-conf.yaml
sed -i "s/-XX:ParallelGCThreads=4/-XX:ParallelGCThreads=4 -XX:+IgnoreUnrecognizedVMOptions/g" nexmark-flink/conf/flink-conf.yaml
cp -f nexmark-flink/conf/flink-conf.yaml flink-1.17.2/conf/
cp -f nexmark-flink/conf/sql-client-defaults.yaml flink-1.17.2/conf/

编辑 Nexmark 配置文件 nexmark-flink/conf/nexmark.yaml:

sed -i "s/nexmark.metric.reporter.host: localhost/nexmark.metric.reporter.host: master/g" nexmark-flink/conf/nexmark.yaml

将 master 节点已安装的软件包通过 scp 命令传输到 worker1/2 节点:

scp -r ~/flink-benchmark root@worker1:~/
scp -r ~/flink-benchmark root@worker2:~/

启动 Flink Standalone 集群

在 master 节点执行下面命令:

bash ~/flink-benchmark/flink-1.17.2/bin/start-cluster.sh

启动 Nexmark Benchmark程序

在 master 节点执行下面命令:

bash ~/flink-benchmark/nexmark-flink/bin/setup_cluster.sh

开始执行 Benchmark

在 master 节点执行下面命令,经启动 Benchmark 运行:

cd ~
screen -R nexmark -L
bash ~/flink-benchmark/nexmark-flink/bin/run_query.sh all

上面命令启动了一个单独的 screen 执行 benchmark 操作,以防止 SSH 会话超时退出导致 Benchmark 运行异常。该会话通过指定 -L 选项,将在当前目录生成session 日志文件 screenlog.0,您可以通过 more 或者 tail 等命令进行查看。

如需退出当前 session,请使用快捷键 Ctrl + A + D 退出。

如需重新进入 session,请使用 screen -R nexmark。

查看结果报告

当在日志文件 screenlog.0 看到下列形式的结果报告时,表示本次 Benchmark 执行完成,表格中列举了 Benchmark 过程中 q0~q22(除 q6)分析任务的完成时间 Times(s),以及最后一行所有分析任务的总完成时间,通常采用这一总完成时间来作为衡量 Benchmark 性能的指标。

查看 Benchmark 执行时的监控信息

在 Benchmark 执行时,你可以在所有 3 台 EC2 实例上,通过 htop 命令查看 CPU/内存利用率等信息。

在 Benchmark 结束后,可以在 EC2 控制台查看所有 3 台实例的 CPU 利用率和网络传入数据量等监控指标。

本篇作者

袁泉

亚马逊云科技弹性计算解决方案架构师,主要负责亚马逊云科技弹性计算相关产品的技术咨询与方案设计。专注于弹性计算相关的产品和方向。