全部產品
Search
文件中心

E-MapReduce:常見問題

更新時間:Aug 09, 2025

本文匯總了使用EMR Serverless StarRocks時的常見問題。

如何跨帳號訪問OSS?

在使用Serverless StarRocks進行資料匯入或資料湖操作時,您可能需要訪問不同阿里雲賬戶下的OSS資源。預設情況下,Serverless StarRocks已配置為對當前賬戶下的OSS Bucket提供無密碼的自動存取權限。如果您需要訪問其他賬戶下的OSS資源,則需先取消當前的預設設定,並手動設定目標賬戶的存取金鑰,然後提交參數以使配置生效。

  1. 禁用現有免密訪問:在參數配置頁簽的以下檔案中,刪除配置項的值,保持配置項內容為空白。

    • core-site.xml

      fs.oss.credentials.provider =
    • jindosdk.cfg

      fs.oss.provider.format =
      fs.oss.provider.endpoint =
  2. 添加目標帳號的AccessKey:在參數配置頁簽,單擊新增配置項,在以下檔案中添加下列配置資訊。

    • core-site.xml

      fs.oss.accessKeyId = 目標帳號的AccessKey ID
      fs.oss.accessKeySecret = 目標帳號的AccessKey Secret
    • jindosdk.cfg

      fs.oss.accessKeyId = 目標帳號的AccessKey ID
      fs.oss.accessKeySecret = 目標帳號的AccessKey Secret
  3. 使配置項生效:在參數配置頁簽,單擊提交參數

如何使用UDF和JDBC連接器驅動?

在使用UDF和JDBC驅動前,您需要從外部擷取相應的JAR檔案。

  1. 上傳JAR檔案至OSS,詳情請參見上傳檔案

    在上傳檔案時,請將檔案 ACL設定為公用讀寫,以確保上傳的JAR檔案具備公用讀寫許可權。

  2. 擷取JAR檔案的URL。

    對於每個成功上傳的JAR檔案,在OSS控制台上找到它對應的連結地址。請使用內部網路Endpoint的HTTP URL,格式如下:

    • 對於JDBC驅動:http://<YourBucketName>.oss-cn-xxxx-internal.aliyuncs.com/mysql-connector-java-*.jar

    • 對於UDF:http://<YourBucketName>.oss-cn-xxxx-internal.aliyuncs.com/<YourPath>/<jar_package_name>

  3. 使用JAR檔案,詳情請參見Java UDFJDBC Catalog

如何重設執行個體的密碼?

重要
  • 重設執行個體的密碼將導致用戶端與服務端串連中斷,因此請務必在業務低峰期對生產環境進行此操作。

  • 僅具備AliyunEMRStarRocksFullAccess許可權的使用者才能執行密碼重設操作。

  1. 進入執行個體詳情頁面。

    1. 登入E-MapReduce控制台

    2. 在左側導覽列,選擇EMR Serverless > StarRocks

    3. 單擊目標執行個體的名稱。

  2. 執行個體詳情頁面,單擊基礎資訊地區的重設密碼

  3. 在彈出的對話方塊中,輸入新密碼和確認密碼,單擊確定

為什麼向Paimon表寫入資料時報錯?

  • 問題現象:在使用StarRocks向Paimon表寫入資料時,可能會遇到以下錯誤資訊。

    (5025, 'Backend node not found. Check if any backend node is down.')
  • 問題原因:Paimon表的許可權檢查機制可能導致StarRocks在進行寫入操作時無法正確識別後端節點。

  • 解決方案:

    • 升級版本(推薦方式) 如果您使用的版本低於下述版本,請您升級小版本,以更新至最新版本並獲得修複。

      • StarRocks 3.2版本:3.2.11-1.89 及以上

      • StarRocks 3.3版本:3.3.8-1.88 及以上

    • 臨時解決方案 在StarRocks執行個體的參數配置頁簽中的 core-site.xml 設定檔中添加以下配置項。

      dlf.permission.clientCheck=false

在StarRocks中建立外表時提示not a RAM user錯誤,該如何處理?

  • 問題現象:在StarRocks中嘗試通過外部表格功能建立外表時,可能會遇到以下錯誤資訊。

    current user is not a RAM user
  • 問題原因:許可權不足或者執行個體版本較低。

  • 解決方案:

    1. 首先檢查RAM帳號許可權:確保使用的RAM帳號具有對StarRocks的操作許可權,詳情請參見為RAM使用者授權

    2. 如果許可權無誤,請在StarRocks執行個體的執行個體詳情頁面,檢查並升級核心版本。

      如果您使用的版本低於以下版本,請您升級小版本,以更新至最新版本並獲得修複。

      • StarRocks 3.2版本:3.2.11-1.89 及以上

      • StarRocks 3.3版本:3.3.8-1.88 及以上

為什麼在SQL Editor中執行包含分號的SQL時會報錯?

  • 問題現象:在SQL Editor中執行包含分號(;)的SQL時報錯,報錯資訊包含the most similar input is {a legal identifier}

    image

  • 問題原因:因為SQL Editor預設將分號(;)作為語句結束符。如果您的SQL語句中包含分號(;),則會導致文法解析錯誤。

  • 解決方案:

    1. 設定自訂分隔字元。

      在執行包含分號的SQL語句前,設定一個自訂分隔字元,以避免文法解析錯誤。例如,改為$$

      delimiter $$
    2. 執行包含分號的SQL語句。本文樣本如下所示。

      INSERT INTO sr_test VALUES 
      (1, 'asdsd,asdsads'), 
      (2, 'sadsad;asdsads');
    3. 恢複預設分隔符號。

      在執行完SQL語句後,恢複預設的分隔字元(;),以便後續的SQL操作可以正常使用。

      delimiter ;
    4. 驗證結果。

      執行查詢語句驗證資料是否正確插入。

      image

為什麼Serverless StarRocks在匯入資料或訪問外表時失敗?

  • 問題現象:在使用Serverless StarRocks進行資料匯入或訪問外部表格時,如果目標地址為公網地址,可能會遇到匯入失敗或串連失敗的問題。

  • 原因分析:Serverless StarRocks執行個體預設運行在Virtual Private Cloud環境中,該環境可能不具備直接存取公網的能力。因此,當需要訪問公網資源(如匯入資料或查詢外部表格)時,若未配置公網訪問能力,請求將無法成功。

  • 解決方案:您可以通過在VPC中部署公網NAT Gateway並啟用SNAT功能,使Serverless StarRocks執行個體能夠通過該網關訪問公網資源。更多資訊,請參見使用公網NAT GatewaySNAT功能訪問互連網

如何避免StarRocks執行個體中的CLB/SLB因串連空閑逾時而關閉用戶端串連?

  • 問題現象:在StarRocks執行個體中,當FE節點數大於1時,可以通過開通SLB(Server Load Balancer)實現負載平衡,詳情請參見管理網關。當StarRocks執行個體開啟SLB後,若SQL查詢執行時間超過900秒,用戶端與SLB之間的串連會被強制斷開,導致查詢結果無法返回。

  • 問題原因:SLB的TCP串連存在一個最大空閑逾時時間(900 秒)。如果用戶端與SLB之間的串連在900秒內沒有資料轉送(例如,執行長時間啟動並執行SQL查詢),SLB會主動關閉該串連。這會導致用戶端在等待StarRocks響應時出現串連中斷的問題。

  • 解決方案:通過設定用戶端的TCP Keepalive參數以維持用戶端和SLB之間的串連,避免串連空閑逾時關閉。

    • 全域核心參數設定(系統級)

      通過修改作業系統的核心參數,為所有TCP串連啟用並配置合理的TCP Keepalive參數,以檢測網路連接的存活狀態。以下是需要設定的參數及其具體含義。

      參數

      含義

      建議值

      • Linux系統:net.ipv4.tcp_keepalive_time

      • FreeBSD/macOS:net.inet.tcp.keepidle

      串連空閑多久後發送第一個Keepalive探測包(單位:秒)。

      600秒

      • Linux系統:net.ipv4.tcp_keepalive_intvl

      • FreeBSD/macOS:net.inet.tcp.keepintvl

      Keepalive探測包的重傳間隔(單位:秒)。

      60秒

      • Linux系統:net.ipv4.tcp_keepalive_probes

      • FreeBSD/macOS:net.inet.tcp.keepcnt

      探測包連續發送失敗的次數,達到此值後中斷連線。

      5次

      Linux系統

      • 臨時生效

        # 設定全域Keepalive參數(需要root許可權)
        sudo sysctl -w net.ipv4.tcp_keepalive_time=600   # 對應keepidle(600秒)
        sudo sysctl -w net.ipv4.tcp_keepalive_intvl=60   # 對應keepintvl(60秒)
        sudo sysctl -w net.ipv4.tcp_keepalive_probes=5   # 對應keepcount(5次)
      • 永久生效

        將以下內容添加到/etc/sysctl.conf,並執行sysctl -p生效。

        echo "net.ipv4.tcp_keepalive_time = 600" >> /etc/sysctl.conf
        echo "net.ipv4.tcp_keepalive_intvl = 60" >> /etc/sysctl.conf
        echo "net.ipv4.tcp_keepalive_probes = 5" >> /etc/sysctl.conf

      FreeBSD/macOS系統

      • 臨時生效

        # 設定全域Keepalive參數(需要root許可權)
        sudo sysctl -w net.inet.tcp.keepidle=600
        sudo sysctl -w net.inet.tcp.keepintvl=60
        sudo sysctl -w net.inet.tcp.keepcnt=5
      • 永久生效

        將以下內容添加到/etc/sysctl.conf

        echo "net.inet.tcp.keepidle = 600" >> /etc/sysctl.conf
        echo "net.inet.tcp.keepintvl = 60" >> /etc/sysctl.conf
        echo "net.inet.tcp.keepcnt = 5" >> /etc/sysctl.conf
    • 程式設計語言適配(應用級)

      通過語言特定的API設定單個串連的TCP Keepalive參數。

      Java

      Java標準庫對TCP Keepalive的支援有限,但可以通過反射或底層Socket選項實現。

      說明

      以下代碼依賴於系統(如Linux/FreeBSD)對 tcp_keepidle等選項的支援。此外,部分方法(如反射)可能因JVM版本差異而失效,建議在實際使用前進行相容性測試。

      import java.io.IOException;
      import java.net.InetSocketAddress;
      import java.net.Socket;
      import java.net.SocketOption;
      import java.nio.channels.SocketChannel;
      
      public class TcpKeepaliveExample {
      
          public static void main(String[ ] args) {
      
              try (Socket socket = new Socket()) {
                  // 1. 啟用 Keepalive
                  socket.setKeepAlive(true);
      
                  // 2. 設定 Keepalive 參數(需通過底層 Socket 選項)
                  SocketChannel channel = socket.getChannel();
                  if (channel != null) {
                      // 設定 Keepidle(空閑時間)
                      channel.setOption(StandardSocketOptions.SO_KEEPALIVE, true); // 必須先啟用 Keepalive
                      setSocketOptionInt(socket, "tcp_keepidle", 600); // 需要系統支援
      
                      // 設定 Keepintvl(重傳間隔)
                      setSocketOptionInt(socket, "tcp_keepintvl", 60);
      
                      // 設定 Keepcount(失敗次數)
                      setSocketOptionInt(socket, "tcp_keepcnt", 5); // 注意:參數名可能因系統而異
                  }
      
                  // 串連到伺服器
                  socket.connect(new InetSocketAddress("example.com", 80));
                  // ... 其他動作 ...
              } catch (IOException e) {
                  e.printStackTrace();
              }
          }
      
          // 通過反射設定系統特定的 Socket 選項(如 Linux/FreeBSD)
          private static void setSocketOptionInt(Socket socket, String optionName, int value) {
              try {
                  Class<?> clazz = Class.forName("java.net.Socket$SocketOptions");
                  Object options = clazz.getDeclaredMethod("options").invoke(socket);
                  Class<?> optionsClass = options.getClass();
                  optionsClass.getDeclaredMethod("setOption", String.class, int.class)
                          .invoke(options, optionName, value);
              } catch (Exception e) {
                  throw new RuntimeException("Failed to set socket option " + optionName, e);
              }
          }
      }

      Python

      Python的socket模組支援直接配置TCP Keepalive參數。

      說明

      不同作業系統可能使用不同的參數名稱(例如,macOS可能需用TCP_KEEPALIVE代替TCP_KEEPIDLE),且部分參數可能需要root許可權才能進行設定。

      import socket
      
      def create_keepalive_socket():
          sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
          
          # 1. 啟用 Keepalive
          sock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)
          
          # 2. 設定 Keepalive 參數(Linux/FreeBSD)
          # Keepidle: 600秒
          sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPIDLE, 600)
          
          # Keepintvl: 60秒
          sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPINTVL, 60)
          
          # Keepcount: 5次
          sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPCNT, 5)
          
          return sock
      
      # 使用樣本
      sock = create_keepalive_socket()
      sock.connect(("example.com", 80))
      # ... 其他動作 ...
      sock.close()

      Golang

      Golang的net包提供了基礎的Keepalive配置,但需通過底層的syscall包設定詳細參數。

      說明

      不同作業系統可能使用不同的參數名稱,且部分參數可能需要root許可權才能進行設定。

      package main
      
      import (
          "fmt"
          "net"
          "syscall"
      )
      
      func main() {
          // 建立 TCP 串連
          conn, err := net.Dial("tcp", "example.com:80")
          if err != nil {
              panic(err)
          }
          defer conn.Close()
      
          // 擷取底層檔案描述符
          fd := conn.(*net.TCPConn).SyscallConn()
      
          // 設定 Keepalive 參數
          fd.Control(func(fdPtr *net.FileDesc) {
              fd := fdPtr.File
              // 啟用 Keepalive
              err = syscall.SetsockoptInt(int(fd), syscall.IPPROTO_TCP, syscall.TCP_KEEPALIVE, 1)
              if err != nil {
                  panic(err)
              }
      
              // 設定 Keepidle(空閑時間)
              err = syscall.SetsockoptInt(int(fd), syscall.SOL_TCP, syscall.TCP_KEEPIDLE, 600)
              if err != nil {
                  panic(err)
              }
      
              // 設定 Keepintvl(重傳間隔)
              err = syscall.SetsockoptInt(int(fd), syscall.SOL_TCP, syscall.TCP_KEEPINTVL, 60)
              if err != nil {
                  panic(err)
              }
      
              // 設定 Keepcount(失敗次數)
              err = syscall.SetsockoptInt(int(fd), syscall.SOL_TCP, syscall.TCP_KEEPCNT, 5)
              if err != nil {
                  panic(err)
              }
          })
      
          // ... 其他動作 ...
      }