Apache Avro

ウィキペディアから、無料の百科事典
ナビゲーションにジャンプ 検索にジャンプ

Apache Avro
Apache Avro Logo.svg
開発者Apache Software Foundation
初回リリース2009年11月2日; 12年前[1] (2009-11-02
安定リリース
1.10.2 / 2021年3月15日; 11か月前[2] (2021-03-15
リポジトリAvroリポジトリ
で書かれているJavaCC ++C#PerlPythonPHPRuby
タイプリモートプロシージャコールフレームワーク
ライセンスApacheライセンス2.0
Webサイトavro .apache .org

Avroは、ApacheのHadoopプロジェクト内で開発された行指向の リモートプロシージャコールおよびデータシリアル化 フレームワークです。データ型プロトコルを定義するためにJSONを使用し、コンパクトなバイナリ形式でデータをシリアル化します。その主な用途はApacheHadoopであり、永続データのシリアル化形式と、Hadoopノード間およびクライアントプログラムからHadoopサービスへの通信用ワイヤー形式の両方を提供できます。Avroはスキーマを使用して、エンコードされているデータを構造化します。2種類のスキーマ言語があります。1つは人間による編集(Avro IDL)用で、もう1つはJSONに基づいてより機械可読性があります。[3]

これはThriftおよびProtocolBuffersに似ていますが、スキーマが変更されたときにコード生成プログラムを実行する必要はありません(静的に型付けされた言語で必要な場合を除く)。

Apache Spark SQLは、データソースとしてAvroにアクセスできます。[4]

Avroオブジェクトコンテナファイル

Avroオブジェクトコンテナファイルは、次のもので構成されています。[5]

ファイルヘッダーは次のもので構成されます。

  • 4バイト、ASCII'O '、' b '、' j '、その後に1(0x01)のAvroバージョン番号(2進値0x4F 0x62 0x6A 0x01)。
  • スキーマ定義を含むファイルメタデータ。
  • このファイル用にランダムに生成された16バイトの同期マーカー。

データブロックの場合、Avroは2つのシリアル化エンコーディングを指定します:[6]バイナリとJSON。ほとんどのアプリケーションは、より小さく高速であるため、バイナリエンコーディングを使用します。デバッグおよびWebベースのアプリケーションの場合、JSONエンコーディングが適切な場合があります。

スキーマ定義

AvroスキーマはJSONを使用して定義されます。スキーマは、プリミティブ型(null、boolean、int、long、float、double、bytes、およびstring)と複合型(record、enum、array、map、union、およびfixed)で構成されます。[7]

簡単なスキーマの例:

 { 
   "namespace"  "example.avro" 
   "type"  "record" 
   "name"  "User" 
   "fields"  [ 
      { "name"  "name"  "type"  "string" }、
      { "name"  "favorite_number"   "type"  [ "null"  "int" ]}、
      { "name"  "favorite_color"  "type"  [ "null"  "string" ]} 
   ] 
 }

シリアル化と逆シリアル化

Avroのデータは、対応するスキーマとともに保存される場合があります。つまり、事前にスキーマを知らなくても、シリアル化されたアイテムを読み取ることができます。

Pythonでのシリアル化と逆シリアル化のコードの例

シリアル化:[8]

 avro.datafile
から avro.schemaを インポートします。avro.ioからDataFileReader DataFileWriterインポートし ます。DatumReader DatumWriterをインポートします。 
    

スキーマ =  avro スキーマparse open "user.avsc"  "rb" read ())  #書き込むスキーマを知る必要があります。ApacheAvroの1.8.2によると

writer  =  DataFileWriter open "users.avro"  "wb" )、 DatumWriter ()、 schema 
writer append ({ "name"  "Alyssa"  "favorite_number"  256 })
writer append ({ "name"  "Ben"  "favorite_number"  8  "favorite_color"  "red" })
writer 閉じる()

ファイル「users.avro」には、JSONのスキーマとデータ のコンパクトなバイナリ表現[9]が含まれます。

$  od  -v  -t  x1z  users.avro  
0000000  4f  62  6a  01  04  14  61  76  72  6f  2e  63  6f  64  65  63   > Obj ... avro.codec < 
0000020  08  6e  75  6c  6c  16  61  76  72  6f  2e  73  63  68  65  6d   > .null.avro.schem < 
0000040  61  ba  03  7b  22  74  79 70  65  22  3a  20  22  72  65  63   > a .. {"type": "rec < 
0000060  6f  72  64  22  2c  20  22  6e  61  6d  65  22  3a  20  22  55   > ord"、 "name": "U < 
0000100  73  65  72  22  2c  20  22  6e  61  6d  65  73  70  61  63  65   > ser "、"名前空間< 
0000120 22  3a  20  22  65  78  61  6d  70  6c  65  2e  61  76  72  6f   > ":" example.avro < 
0000140  22  2c  20  22  66  69  65  6c  64  73  22  3a  20  5b  7b  22   > "、" fields ":[{ " < 
0000160  74  79  70  65  22  3a  20  22  73  74  72  69  6e  67  22 2c   > type ":" string "、< 
0000200  20  22  6e  61  6d  65  22  3a  20  22  6e  61  6d  65  22  7d   > " name ":" name "} < 
0000220  2c  20  7b  22  74  79  70  65  22  3a  20  5b  22  69  6e  74   > 、{"タイプ":["int < 
0000240  22  2c  20  22  6e  75  6c  6c 22  5d  2c  20  22  6e  61  6d   > "、" null "]、" nam < 
0000260  65  22  3a  20  22  66  61  76  6f  72  69  74  65  5f  6e  75   > e ":" favorite_nu < 
0000300  6d  62  65  72  22  7d  2c  20  7b  22  74  79  70  65  22  3a   > mber "}、{"タイプ ":< 
0000320  20 5b  22  73  74  72  69  6e  67  22  2c  20  22  6e  75  6c   > ["string"、 "nul < 
0000340  6c  22  5d  2c  20  22  6e  61  6d  65  22  3a  20  22  66  61   > l"]、 "name": "fa < 
0000360  76  6f  72  69  74  65  5f  63  6f  6c  6f  72  22  7d  5d  7d  > vorite_color "}]} < 
0000400  00  05  f9  a3  80  98  47  54  62  bf  68  95  a2  ab  42  ef   > ...... GTb.h ... B. < 
0000420  24  04  2c  0c  41  6c  79  73  73  61  00  80  04  02  06  42   > $。、。Alyssa ..... B < 
0000440  65  6e  00  0e  00  06  72  65  64 05  f9  a3  80  98  47  54   > en .... red ..... GT < 
0000460  62  bf  68  95  a2  ab  42  ef  24                        > bh..B。$ < 
0000471

デシリアライズ:

reader  =  DataFileReader open "users.avro"  "rb" )、 DatumReader ()) #スキーマ  readerのユーザーのデータファイル埋め込まれてい
ますprint userreader 閉じる()   
     

これは以下を出力します:

{ u'favorite_color '  なし u'favorite_number '  256  u'name ' u'Alyssa ' } { u'favorite_color ' u'red ' u'favorite_number ' 8 u'name ' u 'ベン ' } 
     

APIを使用する言語

理論的にはどの言語でもAvroを使用できますが、次の言語にはAPIが記述されています。[10] [11]

Avro IDL

タイプとプロトコルの定義でJSONをサポートすることに加えて、Avroには、 Avro IDLと呼ばれる代替のインターフェイス記述言語(IDL)構文の実験的な[20]サポートが含まれています。以前はGenAvroとして知られていたこの形式は、C / C ++、 Protocol Buffersなどと同様の構文を使用して、従来のIDLやプログラミング言語に精通しているユーザーが簡単に採用できるように設計されています

Apache Avroのロゴは、廃止された英国の航空機メーカーAvro(元々はAV Roe and Company)のものです。[21]サッカーチームのAvroFCは同じロゴを使用しています。[22]

も参照してください

参考文献

  1. ^ 「ApacheAvro:データ交換のための新しいフォーマット」blog.cloudera.com 2019年3月10日取得
  2. ^ 「ApacheAvroリリース」avro.apache.org 2021年3月17日取得
  3. ^ Kleppmann、Martin(2017)。データ集約型アプリケーションの設計(初版)。オライリー。p。122。
  4. ^ 「In-Hadoop分析が重要である3つの理由-データコノミー」dataconomy.com2016年4月21日。
  5. ^ 「ApacheAvro仕様:オブジェクトコンテナファイル」avro.apache.org 2019年3月10日取得
  6. ^ 「ApacheAvro仕様:エンコーディング」avro.apache.org 2019年3月11日取得
  7. ^ 「ApacheAvro入門(Python)」avro.apache.org 2019年3月11日取得
  8. ^ 「ApacheAvro入門(Python)」avro.apache.org 2019年3月11日取得
  9. ^ 「ApacheAvro仕様:データシリアル化」avro.apache.org 2019年3月11日取得
  10. ^ ファント。「GitHub--phunt / avro-rpc-quickstart:Apache AvroRPCクイックスタート。AvroはApacheHadoopのサブプロジェクトです」GitHub 2016年4月13日取得
  11. ^ 「サポートされる言語-ApacheAvro-Apache SoftwareFoundation」2016年4月21日取得
  12. ^ "Avro:1.5.1- ASFJIRA" 2016年4月13日取得
  13. ^ "[AVRO-533] Avroの.NET実装-ASFJIRA" 2016年4月13日取得
  14. ^ 「サポートされている言語」2016年4月13日取得
  15. ^ 「AvroEx」hexdocs.pm 2017年10月18日取得
  16. ^ "Avrora — avrorav0.21.1"hexdocs.pm 2021年6月11日取得
  17. ^ 「AvroのネイティブHaskell実装」Thomas M. DuBuisson、Galois、Inc 2016年8月8日取得
  18. ^ 「Avro仕様の純粋なJavaScript実装」2020年5月4日取得
  19. ^ 「RustでのAvroクライアントライブラリの実装」2018年12月17日取得
  20. ^ 「ApacheAvro1.8.2IDL」2019年3月11日取得
  21. ^ 「Avroロゴ」avroheritagemuseum.co.uk 2018年12月31日取得
  22. ^ 「AVROFC」avrojfc.org 2018年12月31日取得

さらに読む