1 つの記事で Apache Avro データを解析する

1 つの記事で Apache Avro データを解析する

概要: この記事では、Avro データをシリアル化して生成し、FlinkSQL を使用して解析する方法を説明します。

Avro 公式ドキュメント、http://avro.apache.org/docs/current/index.html。

Avroの紹介

Avroはデータシリアル化システムです

提供内容:

  • 豊富なデータ構造
  • コンパクトで高速なバイナリデータ形式
  • 永続的なデータを保存するためのファイル形式
  • リモート プロシージャ コール (RPC) システム
  • 動的言語とのシンプルな対話。データ ファイルの読み取りと書き込み用のコードを生成する必要はなく、RPC プロトコルを使用したり実装したりする必要もありません。コード生成は最適化の一形態ですが、静的言語の場合にのみ意味があります。

技術的背景

インターネットの急速な発展に伴い、クラウドコンピューティング、ビッグデータ、人工知能AI、モノのインターネットなどの最先端技術は、現代の主流のハイテクとなっています。電子商取引サイト、顔認識、自動運転車、スマートホーム、スマートシティなどは、人々の衣食住や交通を促進するだけでなく、さまざまなシステムプラットフォームによって常に大量のデータが収集、整理、分析されています。データの低遅延、高スループット、セキュリティを確保することが特に重要です。Apache Avro自体は、バイナリ転送用のスキーマを通じてシリアル化されており、一方では高速データ転送を、他方ではデータセキュリティを確保しています。Avroは現在、さまざまな業界でますます広く使用されています。Avroデータをどのように処理および解析するかは特に重要です。この記事では、シリアル化によってAvroデータを生成し、FlinkSQLを使用して解析する方法を説明します。

この記事は、Avro 解析のデモです。現在、FlinkSQL は単純な Avro データ解析にのみ適しており、複雑にネストされた Avro データはまだサポートされていません。

シーン紹介

この記事では主に以下の3つのポイントを紹介します。

  • Avro データをシリアル化して生成する方法
  • Avro データをデシリアライズして解析する方法
  • FlinkSQL を使用して Avro データを解析する方法

前提条件

  • Avroの詳細については、Apache Avro公式サイトのクイックスタートガイドを参照してください。
  • Avro アプリケーションのシナリオを理解する

手順

1. 新しいAvro Mavenプロジェクトを作成し、POM依存関係を構成する

pom ファイルの内容は次のとおりです。

<?xml バージョン="1.0" エンコーディング="UTF-8"?>
<プロジェクト xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <モデルバージョン>4.0.0</モデルバージョン>

    <グループID>com.huawei.bigdata</グループID>
    <artifactId>アヴロデモ</artifactId>
    <バージョン>1.0-SNAPSHOT</バージョン>
    <依存関係>
        <依存関係>
            <グループ ID>org.apache.avro</グループ ID>
            <artifactId>アブロ</artifactId>
            <バージョン>1.8.1</バージョン>
        </依存関係>
        <依存関係>
            <groupId>ジュニット</groupId>
            <artifactId>junit</artifactId>
            <バージョン>4.12</バージョン>
        </依存関係>
    </依存関係>

    <ビルド>
        <プラグイン>
            <プラグイン>
                <グループ ID>org.apache.avro</グループ ID>
                <artifactId>Avro-Maven プラグイン</artifactId>
                <バージョン>1.8.1</バージョン>
                <処刑>
                    <実行>
                        <phase>ソースを生成する</phase>
                        <目標>
                            <goal>スキーマ</goal>
                        </目標>
                        <構成>
                            <ソースディレクトリ>${project.basedir}/src/main/avro/</ソースディレクトリ>
                            <出力ディレクトリ>${project.basedir}/src/main/java/</出力ディレクトリ>
                        </構成>
                    </実行>
                </処刑>
            </プラグイン>
            <プラグイン>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <構成>
                    <ソース>1.6</ソース>
                    <target>1.6</target>
                </構成>
            </プラグイン>
        </プラグイン>
    </ビルド>

</プロジェクト>

注: 上記の pom ファイルは、自動的に生成されるクラスのパス、つまり ${project.basedir}/src/main/avro/ と ${project.basedir}/src/main/java/ を構成します。この構成の後、mvn コマンドを実行すると、プラグインはこのディレクトリの avsc スキーマからクラス ファイルを自動的に生成し、後者のディレクトリに配置します。 avro ディレクトリが生成されない場合は、手動で作成します。

2. スキーマを定義する

JSON を使用して Avro のスキーマを定義します。スキーマは、プリミティブ型 (null、boolean、int、long、float、double、bytes、string) と複合型 (record、enum、array、map、union、fixed) で構成されます。たとえば、次の例では、ユーザー スキーマを定義し、メイン ディレクトリの下に avro ディレクトリを作成し、次に avro ディレクトリの下に新しいファイル user.avsc を作成します。

{"名前空間": "lancoo.ecbdc.pre",
 "タイプ": "レコード",
 "名前": "ユーザー",
 「フィールド」: [
     {"name": "名前", "type": "文字列"},
     {"name": "favorite_number", "type": ["int", "null"]},
     {"名前": "お気に入りの色", "タイプ": ["文字列", "null"]}
 ]
} 

3. スキーマをコンパイルする

Mavenプロジェクトのコンパイルをクリックしてコンパイルすると、名前空間パスとUserクラスコードが自動的に作成されます。

4. シリアル化

生成されたデータをシリアル化するためのTestUserクラスを作成する

ユーザー user1 = 新しい User();
user1.setName("アリッサ");
user1.setお気に入り番号(256);
// お気に入りの列または null を残す

// 代替コンストラクタ
ユーザー user2 = new User("Ben", 7, "red");

// ビルダー経由で構築
ユーザー user3 = User.newBuilder()
        .setName("チャーリー")
        .setFavoriteColor("青")
        .setお気に入り番号(null)
        。建てる();

// user1、user2、user3 をディスクにシリアル化します
DatumWriter<User> userDatumWriter = 新しい SpecificDatumWriter<User>(User.class);
DataFileWriter<ユーザー> dataFileWriter = 新しい DataFileWriter<ユーザー>(userDatumWriter);
dataFileWriter.create(user1.getSchema(), 新しいファイル("user_generic.avro"));
dataFileWriter.append(user1);
dataFileWriter.append(user2);
dataFileWriter.append(user3);
データファイルライターを閉じます。

シリアル化プログラムを実行すると、プロジェクトと同じディレクトリにAvroデータが生成されます。

user_generic.avro の内容は次のとおりです。

Objavro.schema�{"type":"record","name":"User","namespace":"lancoo.ecbdc.pre","fields":[{"name":"name","type":"string"},{"name":"favorite_number","type":["int","null"]},{"name":"favorite_color","type":["string","null"]}]}

5. デシリアライゼーション

デシリアライゼーションコードによるAvroデータの解析

// ディスクからユーザーをデシリアライズする
DatumReader<User> userDatumReader = 新しい SpecificDatumReader<User>(User.class);
DataFileReader<ユーザー> dataFileReader = new DataFileReader<ユーザー>(新しいファイル("user_generic.avro"), userDatumReader);
ユーザー user = null;
(dataFileReader.hasNext()) が実行される間 {
    // ユーザーオブジェクトをnext()に渡して再利用します。これにより、
    // 多くのオブジェクトを割り当ててガベージコレクションするファイル
    // 多くのアイテム。
    ユーザー = dataFileReader.next(ユーザー);
    System.out.println(ユーザー);
}

デシリアライズコードを実行してuser_generic.avroを解析します。

Avro データの解析が成功しました。

6. user_generic.avroをhdfsパスにアップロードする

hdfs dfs -mkdir -p /tmp/lztest/
hdfs dfs -put user_generic.avro /tmp/lztest/ 

7. flinkserverを設定する

Avro jarパッケージを準備する

flink-sql-avro-*.jar と flink-sql-avro-confluent-registry-*.jar を flinkserver ライブラリに配置し、すべての flinkserver ノードで次のコマンドを実行します。

cp /opt/huawei/Bigdata/FusionInsight_Flink_8.1.2/install/FusionInsight-Flink-1.12.2/flink/opt/flink-sql-avro*.jar /opt/huawei/Bigdata/FusionInsight_Flink_8.1.3/install/FusionInsight-Flink-1.12.2/flink/lib
chmod 500 flink-sql-avro*.jar
chown omm:wheel flink-sql-avro*.jar 

同時に、FlinkServer インスタンスを再起動し、再起動後に avro パッケージがアップロードされているかどうかを確認します。

hdfs dfs -ls /FusionInsight_FlinkServer/8.1.2-312005/lib

8. FlinkSQLを書く

テーブルtestHdfsを作成します(
  名前文字列、
  お気に入り番号 int,
  favorite_color 文字列
) と(
  'コネクタ' = 'ファイルシステム'、
  'パス' = 'hdfs:///tmp/lztest/user_generic.avro',
  'フォーマット' = 'avro'
);テーブル KafkaTable の作成 (
  名前文字列、
  お気に入り番号 int,
  favorite_color 文字列
) と (
  'コネクタ' = 'kafka'、
  'トピック' = 'testavro'、
  'properties.bootstrap.servers' = '96.10.2.1:21005',
  'properties.group.id' = 'testGroup'、
  'scan.startup.mode' = '最新オフセット'、
  'フォーマット' = 'avro'
);
挿入する
  Kafkaテーブル
選択
  *
から
  テストHdfs; 

タスクを保存して送信

9. 対応するトピックにデータがあるかどうかを確認する

FlinkSQL は Avro データを正常に解析しました。

Apache Avro データの解析に関するこの記事はこれで終わりです。Apache Avro データに関するより関連性の高いコンテンツについては、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Apache Superset を使用して ClickHouse データを視覚化する 2 つの方法

<<:  SQL重複排除方法の概要

>>:  ホバー画像のポップアウトポップアップ効果を実現するための純粋な CSS のサンプルコード

推薦する

デジタルテーブル特殊効果を実現するネイティブJS

この記事では、ネイティブ JS で実装されたデジタル時計エフェクトを紹介します。エフェクトは次のとお...

フォーム検証機能を実装するためのネイティブ js

目次開発の際には、機能を段階的に分析して実装することで、明確な考え方を保つことができます。 1. フ...

ReactでCSSをエレガントに書く方法

目次1. インラインスタイル2. インポート方法を使用する3.cssモジュールのエクスポート4. ス...

MySQL sql99構文の内部結合と非等価結合の詳細な説明

#事例: 従業員の給与水準を照会する 選択 給与、等級 から 従業員 参加する ジョブグレード g ...

Win32 MySQL 5.7.27 のインストールと設定方法のグラフィックチュートリアル

MySQL 5.7.27のインストールチュートリアルは以下のように記録され、皆さんと共有されています...

MySQL 8.0.15 のインストールと設定のグラフィックチュートリアルと Linux でのパスワード変更

このブログは、MySQL8.0.15 を正常にインストールしたことを思い出すために書きました。以前は...

CSS3 弾性拡張ボックスの詳細な説明

使用フレキシブル ボックスはフロントエンドの Web ページ レイアウトで重要な役割を果たしますが、...

オブジェクトアニメーションによってブロックされずにオブジェクトに div を表示する方法

今日はメニューボタンを作りました。マウスをボタンに移動するすると、ドロップダウンサブメニューが表示さ...

Nest.js のハッシュと暗号化の例の詳細な説明

0x0 はじめにまず、ハッシュアルゴリズムとは何でしょうか?メッセージやセッション項目など、一部のデ...

vue-cli 設定では Vuex の完全なプロセスレコードを使用します

目次序文インストールと使用方法モジュラー管理Vuex の状態永続性要約する序文Vue 開発では、ユー...

Windows システムに MySQL を素早くインストールして展開する方法 (グリーンの無料インストール バージョン)

まずは緑色の無料インストール版のMySQLをダウンロードします。任意のフォルダに入れて構いません。今...

Linux での SSH パスワードフリーログイン設定の詳細な説明

Linux サーバー A と B が 2 台あり、一方のサーバーから SSH 経由でパスワードなしで...

CSS3 変換遷移ジッター問題の解決

transform: scale(); スケーリングするとIEブラウザでジッターが発生します変換スケ...

Web ページの HTML コードの説明: 順序付きリストと順序なしリスト

このセクションでは、HTML のリスト要素について学習します。リストは、Web サイトのデザインにお...

JS ES6 非同期ソリューション

目次最初にコールバック関数を使用するes6 非同期処理モデルこの非同期モデルに合わせたAPI: pr...