全部產品
Search
文件中心

E-MapReduce:存算分離模式下藉助本機快取提升查詢效能

更新時間:Apr 12, 2025

存算分離模式下計算和儲存資源解耦,資料預設儲存在阿里雲OSS中,顯著提升了資源利用效率並降低了成本。為最佳化查詢效能,存算分離通過本機快取技術將熱資料存放區在計算節點的本地磁碟中,當查詢命中緩衝時,資料可以直接從本地讀取,從而使查詢效能與存算一體叢集相當。

前提條件

已建立並串連Serverless StarRocks執行個體,詳情請參見快速使用存算分離版執行個體

操作流程

步驟一:建立存算分離資料庫及資料表

  1. 建立資料庫cloud_db和資料表detail_demo

    CREATE DATABASE cloud_db;
    USE cloud_db;
    
    CREATE TABLE IF NOT EXISTS detail_demo (
        recruit_date  DATE           NOT NULL COMMENT "YYYY-MM-DD",
        region_num    TINYINT        COMMENT "range [-128, 127]",
        num_plate     SMALLINT       COMMENT "range [-32768, 32767] ",
        tel           INT            COMMENT "range [-2147483648, 2147483647]",
        id            BIGINT         COMMENT "range [-2^63 + 1 ~ 2^63 - 1]",
        password      LARGEINT       COMMENT "range [-2^127 + 1 ~ 2^127 - 1]",
        name          CHAR(20)       NOT NULL COMMENT "range char(m),m in (1-255) ",
        profile       VARCHAR(500)   NOT NULL COMMENT "upper limit value 65533 bytes",
        ispass        BOOLEAN        COMMENT "true/false")
    DUPLICATE KEY(recruit_date, region_num)
    DISTRIBUTED BY HASH(recruit_date, region_num)
    PROPERTIES (
      "replication_num" = "1"
    );
  2. 查看資料庫的DbId

    SHOW PROC '/dbs';

    返回資訊如下所示。

    image

  3. 查看錶的詳細資料。

    SHOW PROC '/dbs/10313';

    範例程式碼中的10313為前一步驟中擷取到的DbId,返回資訊如下所示。image

    返回資訊中的Type欄位標識出在存算分離模式下的資料表類型為CLOUD_NATIVE,StoragePath欄位為表在OSS中的路徑,通過該路徑可以定位到存算分離表的資料存放區位置。

步驟二:存算分離Cache特性示範

本步驟通過建立兩個測試表(分別開啟和關閉本機快取),驗證StarRocks存算分離模式下本機快取(datacache.enable)對效能的影響。

  1. 建立測試表。

    • catalog_sales:開啟本機快取的表。

    • catalog_sales_nocache:關閉本機快取的表。

    USE cloud_db;
    --建立catalog_sales表。
    CREATE TABLE IF NOT EXISTS catalog_sales(
      cs_order_number bigint,
      cs_item_sk bigint,
      cs_sold_date_sk bigint,
      cs_sold_time_sk bigint,
      cs_ship_date_sk bigint,
      cs_bill_customer_sk bigint,
      cs_bill_cdemo_sk bigint,
      cs_bill_hdemo_sk bigint,
      cs_bill_addr_sk bigint,
      cs_ship_customer_sk bigint,
      cs_ship_cdemo_sk bigint,
      cs_ship_hdemo_sk bigint,
      cs_ship_addr_sk bigint,
      cs_call_center_sk bigint,
      cs_catalog_page_sk bigint,
      cs_ship_mode_sk bigint,
      cs_warehouse_sk bigint,
      cs_promo_sk bigint,
      cs_quantity int,
      cs_wholesale_cost decimal(7,2),
      cs_list_price decimal(7,2),
      cs_sales_price decimal(7,2),
      cs_ext_discount_amt decimal(7,2),
      cs_ext_sales_price decimal(7,2),
      cs_ext_wholesale_cost decimal(7,2),
      cs_ext_list_price decimal(7,2),
      cs_ext_tax decimal(7,2),
      cs_coupon_amt decimal(7,2),
      cs_ext_ship_cost decimal(7,2),
      cs_net_paid decimal(7,2),
      cs_net_paid_inc_tax decimal(7,2),
      cs_net_paid_inc_ship decimal(7,2),
      cs_net_paid_inc_ship_tax decimal(7,2),
      cs_net_profit decimal(7,2)
    )
    DUPLICATE KEY (cs_order_number, cs_item_sk)
    DISTRIBUTED BY HASH(cs_order_number, cs_item_sk) BUCKETS 90
    PROPERTIES(
      "replication_num"="1", 
      "datacache.enable" = "true"
    );
    
    
    --建立catalog_sales_nocache表。
    CREATE TABLE IF NOT EXISTS catalog_sales_nocache(
      cs_order_number bigint,
      cs_item_sk bigint,
      cs_sold_date_sk bigint,
      cs_sold_time_sk bigint,
      cs_ship_date_sk bigint,
      cs_bill_customer_sk bigint,
      cs_bill_cdemo_sk bigint,
      cs_bill_hdemo_sk bigint,
      cs_bill_addr_sk bigint,
      cs_ship_customer_sk bigint,
      cs_ship_cdemo_sk bigint,
      cs_ship_hdemo_sk bigint,
      cs_ship_addr_sk bigint,
      cs_call_center_sk bigint,
      cs_catalog_page_sk bigint,
      cs_ship_mode_sk bigint,
      cs_warehouse_sk bigint,
      cs_promo_sk bigint,
      cs_quantity int,
      cs_wholesale_cost decimal(7,2),
      cs_list_price decimal(7,2),
      cs_sales_price decimal(7,2),
      cs_ext_discount_amt decimal(7,2),
      cs_ext_sales_price decimal(7,2),
      cs_ext_wholesale_cost decimal(7,2),
      cs_ext_list_price decimal(7,2),
      cs_ext_tax decimal(7,2),
      cs_coupon_amt decimal(7,2),
      cs_ext_ship_cost decimal(7,2),
      cs_net_paid decimal(7,2),
      cs_net_paid_inc_tax decimal(7,2),
      cs_net_paid_inc_ship decimal(7,2),
      cs_net_paid_inc_ship_tax decimal(7,2),
      cs_net_profit decimal(7,2)
    )
    DUPLICATE KEY(cs_order_number, cs_item_sk)
    DISTRIBUTED BY HASH(cs_order_number, cs_item_sk) BUCKETS 90
    PROPERTIES(
      "replication_num"="1",
      "datacache.enable" = "false"
    );
  2. 資料匯入測試。

    1. 編輯並上傳測試資料到OSS。

      說明

      本文樣本通過ECS執行個體執行以下命令,您也可以在本地執行。建立ECS執行個體的具體操作,請參見通過控制台使用ECS執行個體(快捷版)

      1. 通過以下命令,編輯upload.sh指令碼。

        vim upload.sh
      2. upload.sh中新增以下內容。

        #!/bin/bash
        
        # 日期時間
        date_time=`date +%Y-%m-%d-%H-%M-%S`
        
        yum install -y wget unzip
        mkdir -p /data/
        curl https://gosspublic.alicdn.com/ossutil/install.sh | sudo bash
        wget  -O catalog_sales.zip  "https://starrocks-oss.oss-cn-beijing.aliyuncs.com/public-access/catalog_sales.zip" &&  unzip -o catalog_sales.zip -d /data/
        echo download data finish
        upload_url=$1
        #ossutil cp -r /data/   ${upload_url}
        
        endpoint="oss-cn-****-internal.aliyuncs.com"
        accessKeyId="<yourAccessKeyID>"
        accessKeySecret="<yourAccessKeySecret>"
        
        echo ossutil64 -e ${endpoint} -i ${accessKeyId} -k ${accessKeySecret} cp -r /data/   ${upload_url}
        ossutil64 -e ${endpoint} -i ${accessKeyId} -k ${accessKeySecret} cp -r -f /data/   ${upload_url}
        echo success for data upload

        請根據實際情況替換檔案中的endpointaccessKeyIdaccessKeySecret

        參數

        說明

        endpoint

        訪問OSS的Endpoint。例如,oss-cn-hangzhou-internal.aliyuncs.com。

        如果StarRocks與OSS位於同一地區,則使用VPC網路Endpoint,否則使用公網Endpoint。擷取方法請參見OSS地區和訪問網域名稱

        accessKeyId

        訪問OSS的AccessKey ID。您可以進入AccessKey管理頁面擷取AccessKey ID。

        accessKeySecret

        AccessKey ID對應的 AccessKey Secret。

      3. 執行以下命令,將測試資料上傳至指定的OSS路徑。

        sh upload.sh 'oss://<yourBucketName>/tcp_ds/'
        說明

        其中,oss://<yourBucketName>/tcp_ds/為測試資料上傳的路徑,您可以根據實際情況修改。資料上傳完成後,系統會在目標路徑下的tcp_ds/data/目錄中產生.parquet檔案。

    2. 使用Broker Load匯入測試資料(約10 GB)。

      -- 匯入資料到catalog_sales。
      LOAD LABEL cloud_db.catalog_sales_0001
      (
        DATA INFILE("<file_path>")
        INTO TABLE catalog_sales
        format as "parquet"
      )
      WITH BROKER 'broker'
      (
        "fs.oss.accessKeyId" = "<yourAccessKeyID>",
        "fs.oss.accessKeySecret" = "<yourAccessKeySecret>",
        "fs.oss.endpoint" = "<yourBucketEndpoint>"
      );
      
      
      -- 匯入資料到catalog_sales_nocache。
      LOAD LABEL cloud_db.catalog_sales_0003
      (
        DATA INFILE("<file_path>")
        INTO TABLE catalog_sales_nocache
        format as "parquet"
      )
      WITH BROKER 'broker'
      (
        "fs.oss.accessKeyId" = "<yourAccessKeyID>",
        "fs.oss.accessKeySecret" = "<yourAccessKeySecret>",
        "fs.oss.endpoint" = "<yourBucketEndpoint>"
      );

      請根據實際情況替換以下參數。

      參數

      說明

      <file_path>

      為測試資料的路徑,請根據實際情況修改。例如,oss://<yourBucketName>/tcp_ds/data/*.parquet。

      fs.oss.accessKeyId

      訪問OSS的AccessKey ID。您可以進入AccessKey管理頁面擷取AccessKey ID。

      fs.oss.accessKeySecret

      AccessKey ID對應的 AccessKey Secret。

      fs.oss.endpoint

      訪問OSS的Endpoint。例如,oss-cn-hangzhou-internal.aliyuncs.com。

      如果StarRocks與OSS位於同一地區,則使用VPC網路Endpoint,否則使用公網Endpoint。擷取方法請參見OSS地區和訪問網域名稱

    3. 匯入任務頁面,可以查看測試結果。

      測試結果如下表所示。

      表名稱

      本機快取

      表類型

      匯入用時

      catalog_sales

      開啟

      明細表

      1分21秒

      catalog_sales_nocache

      關閉

      明細表

      1分20秒

      測試結果表明,存算分離模式下,啟用本機快取對資料匯入效能的影響極低。

  3. 資料查詢測試。

    針對開啟本機快取和不開啟本機快取兩種情境進行了測試,以評估本機快取對查詢效能的影響。在StarRocks的存算分離模式下,Query執行引擎會在查詢執行過程中記錄訪問緩衝和Object Storage Service的指標,並將其記錄在Profile中。因此,我們可以使用Profile工具來查看相關指標。

    1. 設定最大Query逾時時間。

      SET GLOBAL query_timeout = 1200;
    2. 執行查詢。

      -- 查詢catalog_sales(開啟本機快取)。
      SELECT cs_item_sk, cs_bill_customer_sk 
      FROM cloud_db.catalog_sales 
      GROUP BY cs_item_sk, cs_bill_customer_sk 
      ORDER BY cs_item_sk DESC 
      LIMIT 100;
      
      -- 查詢catalog_sales_nocache(關閉本機快取)。
      SELECT cs_item_sk, cs_bill_customer_sk 
      FROM cloud_db.catalog_sales_nocache 
      GROUP BY cs_item_sk, cs_bill_customer_sk 
      ORDER BY cs_item_sk DESC 
      LIMIT 100;
    3. 查看Profile指標。

      在左側導覽列中選擇診斷與分析 > SQL任務,找到對應的Query,在執行詳情頁簽可以看到Profile執行樹,找到CONNECTOR_SCAN節點,右側指標中主要關注CompressedBytesReadLocalDisk(從本機快取讀取)和CompressedBytesReadRemote(從遠端OSSObject Storage Service讀取)兩個指標。

      本樣本中,catalog_sales表開啟了本機快取,指標值CompressedBytesReadLocalDisk>0,因此可以確定查詢全部命中了本機快取,查詢速度顯著提升。

      catalog_sales_nocache表沒有開啟本機快取,指標值CompressedBytesReadLocalDisk=0,查詢資料未命中本機快取,資料全部來自遠端OSSObject Storage Service。

步驟三:對比存算分離和存算一體的效能

以下內容通過一個測試案例,為您展示了存算分離帶本機快取和存算一體兩種模式下的查詢效能對比。您可以使用TPC-H測試集進行更詳細的效能對比測試,詳情請參見測試說明

  1. 準備資料環境。

    • 叢集資源配置:1FE(8CU)+3BE(算力:16CU|儲存:1000 GB)。

    • 叢集參數:使用預設設定,存算分離叢集開啟本機快取。

    • 資料量:500 GB(sf=500),經過壓縮後約為180 GB。

  2. 測試結果。

    • 存算一體22條SQL總計用時:302.063秒。

    • 存算分離22條SQL總計用時(第2次執行時開啟本機快取的情況下):333.390秒。

    根據TPC-H的結果顯示,在開啟本機快取的情況下,存算分離和存算一體的查詢效能基本相同。

相關文檔

  • 如需瞭解Query Profile更多資訊,請參見Query Profile介紹

  • 如果您想有效地查看和解讀Query Profile以最佳化StarRocks查詢效能。