このトピックでは、EMR Serverless StarRocks に関するよくある質問に回答します。
アカウント間で OSS にアクセスする方法
Serverless StarRocks でデータをインポートしたり、データレイク操作を実行したりする際に、別の Alibaba Cloud アカウントに属する OSS リソースにアクセスする必要がある場合があります。デフォルトでは、Serverless StarRocks は現在のアカウントの OSS バケットへのパスワードなしのアクセス用に構成されています。別のアカウントの OSS リソースにアクセスするには、このデフォルト設定を無効にし、宛先アカウントの AccessKey ペアを手動で構成してから、パラメーターを送信して新しい構成を適用する必要があります。
パスワードなしのアクセスを無効にするには、[パラメーター設定] タブで、指定されたファイル内の次の設定項目の値をクリアします。
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) および Java Database Connectivity (JDBC) ドライバーを使用する前に、必要な JAR ファイルを取得する必要があります。
JAR ファイルを OSS にアップロードします。 詳細については、「ファイルのアップロード」をご参照ください。
JAR ファイルをアップロードする際は、[ファイル ACL] を [パブリック読み書き] に設定して、パブリックな読み取りおよび書き込み権限を付与します。
各 JAR ファイルの URL を取得します。
OSS コンソールで、アップロードした各 JAR ファイルの URL を見つけます。内部エンドポイントの HTTP URL を使用します。URL は次のいずれかのフォーマットを使用します:
JDBC ドライバーの場合:
http://<YourBucketName>.oss-cn-xxxx-internal.aliyuncs.com/mysql-connector-java-*.jarUDF の場合:
http://<YourBucketName>.oss-cn-xxxx-internal.aliyuncs.com/<YourPath>/<jar_package_name>
インスタンスのパスワードをリセットする方法
インスタンスのパスワードをリセットすると、クライアントとサーバー間の接続が中断されます。中断を最小限に抑えるため、本番環境ではオフピーク時間にこの操作を実行することをお勧めします。
AliyunEMRStarRocksFullAccess 権限を持つユーザーのみがパスワードをリセットできます。
インスタンスの詳細ページに移動します。
E-MapReduce コンソールにログインします。
左側のナビゲーションウィンドウで、 を選択します。
対象のインスタンスの名前をクリックします。
[インスタンス詳細] ページの [基本情報] セクションで、[パスワードのリセット] をクリックします。
表示されるダイアログボックスで、新しいパスワードを入力して確認し、[OK] をクリックします。
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原因: このエラーは、権限が不十分であるか、インスタンスのバージョンが古いことが原因である可能性があります。
解決策:
RAM ユーザーの権限を確認します。Resource Access Management (RAM) ユーザーが StarRocks を操作するために必要な権限を持っていることを確認してください。詳細については、「RAM ユーザーに権限を付与する」をご参照ください。
権限が正しい場合は、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}が含まれます。
原因: 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) 内で実行されます。デフォルトでは、VPC はインターネットに直接アクセスできません。そのため、インターネットアクセスが構成されていない場合、データのインポートや外部テーブルのクエリなど、インターネットリソースへのアクセス要求は失敗します。
解決策: VPC にインターネット NAT ゲートウェイをデプロイし、SNAT 機能を有効にすることができます。これにより、Serverless StarRocks インスタンスはゲートウェイを介してインターネットリソースにアクセスできるようになります。詳細については、「インターネット NAT ゲートウェイの SNAT 機能を使用してインターネットにアクセスする」をご参照ください。
StarRocks インスタンスの CLB/SLB がアイドルタイムアウトによりクライアント接続を閉じるのを防ぐ方法
現象: 複数の FE ノードを持つ StarRocks インスタンスでは、負荷分散のために Server Load Balancer (SLB) を有効にできます。詳細については、「ゲートウェイの管理」をご参照ください。StarRocks インスタンスで SLB を有効にした後、SQL クエリの実行時間が 900 秒を超えると、SLB はクライアント接続を強制的に閉じます。この操作により、クエリ結果が返されなくなります。
原因: SLB TCP 接続の最大アイドルタイムアウトは 900 秒です。長時間実行される SQL クエリの実行中など、接続上で 900 秒間データが送信されない場合、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.confecho "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 のサポートは限定的です。ただし、リフレクションまたは低レベルのソケットオプションを使用して実装できます。
説明次のコードは、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 パラメーターを設定する (低レベルのソケットオプションが必要) 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(); } } // リフレクションを使用してシステム固有のソケットオプションを設定する (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_KEEPIDLEの代わりにTCP_KEEPALIVEが必要になる場合があります。一部のパラメーターは設定に 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) } }) // ... その他の操作 ... }