全部產品
Search
文件中心

Elastic Compute Service:基於eRDMA部署高網路效能的Spark叢集

更新時間:Jul 16, 2026

使用eRDMA可以獲得超低的延遲,更快地處理請求。本文介紹如何建立以eRDMA增強型執行個體作為節點的Spark叢集,並部署Benchmark測試Spark叢集處理負載的效能。

背景資訊

Benchmark是一種基準效能測試工具,主要用於測試負載的執行時間、傳輸速度、輸送量和資源佔用率等。

步驟一:準備環境

在測試叢集效能前,需要先準備測試需要的叢集環境,例如Hadoop和Spark機器、安裝Hadoop、安裝並配置eRDMA等。

  1. 準備Hadoop環境。如果已有巨量資料叢集,請忽略該步驟。

    • 軟硬體環境要求

      部署該叢集需要準備Hadoop、Spark機器,請參考如下版本進行配置。

      • Hadoop版本:Hadoop 3.2.1

      • Spark版本:Spark 3.2.1

      • ECS執行個體:

        • 執行個體規格:請參見基本規格

        • vCPU個數:16

        • 叢集節點個數:1個主節點、3個worker節點

    • 安裝步驟

      安裝Hadoop巨量資料叢集的具體操作,請參見通過FastMR自動拉起巨量資料叢集

  2. 登入叢集主節點上的ECS執行個體。

    具體操作,請參見使用Workbench登入Linux執行個體

  3. 配置eRDMA。

    • 驅動安裝

      具體操作,請參見在企業級執行個體上啟用eRDMA

    • 網路設定

      1. 執行以下命令,開啟hosts檔案。

        vim /etc/hosts
      2. i鍵進入編輯模式,在設定檔中修改以下內容。

        192.168.201.83 poc-t5m0        master1
        192.168.201.84 poc-t5w0
        192.168.201.86 poc-t5w1
        192.168.201.85 poc-t5w2
        說明

        請根據實際情況,將IP地址替換為實際eRDMA網卡對應的IP地址。

      3. Esc鍵退出編輯模式,輸入:wq並按下Enter鍵,儲存並退出檔案。

    • yarn配置

      說明

      如果執行個體的預設網卡支援eRDMA,無需進行Yarn配置。

      1. 依次執行以下命令,開啟yarn-env.sh檔案。

        cd /opt/hadoop-3.2.1/etc/hadoop
        vim yarn-env.sh
      2. i鍵進入編輯模式,在設定檔中增加以下內容:

        RDMA_IP=`ip addr show eth1 | grep "inet\b" | awk '{print $2}' | cut -d/ -f1`
        export YARN_NODEMANAGER_OPTS="-Dyarn.nodemanager.hostname=$RDMA_IP"
        說明

        請根據實際情況,將eth1替換為實際eRDMA的網卡名稱。

      3. Esc鍵退出編輯模式,輸入:wq並按下Enter鍵,儲存並退出檔案。

    • Spark配置

      說明

      如果執行個體的預設網卡支援eRDMA,無需進行Spark配置。

      1. 依次執行以下命令,開啟spark-env.sh檔案。

        cd /opt/spark-3.2.1-bin-hadoop3.2/conf
        vim spark-env.sh
      2. i鍵進入編輯模式,在設定檔中增加以下內容。

        export SPARK_LOCAL_IP=`/sbin/ip addr show eth1 | grep "inet\b" | awk '{print $2}' | cut -d/ -f1`
        說明

        請根據實際情況,將eth1替換為實際eRDMA的網卡名稱。

      3. Esc鍵退出編輯模式,輸入:wq並按下Enter鍵,儲存並退出檔案。

  4. 執行以下命令,啟動HDFS及Yarn。

    $HADOOP_HOME/sbin/start-all.sh

步驟二:下載Benchmark安裝包

本步驟為您介紹如何下載用於測試的Benchmark安裝包。

  1. 執行以下命令,下載Benchmark安裝包。

    wget https://mracc-release.oss-cn-beijing.aliyuncs.com/erdma-spark/spark-erdma-jverbs.tar.gz
  2. 執行以下命令,解壓spark-erdma-jverbs.tar.gz安裝包。

    tar -zxvf spark-erdma-jverbs.tar.gz

    安裝包檔案介紹:

    • erdmalib:運行spark-erdma需要的native庫,對應檔案包括libdisni.so

    • plugin-sparkrdma:支援Spark RDMA的外掛程式及依賴庫,對應檔案為spark-eRDMA-1.0-for-spark-3.2.1.jardisni-2.1-jar-with-dependencies.jar

步驟三:執行Benchmark測試

本步驟為您介紹如何使用Benchmark測試Spark叢集處理負載的效能。

  1. 執行以下命令,修改ip route。

    說明

    如果執行個體的預設網卡支援eRDMA,可以跳過該步驟。

    route del -net 192.168.201.0 netmask 255.255.255.0 metric 0 dev eth0 && \
    route add -net 192.168.201.0 netmask 255.255.255.0 metric 1000 dev eth0
    說明

    請根據實際情況,將IP地址替換為實際eRDMA網卡對應的網關IP地址。

  2. Spark配置。

    1. 執行以下命令,開啟設定檔spark-jverbs-erdma.conf。

      vim /opt/spark-3.2.1-bin-hadoop3.2/conf/spark-jverbs-erdma.conf
    2. i鍵進入編輯模式,將設定檔修改為以下內容。

      spark.master yarn
      spark.deploy-mode client
      #driver
      spark.driver.cores 4
      spark.driver.memory 19g
      #executor
      spark.executor.instances 12
      spark.executor.memory 10g
      spark.executor.cores 4
      spark.executor.heartbeatInterval   60s
      #shuffle
      spark.task.maxFailures 4
      spark.default.parallelism 36
      spark.sql.shuffle.partitions 192
      spark.shuffle.compress            true
      spark.shuffle.spill.compress      true
      
      #other
      spark.network.timeout 3600
      spark.sql.broadcastTimeout 3600
      spark.eventLog.enabled             false
      spark.eventLog.dir                 hdfs://master1:9000/sparklogs
      spark.eventLog.compress            true
      spark.yarn.historyServer.address   master1:18080
      spark.serializer                  org.apache.spark.serializer.KryoSerializer
      
      #eRDMA
      spark.driver.extraLibraryPath   /path/erdmalib
      spark.executor.extraLibraryPath   /path/erdmalib
      spark.driver.extraClassPath       /path/spark-eRDMA-1.0-for-spark-3.2.1.jar:/path/disni-2.1-jar-with-dependencies.jar
      spark.executor.extraClassPath     /path/spark-eRDMA-1.0-for-spark-3.2.1.jar:/path/disni-2.1-jar-with-dependencies.jar
      spark.shuffle.manager org.apache.spark.shuffle.sort.RdmaShuffleManager
      spark.shuffle.sort.io.plugin.class org.apache.spark.shuffle.rdma.RdmaLocalDiskShuffleDataIO
      spark.shuffle.rdma.recvQueueDepth  128
      說明
      • spark.shuffle.compress設定為false會得到更好的加速比。

      • 本配置中的spark.executor.instancesspark.executor.memoryspark.executor.coresspark.sql.shuffle.partitions等Spark資源配置以32 vCPU、128 GB規格的執行個體為例,請您根據實際執行個體或者叢集規模進行調整。

    3. Esc鍵退出編輯模式,輸入:wq並按下Enter鍵,儲存並退出檔案。

  3. 依次執行以下命令,產生資料。

    cd /opt/spark-3.2.1-bin-hadoop3.2/conf
    spark-submit --properties-file /opt/spark-3.2.1-bin-hadoop3.2/conf/spark-normal.conf --class com.databricks.spark.sql.perf.tpcds.TPCDS_Bench_DataGen spark-sql-perf_2.12-0.5.1-SNAPSHOT.jar hdfs://master1:9000/tmp/tpcds_400 tpcds_400 400 parquet
    說明

    數值400代表產生的資料量大小,單位為GB,請您根據實際叢集規模調整。

  4. 執行以下命令,執行Benchmark測試。

    spark-submit --properties-file /opt/spark-3.2.1-bin-hadoop3.2/conf/spark-jverbs-erdma.conf --class com.databricks.spark.sql.perf.tpcds.TPCDS_Bench_RunAllQuery spark-sql-perf_2.12-0.5.1-SNAPSHOT.jar all hdfs://master1:9000/tmp/tpcds_400 tpcds_400 /tmp/tpcds_400_result

    當出現如下類似結果時,表示測試完成,您可以從測試結果中查看Spark叢集處理負載的執行時間。

    22/06/10 15:35:40 INFO scheduler.TaskSetManager: Finished task 371.0 in stage 1.0 (TID 755) in 31 ms on c7re4x004 (executor 1) (372/384)
    22/06/10 15:35:40 INFO scheduler.TaskSetManager: Finished task 372.0 in stage 1.0 (TID 756) in 29 ms on c7re4x004 (executor 1) (373/384)
    22/06/10 15:35:40 INFO scheduler.TaskSetManager: Finished task 376.0 in stage 1.0 (TID 760) in 23 ms on c7re4x004 (executor 1) (374/384)
    22/06/10 15:35:40 INFO scheduler.TaskSetManager: Finished task 374.0 in stage 1.0 (TID 758) in 27 ms on c7re4x004 (executor 1) (375/384)
    22/06/10 15:35:40 INFO scheduler.TaskSetManager: Finished task 373.0 in stage 1.0 (TID 757) in 31 ms on c7re4x004 (executor 1) (376/384)
    22/06/10 15:35:40 INFO scheduler.TaskSetManager: Finished task 377.0 in stage 1.0 (TID 761) in 24 ms on c7re4x004 (executor 1) (377/384)
    22/06/10 15:35:40 INFO scheduler.TaskSetManager: Finished task 375.0 in stage 1.0 (TID 759) in 29 ms on c7re4x004 (executor 1) (378/384)
    22/06/10 15:35:40 INFO scheduler.TaskSetManager: Finished task 381.0 in stage 1.0 (TID 765) in 53 ms on c7re4x004 (executor 1) (379/384)
    22/06/10 15:35:40 INFO scheduler.TaskSetManager: Finished task 380.0 in stage 1.0 (TID 764) in 53 ms on c7re4x004 (executor 1) (380/384)
    22/06/10 15:35:40 INFO scheduler.TaskSetManager: Finished task 379.0 in stage 1.0 (TID 763) in 56 ms on c7re4x004 (executor 1) (381/384)
    22/06/10 15:35:40 INFO scheduler.TaskSetManager: Finished task 382.0 in stage 1.0 (TID 766) in 55 ms on c7re4x004 (executor 1) (382/384)
    22/06/10 15:35:40 INFO scheduler.TaskSetManager: Finished task 378.0 in stage 1.0 (TID 762) in 56 ms on c7re4x004 (executor 1) (383/384)
    22/06/10 15:35:40 INFO scheduler.TaskSetManager: Finished task 383.0 in stage 1.0 (TID 767) in 53 ms on c7re4x004 (executor 1) (384/384)
    22/06/10 15:35:40 INFO cluster.YarnScheduler: Removed TaskSet 1.0, whose tasks have all completed, from pool
    22/06/10 15:35:40 INFO scheduler.DAGScheduler: ResultStage 1 (runJob at SparkHadoopWriter.scala:78) finished in 1.599 s
    22/06/10 15:35:40 INFO scheduler.DAGScheduler: Job 0 finished: runJob at SparkHadoopWriter.scala:78, took 7.308027 s
    22/06/10 15:35:40 INFO io.SparkHadoopWriter: Job job_20220610153533_0002 committed.
    22/06/10 15:35:40 INFO server.AbstractConnector: Stopped Spark@1cfd3b14{HTTP/1.1,[http/1.1]}{192.168.145.101:4040}
    22/06/10 15:35:40 INFO ui.SparkUI: Stopped Spark web UI at http://c7re4x001:4040
    22/06/10 15:35:41 INFO cluster.YarnClientSchedulerBackend: Interrupting monitor thread
    22/06/10 15:35:41 INFO cluster.YarnClientSchedulerBackend: Shutting down all executors
    22/06/10 15:35:41 INFO cluster.YarnSchedulerBackend$YarnDriverEndpoint: Asking each executor to shut down
    22/06/10 15:35:41 INFO cluster.SchedulerExtensionServices: Stopping SchedulerExtensionServices
    (serviceOption=None,
     services=List(),
     started=false)
    22/06/10 15:35:41 INFO cluster.YarnClientSchedulerBackend: Stopped
    22/06/10 15:35:41 INFO spark.MapOutputTrackerMasterEndpoint: MapOutputTrackerMasterEndpoint stopped!
    22/06/10 15:35:41 INFO memory.MemoryStore: MemoryStore cleared
    22/06/10 15:35:41 INFO storage.BlockManager: BlockManager stopped
    22/06/10 15:35:41 INFO storage.BlockManagerMaster: BlockManagerMaster stopped
    22/06/10 15:35:41 INFO scheduler.OutputCommitCoordinator$OutputCommitCoordinatorEndpoint: OutputCommitCoordinator stopped!
    22/06/10 15:35:41 INFO spark.SparkContext: Successfully stopped SparkContext
    22/06/10 15:35:41 INFO util.ShutdownHookManager: Shutdown hook called
    22/06/10 15:35:41 INFO util.ShutdownHookManager: Deleting directory /mnt/data/spark_tmp/spark-d363e35b-badc-43ba-9fa9-476a9301f65c
    22/06/10 15:35:41 INFO util.ShutdownHookManager: Deleting directory /tmp/spark-87ef4db1-7c2f-4f23-b989-f27b9bd9ac28
    說明

    您可以按照以上方法,去掉Spark conf中eRDMA外掛程式相關配置或者登入其他不支援eRDMA的叢集,對Spark eRDMA外掛程式的效能做對比。