web-dev-qa-db-ja.com

AWS Firehoseレコードに自動的に改行を追加できますか?

次の設定でKinesis Analyticsアプリケーションを構成しようとしています:

  • 入力ストリームは、文字列化されたJSON値を取得するKinesis Firehoseです
  • SQLは単純なパススルーです(後でより複雑にする必要がありますが、テストの場合は、データを送信するだけです)。
  • 出力ストリームは、S3バケットにレコードを配信する2番目のKinesis Firehoseです

後で、Hive + JSONSERDEを使用してS3バケットのコンテンツをインポートします。これは、各JSONレコードが独自の行に存在することを期待しています。 Firehoseの出力は、JSONSERDEを壊すすべてのJSONレコードを追加するだけです。

I could AWS Lambdaデータフォーマッターを出力ストリームにアタッチしますが、コストがかかります。改行を使用して各レコードを分割するだけです。

Analyticsアプリなしで実行している場合は、各Firehoseレコードに改行を追加します。アプリのSQLでそれを行う方法がないのは奇妙に思われます。

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";

Lambdaデータフォーマッターを追加する最良の答えは何ですか?これは絶対に避けたいです。

16
MrHen

Firehoseで生成されたファイルに新しい行を追加する同様の要件がありました。このアプリケーションでは、firehoseはAPI Gatewayを介して呼び出されます。

これは、統合リクエストセクションのボディマッピングテンプレートで指定されます。

API Gatewayの次のコマンドは、キネシスファイアホースレコードに新しい行を生成します。

方法1:

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

API Gateway経由でfirehoseを呼び出す場合、これは完全に機能します。

よろしくお願いいたします。SrivigneshKN

2
Srivignesh KN

ここで私たちが実装した方法での基本的な例。 JavaScriptを使用してレコードをKinesis Streamに入れ、Firehoseを使用してgzip圧縮でs3の場所にリダイレクトしました。後でathenaは、s3からレコードをフェッチするためにs3の場所からクエリを実行します。

JavaScriptコードを使用してKinesisストリームに送信する前に新しい行を追加するためのコードの下。

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

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