本文匯總了使用EMR Serverless StarRocks時的常見問題。
如何跨帳號訪問OSS?
在使用Serverless StarRocks進行資料匯入或資料湖操作時,您可能需要訪問不同阿里雲賬戶下的OSS資源。預設情況下,Serverless StarRocks已配置為對當前賬戶下的OSS Bucket提供無密碼的自動存取權限。如果您需要訪問其他賬戶下的OSS資源,則需先取消當前的預設設定,並手動設定目標賬戶的存取金鑰,然後提交參數以使配置生效。
禁用現有免密訪問:在參數配置頁簽的以下檔案中,刪除配置項的值,保持配置項內容為空白。
core-site.xml
fs.oss.credentials.provider =jindosdk.cfg
fs.oss.provider.format = fs.oss.provider.endpoint =
添加目標帳號的AccessKey:在參數配置頁簽,單擊新增配置項,在以下檔案中添加下列配置資訊。
core-site.xml
fs.oss.accessKeyId = 目標帳號的AccessKey ID fs.oss.accessKeySecret = 目標帳號的AccessKey Secretjindosdk.cfg
fs.oss.accessKeyId = 目標帳號的AccessKey ID fs.oss.accessKeySecret = 目標帳號的AccessKey Secret
使配置項生效:在參數配置頁簽,單擊提交參數。
如何使用UDF和JDBC連接器驅動?
在使用UDF和JDBC驅動前,您需要從外部擷取相應的JAR檔案。
上傳JAR檔案至OSS,詳情請參見上傳檔案。
在上傳檔案時,請將檔案 ACL設定為公用讀寫,以確保上傳的JAR檔案具備公用讀寫許可權。
擷取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>。
使用JAR檔案,詳情請參見Java UDF和JDBC Catalog。
如何重設執行個體的密碼?
重設執行個體的密碼將導致用戶端與服務端串連中斷,因此請務必在業務低峰期對生產環境進行此操作。
僅具備AliyunEMRStarRocksFullAccess許可權的使用者才能執行密碼重設操作。
進入執行個體詳情頁面。
在左側導覽列,選擇。
單擊目標執行個體的名稱。
在執行個體詳情頁面,單擊基礎資訊地區的重設密碼。
在彈出的對話方塊中,輸入新密碼和確認密碼,單擊確定。
為什麼向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錯誤,該如何處理?
為什麼在SQL Editor中執行包含分號的SQL時會報錯?
問題現象:在SQL Editor中執行包含分號(
;)的SQL時報錯,報錯資訊包含the most similar input is {a legal identifier}。
問題原因:因為SQL Editor預設將分號(
;)作為語句結束符。如果您的SQL語句中包含分號(;),則會導致文法解析錯誤。解決方案:
設定自訂分隔字元。
在執行包含分號的SQL語句前,設定一個自訂分隔字元,以避免文法解析錯誤。例如,改為
$$。delimiter $$執行包含分號的SQL語句。本文樣本如下所示。
INSERT INTO sr_test VALUES (1, 'asdsd,asdsads'), (2, 'sadsad;asdsads');恢複預設分隔符號。
在執行完SQL語句後,恢複預設的分隔字元(
;),以便後續的SQL操作可以正常使用。delimiter ;驗證結果。
執行查詢語句驗證資料是否正確插入。

為什麼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_timeFreeBSD/macOS:
net.inet.tcp.keepidle
串連空閑多久後發送第一個Keepalive探測包(單位:秒)。
600秒
Linux系統:
net.ipv4.tcp_keepalive_intvlFreeBSD/macOS:
net.inet.tcp.keepintvl
Keepalive探測包的重傳間隔(單位:秒)。
60秒
Linux系統:
net.ipv4.tcp_keepalive_probesFreeBSD/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) } }) // ... 其他動作 ... }