Tous les produits
Search
Centre de documentation

E-MapReduce:FAQ

Dernière mise à jour :Sep 23, 2026

Cette rubrique répond aux questions fréquemment posées concernant EMR Serverless StarRocks.

Comment accéder à OSS depuis un autre compte ?

Par défaut, EMR Serverless StarRocks permet d'accéder sans mot de passe aux buckets OSS situés dans le même compte. Pour accéder aux ressources OSS d'un autre compte, vous devez désactiver cette option par défaut, configurer la paire AccessKey du compte cible et appliquer la nouvelle configuration.

  1. Désactivez l'accès sans mot de passe : sous l'onglet Parameter Configuration, effacez les valeurs des éléments de configuration suivants dans les fichiers spécifiés.

    • core-site.xml

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

      fs.oss.provider.format =
      fs.oss.provider.endpoint =
  2. Ajoutez la paire AccessKey du compte cible : sous l'onglet Parameter Configuration, cliquez sur Add Configuration Item et ajoutez les configurations suivantes aux fichiers spécifiés.

    • core-site.xml

      fs.oss.accessKeyId = AccessKey ID of the target account
      fs.oss.accessKeySecret = AccessKey Secret of the target account
    • jindosdk.cfg

      fs.oss.accessKeyId = AccessKey ID of the target account
      fs.oss.accessKeySecret = AccessKey Secret of the target account
  3. Appliquez la configuration : sous l'onglet Parameter Configuration, cliquez sur Submit Parameters.

Utilisation des pilotes UDF et JDBC connector

Avant d'utiliser les pilotes UDF et JDBC, vous devez obtenir les fichiers JAR requis depuis une source externe.

  1. Téléchargez les fichiers JAR vers OSS. Pour plus d'informations, consultez la section Télécharger des fichiers.

    Lors du téléchargement des fichiers, définissez la valeur object ACL sur Public Read/Write afin d'accorder des autorisations de lecture et d'écriture publiques aux fichiers JAR.

  2. Obtenez l'URL de chaque fichier JAR.

    Dans la console OSS, localisez le lien correspondant à chaque fichier JAR correctement téléchargé. Utilisez l'URL HTTP du endpoint interne, qui doit respecter l'un des formats suivants :

    • Pour un pilote JDBC : http://<YourBucketName>.oss-cn-xxxx-internal.aliyuncs.com/mysql-connector-java-*.jar.

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

  3. Utilisez les fichiers JAR. Pour plus d'informations, consultez les sections Java UDF et JDBC Catalog.

Comment réinitialiser le mot de passe de l'instance ?

Important
  • La réinitialisation du mot de passe de l'instance interrompt les connexions client-serveur. Afin de minimiser l'impact sur la production, effectuez cette opération pendant les heures creuses.

  • Seuls les utilisateurs disposant de l'autorisation AliyunEMRStarRocksFullAccess peuvent réinitialiser le mot de passe.

  1. Accédez à la page des détails de l'instance.

    1. Connectez-vous à la console E-MapReduce.

    2. Dans le volet de navigation de gauche, choisissez EMR Serverless > StarRocks.

    3. Cliquez sur le nom de l'instance cible.

  2. Sur la page Instance Details, dans la section Basic Information, cliquez sur Reset Password.

  3. Dans la boîte de dialogue qui s'affiche, saisissez et confirmez le nouveau mot de passe, puis cliquez sur OK.

Erreur lors de l'écriture de données dans les tables Paimon

  • Symptôme : lorsque vous utilisez StarRocks pour écrire des données dans une table Paimon, le message d'erreur suivant peut s'afficher :

    (5025, 'Backend node not found. Check if any backend node is down.')
  • Cause : une vérification des autorisations dans les tables Paimon peut empêcher StarRocks d'identifier correctement les nœuds BE lors des opérations d'écriture.

  • Solution :

    • Mettre à niveau la version (recommandé) : si la version de votre instance est antérieure à l'une des versions suivantes, effectuez une mise à jour mineure pour appliquer le correctif.

      • StarRocks 3.2 : 3.2.11-1.89 ou version ultérieure

      • StarRocks 3.3 : 3.3.8-1.88 ou version ultérieure

    • Solution de contournement : sous l'onglet Parameter Configuration de l'instance StarRocks, ajoutez l'élément de configuration suivant au fichier core-site.xml.

      dlf.permission.clientCheck=false

Que faire si vous recevez l'erreur not a RAM user lors de la création d'une table étrangère dans StarRocks ?

  • Symptôme : lors de la création d'une table étrangère dans StarRocks, le message d'erreur suivant peut s'afficher :

    current user is not a RAM user
  • Cause : cette erreur est due à des autorisations insuffisantes ou à une version obsolète de l'instance.

  • Solution :

    1. Vérifiez les autorisations de l'utilisateur RAM : assurez-vous que l'utilisateur Resource Access Management (RAM) dispose des autorisations requises pour StarRocks. Pour plus d'informations, consultez la section Accorder des autorisations à un utilisateur RAM.

    2. Si les autorisations sont correctes, vérifiez et mettez à niveau la version du noyau sur la page Instance Details de StarRocks.

      Si la version de votre instance est antérieure à l'une des versions suivantes, effectuez une mise à jour mineure pour appliquer le correctif.

      • StarRocks 3.2 : 3.2.11-1.89 ou version ultérieure

      • StarRocks 3.3 : 3.3.8-1.88 ou version ultérieure

Erreur liée aux points-virgules dans l'éditeur SQL

  • Symptôme : lorsque vous exécutez une instruction SQL contenant un point-virgule (;) dans l'éditeur SQL, une erreur se produit. Le message d'erreur inclut the most similar input is {a legal identifier}.

    Le code d'erreur est 1064 et les détails incluent également Unexpected input '<EOF>', ce qui indique une erreur de syntaxe à la ligne 3, colonne 11.

  • Cette erreur survient car l'éditeur SQL utilise le point-virgule (;) comme terminateur d'instruction par défaut. Si votre instruction SQL contient un point-virgule (;), une erreur d'analyse syntaxique se produit.

  • Solution :

    1. Définissez un délimiteur personnalisé.

      Avant d'exécuter une instruction SQL contenant un point-virgule, définissez un délimiteur personnalisé pour éviter les erreurs d'analyse syntaxique. Par exemple, vous pouvez remplacer le délimiteur par $$.

      delimiter $$
    2. Exécutez l'instruction SQL contenant un point-virgule. Voici un exemple :

      INSERT INTO sr_test VALUES 
      (1, 'asdsd,asdsads'), 
      (2, 'sadsad;asdsads');
    3. Rétablissez le délimiteur par défaut.

      Une fois l'instruction SQL exécutée, rétablissez le délimiteur par défaut (;) afin que les opérations SQL suivantes puissent s'exécuter comme prévu.

      delimiter ;
    4. Vérifiez le résultat.

      Exécutez une requête pour vérifier que les données ont été insérées correctement.

      delimiter ;
      SELECT * FROM sr_test;
      Output
        test_id    test_desc
      0       1    asdsd,asdsads
      1       2    sadsad;asdsads

Échec de l'importation des données ou de l'accès aux tables étrangères

  • Symptôme : lorsque vous utilisez EMR Serverless StarRocks pour importer des données ou accéder à une table étrangère, l'importation ou la connexion peut échouer si la destination est une adresse IP publique.

  • Cause : une instance EMR Serverless StarRocks s'exécute par défaut dans un environnement Virtual Private Cloud (VPC), qui peut ne pas avoir d'accès direct à Internet. Par conséquent, les requêtes adressées aux ressources publiques, telles que les importations de données ou les interrogations de tables étrangères, échouent sauf si l'accès à Internet est configuré.

  • Solution : vous pouvez déployer une passerelle NAT Internet dans le VPC et activer la fonctionnalité SNAT. Cela permet à l'instance EMR Serverless StarRocks d'accéder aux ressources publiques via la passerelle. Pour plus d'informations, consultez la section Utiliser la fonctionnalité SNAT d'une passerelle NAT Internet pour accéder à Internet.

Empêcher la fermeture de connexion due au délai d'inactivité SLB/CLB

  • Symptôme : lors de l'utilisation de SLB avec une instance StarRocks, SLB ferme de force la connexion client si une requête SQL s'exécute pendant plus de 900 secondes, empêchant ainsi la requête de renvoyer un résultat. Pour plus d'informations sur l'activation de SLB, consultez la section Gérer les passerelles.

  • Cause : SLB ferme toute connexion TCP inactive depuis plus de 900 secondes. Cela peut se produire lors d'une requête SQL de longue durée, interrompant la connexion avant que StarRocks ne renvoie un résultat.

  • Solution : configurez les paramètres TCP Keepalive côté client pour empêcher SLB de fermer les connexions inactives.

    • Paramètres globaux du noyau (niveau système)

      Modifiez les paramètres du noyau du système d'exploitation pour activer et configurer des paramètres TCP Keepalive appropriés pour toutes les connexions TCP. Cela permet de surveiller l'état des connexions réseau. Le tableau suivant décrit les paramètres à configurer.

      Paramètre

      Description

      Valeur recommandée

      • Linux : net.ipv4.tcp_keepalive_time

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

      Période d'inactivité en secondes après laquelle la première sonde Keepalive est envoyée.

      600 secondes

      • Linux : net.ipv4.tcp_keepalive_intvl

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

      Intervalle en secondes entre les retransmissions des sondes Keepalive.

      60 secondes

      • Linux : net.ipv4.tcp_keepalive_probes

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

      Nombre d'échecs de sonde consécutifs après lesquels la connexion est abandonnée.

      5

      Linux

      • Appliquer les paramètres temporairement

        # Set global Keepalive parameters (root permissions required)
        sudo sysctl -w net.ipv4.tcp_keepalive_time=600   # Corresponds to keepidle (600 seconds)
        sudo sysctl -w net.ipv4.tcp_keepalive_intvl=60   # Corresponds to keepintvl (60 seconds)
        sudo sysctl -w net.ipv4.tcp_keepalive_probes=5   # Corresponds to keepcount (5)
      • Appliquer les paramètres de manière permanente

        Ajoutez le contenu suivant au fichier /etc/sysctl.conf et exécutez sysctl -p pour appliquer les paramètres.

        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

      • Appliquer les paramètres temporairement

        # Set global Keepalive parameters (root permissions required)
        sudo sysctl -w net.inet.tcp.keepidle=600
        sudo sysctl -w net.inet.tcp.keepintvl=60
        sudo sysctl -w net.inet.tcp.keepcnt=5
      • Appliquer les paramètres de manière permanente

        Ajoutez le contenu suivant au fichier /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
    • Paramètres au niveau de l'application

      Vous pouvez utiliser des API spécifiques au langage pour définir les paramètres TCP Keepalive pour une seule connexion.

      Java

      La bibliothèque standard Java offre un support limité pour TCP Keepalive. Toutefois, vous pouvez l'implémenter en utilisant la réflexion ou des options de socket de bas niveau.

      Remarque

      Le code suivant nécessite la prise en charge système d'options telles que tcp_keepidle sous Linux ou FreeBSD. De plus, certaines méthodes, comme la réflexion, peuvent ne pas fonctionner en raison des différences entre les versions de JVM. Nous vous recommandons de tester la compatibilité avant utilisation dans un environnement de production.

      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. Enable Keepalive
                  socket.setKeepAlive(true);
                  // 2. Set Keepalive parameters (requires low-level socket options)
                  SocketChannel channel = socket.getChannel();
                  if (channel != null) {
                      // Set Keepidle (idle time)
                      channel.setOption(StandardSocketOptions.SO_KEEPALIVE, true); // Keepalive must be enabled first
                      setSocketOptionInt(socket, "tcp_keepidle", 600); // Requires system support
                      // Set Keepintvl (retransmission interval)
                      setSocketOptionInt(socket, "tcp_keepintvl", 60);
                      // Set Keepcount (number of failures)
                      setSocketOptionInt(socket, "tcp_keepcnt", 5); // Note: The parameter name may vary by system
                  }
                  // Connect to the server
                  socket.connect(new InetSocketAddress("example.com", 80));
                  // ... Other operations ...
              } catch (IOException e) {
                  e.printStackTrace();
              }
          }
          // Use reflection to set system-specific socket options (such as on 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

      Le module Python socket prend en charge la configuration directe des paramètres TCP Keepalive.

      Remarque

      Les noms de paramètres peuvent varier selon les systèmes d'exploitation. Par exemple, macOS peut nécessiter TCP_KEEPALIVE au lieu de TCP_KEEPIDLE. Certains paramètres peuvent nécessiter des autorisations root pour être définis.

      import socket
      def create_keepalive_socket():
          sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
          # 1. Enable Keepalive
          sock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)
          # 2. Set Keepalive parameters (Linux/FreeBSD)
          # Keepidle: 600 seconds
          sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPIDLE, 600)
          # Keepintvl: 60 seconds
          sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPINTVL, 60)
          # Keepcount: 5
          sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPCNT, 5)
          return sock
      # Example
      sock = create_keepalive_socket()
      sock.connect(("example.com", 80))
      # ... Other operations ...
      sock.close()

      Golang

      Le package net de Golang fournit une configuration Keepalive de base. Toutefois, vous devez utiliser le package de bas niveau syscall pour définir des paramètres détaillés.

      Remarque

      Les noms de paramètres peuvent varier selon les systèmes d'exploitation. Certains paramètres peuvent nécessiter des autorisations root pour être définis.

      package main
      import (
          "fmt"
          "net"
          "syscall"
      )
      func main() {
          // Create a TCP connection
          conn, err := net.Dial("tcp", "example.com:80")
          if err != nil {
              panic(err)
          }
          defer conn.Close()
          // Get the underlying file descriptor
          file, err := conn.(*net.TCPConn).File()
          if err != nil {
              panic(err)
          }
          defer file.Close()
          fd := int(file.Fd())
      
          // Enable Keepalive
          err = syscall.SetsockoptInt(fd, syscall.SOL_SOCKET, syscall.SO_KEEPALIVE, 1)
          if err != nil {
              panic(fmt.Errorf("set SO_KEEPALIVE: %v", err))
          }
          // Set Keepidle (idle time)
          err = syscall.SetsockoptInt(fd, syscall.IPPROTO_TCP, syscall.TCP_KEEPIDLE, 600)
          if err != nil {
              panic(fmt.Errorf("set TCP_KEEPIDLE: %v", err))
          }
          // Set Keepintvl (retransmission interval)
          err = syscall.SetsockoptInt(fd, syscall.IPPROTO_TCP, syscall.TCP_KEEPINTVL, 60)
          if err != nil {
              panic(fmt.Errorf("set TCP_KEEPINTVL: %v", err))
          }
          // Set Keepcount (number of failures)
          err = syscall.SetsockoptInt(fd, syscall.IPPROTO_TCP, syscall.TCP_KEEPCNT, 5)
          if err != nil {
              panic(fmt.Errorf("set TCP_KEEPCNT: %v", err))
          }
          // ... Other operations ...
      }

Une erreur « Unexpected exception: Table '' is not a OLAP table » est signalée lors de la sauvegarde des données StarRocks

  • Symptôme : le message d'erreur suivant est signalé lorsque vous utilisez StarRocks pour créer une sauvegarde instantanée des données.

    Unexpected exception: Table '<table_name>' is not a OLAP table
  • Analyse de la cause :

    • L'instance utilise le mode de séparation stockage-calcul.

      Les instances StarRocks utilisant la séparation stockage-calcul ne prennent pas en charge la sauvegarde et la restauration des données. Seules les instances avec stockage et calcul intégrés prennent en charge cette fonctionnalité.

    • Le type de moteur de table est incompatible.

      La fonctionnalité de sauvegarde StarRocks prend uniquement en charge les tables utilisant le moteur OLAP. Si le type de moteur d'une table n'est pas OLAP, cette erreur est signalée.

  • Solution :

    • Vérifiez le type d'instance.

      Sur la page Instance List de StarRocks, vérifiez la valeur Instance Type. Si le type d'instance est Storage-Compute Separation, la sauvegarde et la restauration des données ne sont pas prises en charge. Nous vous recommandons d'utiliser une instance avec stockage et calcul intégrés pour activer la sauvegarde et la restauration. Pour plus d'informations, consultez la section Sauvegarde et restauration.

    • Vérifiez le type de moteur de table.

      Vérifiez la définition DDL de la table cible pour confirmer si ENGINE=OLAP est défini.

      SHOW CREATE TABLE <table_name>;

      Si le moteur de la table n'est pas OLAP, recréez la table en fonction de vos besoins métier et assurez-vous que ENGINE=OLAP est spécifié.

L'importation de données dans une table Primary Key échoue avec le message d'erreur : Cancelled, msg: Primary-key index exceeds the limit

  • Problème :

    L'importation de données dans une table Primary Key échoue avec le message d'erreur : msg: Cancelled, msg: Primary-key index exceeds the limit. tablet_id: 2506733, consumption: 33176971421, limit: 32116807950. Memory stats of top five tablets: 3656508(4465M) 3656496(4464M) 3656544(4464M) 3656520(4462M) 3656532(4461M): be: backend-0.backend.xxx.svc.cluster.local.xxx

  • Approche de dépannage :

    • Analysez l'utilisation actuelle de la mémoire du nœud BE pour déterminer s'il existe un goulot d'étranglement des ressources.

    • Déterminez si le cluster utilise une architecture shared-nothing ou shared-data, et vérifiez les éléments de configuration correspondants.

  • Étapes de dépannage détaillées :

    • Analyser l'utilisation de la mémoire

      • L'erreur se produit parce que la mémoire consommée par l'index de clé primaire dépasse la limite de mémoire du nœud BE.

      • Vérifiez la configuration mem_limit du nœud BE, que vous pouvez obtenir en exécutant SHOW FRONTENDS ou SHOW BACKENDS, et évaluez sa capacité mémoire disponible.

    • Solutions

      • Solution 1 : Activer les index persistants (recommandé)

        • Cluster shared-nothing : définissez enable_persistent_index sur true.

        • Cluster shared-data : définissez persistent_index_type sur cloud_native.

      • Solution 2 : Concevoir des partitions appropriées

        • Partitionnez la table Primary Key selon des dimensions appropriées, telles que l'heure ou la région, afin d'éviter d'écrire dans l'intégralité de la table.

        • Une fois la table partitionnée, chaque écriture n'affecte qu'un sous-ensemble des partitions. L'index de clé primaire doit charger les données uniquement à partir des partitions concernées, ce qui réduit la pression mémoire de chaque écriture.

Échec du job de chargement avec l'erreur « [E1008]Reached timeout=xxx ms »

  • Problème :

    • Lorsqu'un job Flink charge des données dans StarRocks, l'erreur suivante se produit : Message: [E1008] Reached timeout=7500ms @x.x.x.x:8060.

    • Lorsque les données sont chargées à l'aide de INSERT INTO, l'erreur suivante se produit : java.sql.SQLException: [E1008] Reached timeout=7500ms @10.106.7.182:8060.

  • Dépannage :

    • Si la valeur de délai d'expiration dans l'erreur n'est pas 30 000 ms, qui est la valeur par défaut de rpc_connect_timeout_ms, vérifiez si le paramètre rpc_connect_timeout_ms du nœud BE a été modifié manuellement.

    • Pour les jobs de chargement utilisant INSERT INTO, vérifiez si le paramètre query_timeout est configuré, par exemple query_timeout = 15. StarRocks définit le seuil de délai d'expiration RPC à la moitié de la valeur query_timeout et convertit le résultat en millisecondes. Par conséquent, si query_timeout=15, le délai d'expiration correspondant est de 7 500 ms.

  • Étapes de dépannage détaillées :

    • Si vous confirmez que le paramètre rpc_connect_timeout_ms du nœud BE a été modifié : restaurez le paramètre à sa valeur par défaut de 30 000 ms pour éviter les fausses erreurs de délai d'expiration causées par un délai de connexion trop court.

    • L'erreur Reached timeout=7500ms indique généralement une charge élevée des threads brpc sur le nœud BE. Cela retarde le traitement des requêtes RPC et déclenche finalement un délai d'expiration.

    • Exécutez SHOW TABLET FROM <destination_database>.<destination_table> ORDER BY RowCount DESC ; pour analyser la distribution des données de la table de destination et déterminer si les données sont correctement réparties entre les tablets. Par exemple, si la quantité de données dans une seule tablette dépasse considérablement la plage recommandée de 1 Go à 10 Go, certains nœuds BE peuvent devenir surchargés, ce qui dégrade les performances d'écriture.

    • Solutions :

      • Solution 1 (recommandée) : optimisez la stratégie de bucketing de la table. Sélectionnez un champ à cardinalité élevée approprié comme clé de bucketing dans DISTRIBUTED BY HASH(...) pour répartir les données uniformément entre les tablets.

      • Solution 2 (atténuation temporaire) : si l'utilisation du processeur et des E/S sur les nœuds BE n'a pas atteint ses limites, ajustez les paramètres suivants selon les besoins :

        • Augmentez brpc_num_threads. La valeur par défaut correspond au nombre de cœurs de processeur sur le nœud BE. Vous pouvez essayer de définir le paramètre sur deux ou quatre fois sa valeur par défaut. Ne dépassez pas quatre fois la valeur par défaut, car cela pourrait augmenter la contention des threads.

        • Augmentez flush_thread_num_per_store. La valeur par défaut est 2. Vous pouvez définir le paramètre sur 4 pour augmenter la concurrence lors de l'écriture des données sur les disques.

Échec du job de chargement avec l'erreur « Error:NULL value in non-nullable column 'xxx' »

  • Problème : lorsque vous chargez des données dans une table StarRocks, l'erreur suivante se produit : Error: NULL value in non-nullable column 'xxx'.

  • Cause : une valeur NULL est écrite dans une colonne définie comme NOT NULL. Cela viole la contrainte de schéma de table et entraîne l'échec du job de chargement.

  • Solutions :

    • Solution 1 : corriger les données en amont

      Avant l'écriture des données dans StarRocks, filtrez ou remplacez les valeurs NULL pour garantir que les données respectent les contraintes de la table de destination.

    • Solution 2 : modifier le schéma de table

      Si la logique métier autorise le champ à contenir des valeurs NULL, modifiez le schéma de table et supprimez la contrainte NOT NULL.

L'erreur « because of too many versions, current/limit: 1009/1000 » se produit lors de l'importation de données à l'aide de Flink Connector

  • Problème :

    Lorsque vous écrivez continuellement des données dans une table StarRocks à l'aide de Flink Connector, l'erreur suivante se produit : because of too many versions, current/limit: 1009/1000.

  • Cause : dans le modèle Primary Key de StarRocks ou le modèle Unique Key utilisant Merge-on-Write, chaque importation de données génère une nouvelle version. Pour éviter l'encombrement des métadonnées et garantir les performances des requêtes, le système autorise par défaut chaque partition à conserver jusqu'à 1 000 versions.

  • Solution :

    • Vérifier le score de compaction des partitions

      Exécutez l'instruction SQL suivante pour vérifier la charge de compaction de chaque partition dans la table de destination :

      SELECT 
          TABLE_NAME,
          PARTITION_NAME,
          AvgCS AS avg_compaction_score,
          MaxCS AS max_compaction_score
      FROM information_schema.partitions_meta 
      WHERE TABLE_NAME = 'your_table_name';

      Si la valeur MaxCS — le score de compaction maximal — de la partition concernée est nettement supérieure à 100, la partition contient un grand nombre de petites versions en attente de fusion. Cela indique que la compaction ne s'est pas terminée à temps.

    • Déclencher manuellement la compaction

      Exécutez l'instruction suivante : ALTER TABLE your_db.your_table COMPACT PARTITION your_partition_name;

    • Optimiser les paramètres du sink Flink

      Augmentez les valeurs des paramètres de sink Flink suivants : sink.buffer-flush.max-bytes, sink.buffer-flush.max-rows, sink.buffer-flush.interval-ms. Cela réduit la fréquence d'importation des données et empêche la génération d'un excès de petites versions.

Erreur Failed to get status for file xxx lors de l'interrogation des données à l'aide d'un External Catalog

  • Problème :

    Lorsque vous interrogez une table dans un data lake externe, tel que Paimon ou Iceberg, l'erreur suivante se produit : (1064, 'Failed to get status for file: oss://data-lakehouse-oss-normal/dataware.db/dwd_annotation2_user/metadata/00097-10647858-814a-499e-b300-51c570ee7ee0.metadata.json') L'API OSS renvoie l'erreur suivante :

    <Error>
      <Code>AccessDenied</Code>
      <Message>You have no right to access this object because of bucket acl.</Message>
      <RequestId>68EC744EB6CD8C3539FAB32A</RequestId>
      <HostId>data-lakehouse-oss-normal.oss-cn-shenzhen-internal.aliyuncs.com</HostId>
      <EC>0003-00000001</EC>
      <RecommendDoc>https://api.alibabacloud.com/troubleshoot?q=0003-00000001</RecommendDoc>
    </Error>
  • Cause : StarRocks s'appuie sur l'accès à un service de stockage d'objets, tel qu'Alibaba Cloud OSS, lorsqu'il interroge des tables dans un data lake externe, tel que Hive, Iceberg ou Hudi, à l'aide d'un External Catalog. Des autorisations ou des configurations incorrectes peuvent empêcher StarRocks de lire les métadonnées ou les fichiers de données.

  • Solution :

    • Tout d'abord, vérifiez que l'AccessKey est valide. Confirmez que les valeurs accessKeyId et accessKeySecret configurées permettent d'accéder au bucket OSS de destination.

    • Si les valeurs accessKeyId et accessKeySecret sont correctement configurées, vérifiez si le bucket OSS est accessible depuis d'autres comptes Alibaba Cloud. Pour l'accès intercomptes à un bucket OSS, modifiez les configurations pertinentes. Pour plus d'informations, consultez la section Comment accéder à OSS depuis un autre compte ?.

Comment afficher l'espace disque occupé par les index persistants sur les nœuds CN et BE ?

Une fois les index persistants activés en définissant enable_persistent_index = true ou persistent_index_type = 'cloud_native', les index de clés primaires sont stockés sur les disques. Vous pouvez interroger la table information_schema.be_tablets pour obtenir leur utilisation disque.

-- Query the index size of each table and sort the results, by index size in descending order.
SELECT 
    tables_config.TABLE_NAME,
    t1.TABLE_ID,
    t1.index_sum_mb
FROM (
    -- Calculate the total index size of each table in MB.
    SELECT 
        TABLE_ID,
        SUM(INDEX_DISK)/1024/1024 AS index_sum_mb
    FROM information_schema.be_tablets 
    GROUP BY TABLE_ID
) t1 
JOIN tables_config ON tables_config.TABLE_ID = t1.TABLE_ID 
ORDER BY index_sum_mb DESC
-- Optional: Add a LIMIT clause to limit the number of returned rows when the result set is excessively large.
-- LIMIT 100
;

Comment afficher les transactions d'écriture en cours et les tablets associées à différents lots de transactions ?

Suivez les jobs de chargement en cours ou récemment terminés pour identifier les tablets vers lesquelles les données sont écrites.

SELECT 
    txn_table.*,
    tc.table_name
FROM (
    SELECT 
        bt.TABLET_ID,
        bt.COMMIT_TIME,
        bt.PUBLISH_TIME,
        bt.TABLE_ID
    FROM information_schema.be_txns bt
    JOIN information_schema.be_tablets btt 
        ON bt.TABLET_ID = btt.TABLET_ID
) AS txn_table
JOIN information_schema.tables_config tc 
    ON txn_table.TABLE_ID = tc.TABLE_ID;

Comment analyser une augmentation soudaine de la charge CPU ou mémoire pendant une période spécifique ?

Utilisez les journaux d'audit pour identifier les requêtes qui consomment beaucoup de ressources.

SELECT 
    queryId,
    timestamp,
    ROUND(memCostBytes / 1024 / 1024 / 1024, 2) AS memCostGB,
    cpuCostNs
FROM _starrocks_audit_db_.starrocks_audit_tbl
WHERE timestamp BETWEEN '2025-xx-xx hh:mm:ss' AND '2025-xx-xx hh:mm:ss'
ORDER BY cpuCostNs DESC, memCostGB DESC
LIMIT 20;

Comment analyser une augmentation soudaine de la charge d'E/S pendant une période spécifique ?

Les pics d'E/S sont généralement causés par des analyses à grande échelle, telles que des analyses complètes de table ou des requêtes qui ne peuvent pas utiliser le pruning de partition ou les index.

SELECT 
    queryId,
    timestamp,
    ROUND(scanBytes / 1024 / 1024 / 1024, 2) AS scanTotalGB
FROM _starrocks_audit_db_.starrocks_audit_tbl
WHERE timestamp BETWEEN '2025-xx-xx hh:mm:ss' AND '2025-xx-xx hh:mm:ss'
ORDER BY scanTotalGB DESC
LIMIT 20;

Erreur de stockage insuffisant lors de la réduction du nombre de nœuds BE dans un cluster StarRocks entièrement géré

  • Problème :

    Lorsque vous réduisez le nombre de nœuds BE depuis la console d'un cluster StarRocks entièrement géré, l'erreur suivante apparaît : invalid status: [insufficient storage].

  • Cause : les exigences de validation du stockage pour l'opération de réduction ne sont pas satisfaites. Le système n'autorise l'opération que si la capacité totale de stockage après réduction respecte l'exigence suivante :

    Stockage utilisé < Capacité totale après réduction × 0,7

    Les valeurs sont calculées comme suit :

    • Capacité totale après réduction = Capacité combinée des nœuds restants après suppression des nœuds spécifiés

    • Stockage utilisé = Somme de (capacité totale − capacité disponible) sur tous les nœuds

    • Exécutez SHOW BACKENDS pour obtenir totalCapacity et availCapacity.

  • Solution :

    • Vérifiez la capacité actuelle du cluster.

      Exécutez l'instruction SQL suivante pour obtenir les capacités totales et disponibles de chaque nœud BE :

      SHOW BACKENDS\G

      Vérifiez les champs TotalCapacity et AvailCapacity. Déterminez si le stockage utilisé dépasse 70 % de la capacité totale après réduction.

    • Étendez les disques et réessayez.

      Si la capacité disque est insuffisante, étendez les disques des nœuds BE dans la console EMR. Assurez-vous que Stockage utilisé < Capacité totale après réduction × 0,7, puis réessayez l'opération de réduction.

RAM.Permission.NotAllow est signalé lors de la connexion à StarRocks Manager

  • Problème :

    Lorsque vous utilisez un utilisateur RAM pour vous connecter à StarRocks Manager, le message "You are not authorized to perform the operation" apparaît. Le code d'erreur est RAM.Permission.NotAllow.

  • Cause : l'utilisateur RAM ne dispose pas des autorisations requises pour effectuer des opérations sur EMR Serverless StarRocks et ne peut donc pas accéder à StarRocks Manager. Pour plus d'informations, consultez la section Autoriser un utilisateur RAM.

  • Solution :

    • Méthode 1 : Accorder une politique système.

      Connectez-vous à la console RAM et accordez la politique système AliyunEMRStarRocksFullAccess à l'utilisateur RAM. L'utilisateur RAM dispose alors de toutes les autorisations nécessaires pour effectuer des opérations sur EMR Serverless StarRocks.

    • Méthode 2 : Accorder des autorisations granulaires.

      Si vous ne souhaitez pas accorder toutes les autorisations, utilisez le RequestId dans le message d'erreur pour identifier les autorisations manquantes et les accorder à l'utilisateur RAM dans la console RAM. Par exemple, si l'autorisation emr-serverless-starrocks:ListInstances est manquante, créez une politique personnalisée qui accorde uniquement cette autorisation.

    Sur la page Policies de la console RAM, recherchez AliyunEMRStarRocksFullAccess pour afficher toutes les autorisations incluses dans la politique système.

Comment résoudre l'erreur « must be an aggregate expression or appear in GROUP BY clause » dans StarRocks ?

  • Symptôme : lorsque vous exécutez une requête SQL contenant une clause GROUP BY dans StarRocks, l'erreur suivante se produit si la liste SELECT contient une colonne non agrégée qui n'est pas incluse dans la clause GROUP BY.

    Getting analyzing error: ... must be an aggregate expression or appear in GROUP BY clause
  • Cause : la règle ONLY_FULL_GROUP_BY dans sql_mode déclenche cette erreur. Lorsque cette règle est activée, chaque colonne non agrégée de la liste SELECT doit également apparaître dans la clause GROUP BY.

  • Solution :

    1. Connectez-vous à l'instance StarRocks à l'aide de l'éditeur SQL dans StarRocks Manager ou d'un client MySQL.

    2. Exécutez la commande suivante pour effacer sql_mode et supprimer la règle ONLY_FULL_GROUP_BY.

      SET GLOBAL sql_mode='';
    3. Vérifiez que sql_mode est vide.

      SELECT @@GLOBAL.sql_mode;

    Le paramètre SET GLOBAL sql_mode prend effet immédiatement sans redémarrage du service. La désactivation de ONLY_FULL_GROUP_BY peut produire des valeurs inexactes pour les colonnes non agrégées dans les requêtes GROUP BY. Testez cette modification dans un environnement de test avant de l'appliquer en production. Cette opération modifie le paramètre global.