web-dev-qa-db-fra.com

AWS Firehose?

J'essaie de configurer une application Kinesis Analytics avec les paramètres suivants:

  • Le flux d'entrée est un Kinesis Firehose qui prend des valeurs JSON sous forme de chaîne
  • Le code SQL est un simple relais (il doit être plus compliqué plus tard, mais pour les tests, il envoie simplement les données).
  • Le flux de sortie est un deuxième Kinesis Firehose qui transmet des enregistrements à un compartiment S3.

Plus tard, j'importerai le contenu du compartiment S3 à l'aide de Hive + JSONSERDE, qui attend que chaque enregistrement JSON vive sur sa propre ligne. La sortie Firehose ajoute simplement tous les enregistrements JSON, ce qui casse JSONSERDE.

I Could attache un formateur de données AWS Lambda au flux de sortie, mais cela semble coûteux. Tout ce que je veux, c'est scinder chaque enregistrement à l'aide d'une nouvelle ligne.

Si je n'avais pas d'application Analytics, j'ajouterais la nouvelle ligne à chaque enregistrement Firehose. Il semble étrange qu'il n'y ait aucun moyen de faire cela dans le code SQL de l'application:

CREATE OR REPLACE STREAM "STREAM_OUT" (
  a VARCHAR(4),
  b VARCHAR(4),
  c VARCHAR(4)
);
CREATE OR REPLACE PUMP "STREAM_PUMP" AS
  INSERT INTO "STREAM_OUT"
    SELECT STREAM
      "a",
      "b",
      "c"
    FROM "SOURCE_SQL_STREAM_001";

Est-ce la meilleure solution pour ajouter le formateur de données Lambda? J'aimerais vraiment éviter cela.

12
MrHen

J'avais la même exigence d'ajouter de nouvelles lignes aux fichiers générés par firehose. Dans notre application, firehose est appelé via API Gateway.

Ceci est spécifié dans les modèles de mappage de corps dans la section Demande d'intégration.

La commande suivante dans la passerelle API génère de nouvelles lignes pour les enregistrements kinesis firehose.

Méthode 1:

    #set($payload="$input.path('$.Record.Data')
")
        {
            "DeliveryStreamName": "$input.path('$.DeliveryStreamName')",
            "Record": {
            "Data": "$util.base64Encode($payload)"
        }
        }

Cela fonctionne parfaitement si vous appelez firehose via API Gateway. 

Merci et salutations, Srivignesh KN

2
Srivignesh KN

Un exemple de base ici dans la façon dont nous avons mis en œuvre. Nous avons utilisé javascript pour mettre des enregistrements dans Kinesis Stream et Firehose pour rediriger vos données vers un emplacement s3 avec compression gzip. Plus tard, athena demandera à partir de l’emplacement s3 de récupérer les enregistrements de s3.

Ci-dessous, le code permettant d’ajouter une nouvelle ligne avant d’envoyer à Kinesis Stream à l’aide de code javascript.

var payload = JSON.parse(payload);  
finalData = JSON.stringify(payload)+"\n";

var kinesisPayload = {};    
kinesisPayload.Data = finalData;    
kinesisPayload.StreamName = "kinesisStreamName");    
kinesisPayload.PartitionKey = "124";
0
Sinto