Apache Arrow 1.0¶ ↑
: subtitle
A cross-language development platform\nfor in-memory data
: author
Sutou Kouhei
: institution
ClearCode Inc.
: content-source
SciPy Japan 2020
: date
2020-10-30
: start-time
2020-10-30T15:00:00+09:00
: end-time
2020-10-30T15:25:00+09:00
: theme
.
Note¶ ↑
みなさん、こんにちは。n クリアコードの須藤です。n 今日は最近1.0がリリースされたApache Arrowを紹介します。n まだApache Arrowをよく知らない人向けに紹介します。
Me¶ ↑
* Apache Arrow PMC member * #2 Apache Arrow contributor # image # src = images/contributor.png # relative-width = 70
Note¶ ↑
私はApache Arrowプロジェクトの開発メンバーです。n コミット数は2番目に多いです。n Apache Arrowに詳しそうですよね。n そんな私が紹介することなので信用できる情報なはずです。
Apache Arrow and You¶ ↑
Your data size is …n (('note:データサイズが…'))
* small:\n (('note:小さい')) * (('wait'))You don't need Apache Arrow\n (('note:Apache Arrowを使う必要はない')) * large:\n (('note:大きい')) * (('wait'))Apache Arrow will help you!\n (('note:Apache Arrowを使うといいよ!'))
Note¶ ↑
これまでいろいろなところでApache Arrowを紹介してきました。n そのときによく聞かれるのが「私はApache Arrowを使った方がよいでしょうか?」ということです。n そこで、最初にどういうときにApache Arrowを使った方がよくてどういうときに使わなくてよいのかを説明します。n まず注目することはデータサイズです。n データサイズが小さい場合はApache Arrowを使う必要はありません。n データサイズが大きい場合はApache Arrowを使うといいことがあるはずです。
How does Apache Arrow help you?n(('note:どうしてApache Arrowを使うといいの?'))¶ ↑
(('tag:center')) (('tag:margin-bottom * -0.5')) Improves ((*data interchange*)) performancen (('note:((*データ交換*))のパフォーマンス改善'))
# image # src = images/apache-arrow-and-data-interchange.svg # relative-height = 100
Note¶ ↑
どうして大規模データでApache Arrowを使った方がよいかというとCSVなど Apache Arrow以外のデータフォーマットに比べてApache Arrowフォーマットは 高速にデータ交換できるからです。n ここまでApache Arrowはなにかについて説明していませんでした。n Apache Arrowとはなにかがわからなくてモヤモヤしていた人もいたかもしれません。n ここの説明でApache Arrowはファイルフォーマットのことなのだとわかったはずです。
Why does Apache Arrow focus on data interchange?n(('note:どうしてApache Arrowはデータ交換に注力しているの?'))¶ ↑
(('tag:center')) (('tag:xx-large')) Because it's a bottleneckn (('note:ボトルネックだから'))
(('tag:right')) (('wait'))…Really?n (('note:…本当?'))
Note¶ ↑
それでは、どうしてApache Arrowはデータ交換に注力しているのでしょうか。n それは、大規模データではデータ交換がボトルネックになるからです。n でも、それは本当でしょうか?
Large data transfer casen(('note:大規模データを転送するケース'))¶ ↑
# image # src = https://hannes.muehleisen.org/p852-muehleisen.pdf # page = 1 # relative-width = 50 # relative-clip-y = 8 # relative-clip-height = 17 # align = center # vertical-align = top # image # src = https://hannes.muehleisen.org/p852-muehleisen.pdf # page = 1 # relative-width = 90 # relative-clip-x = 50 # relative-clip-y = 25 # relative-clip-height = 25 # align = left # vertical-align = bottom # relative-margin-top = 1.5 # relative-margin-left = -20 # image # src = https://hannes.muehleisen.org/p852-muehleisen.pdf # page = 2 # relative-width = 100 # relative-clip-x = 50 # relative-clip-height = 29 # align = right # vertical-align = bottom # relative-margin-top = 23 # relative-margin-right = -18
(('tag:right')) (('tag:margin-top * 22.5')) (('note:((<URL:hannes.muehleisen.org/p852-muehleisen.pdf>))'))
Slide properties¶ ↑
: enable-clear-blue-slide-body-vertical-centering
false
: enable-title-on-image
false
Note¶ ↑
大規模データを転送するケースについて計測した結果があるので紹介します。n 左の図は各データベースで大規模データを転送したときの時間を示しています。n 左側にあるNetcatと書かれた点線がCSVフォーマットのデータとしてそのまま転送したときの時間です。n 一番速いMySQLから大規模データを取得した場合でも単にCSVを転送したときに比べて10倍時間がかかっています。n 右の図はデータ取得にかかる時間の内訳を示しています。n Result Set SerializationとResult Set Deserizationの時間が大半を占めています。n ここがまさにApache Arrowが高速化しているデータ交換処理です。n なおこの論文の詳細はページの下にあるURLのPDFを参照してください。
Use case: Apache Spark¶ ↑
# image # src = images/apache-arrow-and-apache-spark.svg # relative-height = 100
Slide properties¶ ↑
: enable-title-on-image
false
Note¶ ↑
それでは実際にApache Arrowを使ってデータ交換を高速化したケースを紹介します。n Apache Sparkは従来はpickleでSparkとPySpark間のデータを交換していました。n これをApache Arrowにすることで20倍以上の高速化に成功しました。n 右のグラフはApache Arrowの公式ブログで紹介されているデータを使っています。n 実行時間なので棒が短いほうが速いです。n pickleを使った場合は20秒ほどかかっていた処理がApache Arrowを使うことで1秒弱で終わっています。
Use case: Amazon Athena¶ ↑
# image # src = images/apache-arrow-and-amazon-athena.svg # relative-height = 100
Slide properties¶ ↑
: enable-title-on-image
false
Note¶ ↑
次の高速化例はAmazon Athenaです。n Amazon Athenaはユーザーが任意のデータソースからデータを取得できる機能を提供し始めました。n その機能の名前がFederated Queryです。n Federated Queryを使うとAmazon Athenaが組み込みで提供するデータ取得機能より遅くなりがちです。n しかし、Apache Arrowを使うことでできるだけ高速に実現できるようになっています。n たとえば、Amazon AthenaにはAmazon S3からデータを取得する組み込み機能があります。n 普通に考えれば組み込み機能なのでFederated Queryより速くなりそうです。n 右のグラフはFederated QueryのSDKのリポジトリー内にあるデータです。n スループットなので棒が長い方が高速です。n 先程のApache Sparkのグラフとは読み方が異なるので注意してください。n この結果ではAmazon S3からCSVデータを取得するよりもFederated Queryを使ってAmazon S3からApache Arrowデータを取得する方が10倍以上高速でした。n このように大規模データの転送はボトルネックになりうるのです。
Why is Apache Arrow fast?n(('note:どうしてApache Arrowは速いの?'))¶ ↑
# image # src = https://slide.rabbit-shocker.org/authors/kou/scipy-japan-2019/apache-arrow.pdf # relative-height = 90
(('tag:right')) (('note:((<URL:slide.rabbit-shocker.org/authors/kou/scipy-japan-2019/>))'))
Slide properties¶ ↑
: enable-clear-blue-slide-body-vertical-centering
false
: enable-title-on-image
false
Note¶ ↑
どうしてApache Arrowが速いのか気になる人もいるでしょう。n しかし、今日は紹介しません。n 気になる人は去年のSciPy Japanで紹介した資料を参考にしてみてください。
Wow! Awesome!n(('note:すごいじゃん!'))¶ ↑
(('tag:center')) (('tag:x-large')) Should I always use Apache Arrow?n (('note:いつもApache Arrowを使うべき?'))
(('tag:right')) (('wait'))…Non (('note:…いやいや'))
Note¶ ↑
Apache Arrowすごいじゃん!という気持ちになってきましたよね?n いつもApache Arrowを使っちゃおうかな!と思っている人もいるかもしれません。n でもちょっと待ってください。n 常にApache Arrowが最適とは限りません。
Apache Arrow is designed forn(('note:Apache Arrowの設計方針'))¶ ↑
* In-memory analytics\n (('note:メモリー内での分析')) * Cross-language * Can be used from all languages\n (('note:プログラミング言語に依存せずに使えること')) * Large data\n (('note:大規模データ')) * Fast data transfer\n (('note:高速なデータ転送'))
Note¶ ↑
どういうときにApache Arrowが適切かを理解するためにはApache Arrowの設計方針が参考になります。n 設計方針にマッチしたケースではApache Arrowが向いているはずです。n Apache Arrowはメモリー内での分析、プログラミング言語に依存せずに使えること、大規模データ、高速なデータ転送をいい感じに実現するために設計されています。n それぞれもう少し詳しく説明します。
In-memory analyticsn(('note:メモリー内での分析'))¶ ↑
* For in-memory: not for storage\n (('note:メモリー内用:保管用ではない')) * For storage: Apache Parquet, ...\n (('note:保管用にはApache Parquetなどいろいろある')) * For analytics: not for transaction\n (('note:分析用:トランザクション用ではない')) * Not for OLTP use\n (('note:OLTP用ではない'))
Note¶ ↑
まず、メモリー内での分析についてです。n Apache Arrowは保管用のフォーマットではありません。n 保管用にはApache Parquetなど保管に向いたフォーマットの方が適切です。n また、トランザクション用のフォーマットではありません。n OLTP用途には向いていません。
In-memory(('note:(メモリー内)'))¶ ↑
* Apache Arrow format means:\n (('note:Apache Arrowフォーマットは↓ということ')) * File format: *.arrow files(('note:(ファイルフォーマット)')) * Memory layout(('note:(メモリー上のデータの配置方法)')) * With Apache Parquet (for storage):\n (('note:(保管用の)Apache Parquetと一緒に使う場合:')) * Reading Apache Parquet data (file format)\n (('note:Apache Parquetデータ(ファイルフォーマット)を読む')) * as Apache Arrow data (memory layout)\n (('note:読んだデータはApache Arrowデータ(メモリー上の配置)にする'))
Note¶ ↑
Apache Arrowはファイルフォーマットであると説明しましたが、実は正確な説明ではありませんでした。n びっくりしましたか?n これまでApache Arrowを説明する機会がいろいろあったのですが、最初からアレもできるコレもできると説明すると説明された人は混乱するということがわかりました。n そのため、今回はできるだけ限定された説明から徐々により正確な説明に広げています。n ではApache Arrowはなにかというと、ファイルフォーマットでもあるのですが、メモリー上のデータの配置方法でもあります。n ファイルフォーマットとメモリー上のデータの配置方法ではなにが違うかは実例で説明します。n Apache Parquetという保管用のフォーマットとApache Arrowを一緒に使う場合を考えます。n まず、ファイルフォーマットとしてApache Parquetデータを読み込みます。n 読み込んだデータはApache Arrowデータとしてメモリー上に配置します。
Apache Parquet and Apache Arrow¶ ↑
# image # src = images/apache-arrow-and-apache-parquet.svg # relative-height = 100
Slide properties¶ ↑
: enable-title-on-image
false
Note¶ ↑
図にするとこんな感じです。n ファイル上ではApache Parquetフォーマットですが、メモリー上ではApache Arrowフォーマットです。n ファイル上でもメモリー上でもApache Arrowフォーマットを使えますが、このように適切なファイルフォーマットを使い分けた方が適切な場合が多いです。n Apache Arrowフォーマットはメモリー上で分析する場合に使いやすいように設計されています。
Analyticsn(('note:分析'))¶ ↑
* Column based operations are important\n (('note:カラム単位の操作が重要')) * Aggregate, sort, filter, ...\n (('note:集約、ソート、絞り込み…')) * For fast column based operations\n (('note:高速なカラム単位の操作に必要なもの')) * Columnar layout(('note:(カラムごとにまとまった配置)')) * Contiguous data for vectorization\n (('note:ベクトル化用に連続して配置したデータ'))
Note¶ ↑
どうなっていると分析するときに使いやすいでしょうか。n まず分析するときにどのような操作が重要かを確認します。n 分析するときはカラム単位での集約・ソート・絞り込みといった操作を高速に実行できることが重要です。n これらの操作をしながらデータから知見を得るからです。n 高速にこれらの操作を実行するためにはカラムごとにデータをまとめたり、ベクトル化しやすいように連続してデータを配置します。
Columnar layoutn(('note:カラムごとにまとまった配置'))¶ ↑
* Type per column\n (('note:カラムごとに型がある')) * Data frame is suitable\n (('note:データフレームは適切')) * Mixed type column data aren't suitable\n (('note:カラム内で型が混在しているデータは不向き')) * Like data in MongoDB(('note:(MongoDBに入っているようなデータ)')) * Union can be used for it but ...\n (('note:unionを使って表現できなくはないだろうけど…'))
Note¶ ↑
カラムごとにデータがまとめる場合、カラムごとに型を決めます。n データフレームはこのような構造になっているのでカラムごとにデータをまとめやすいです。n 一方、カラム内で型が混在しているデータは向いていません。n たとえば、MongoDBに入っているようなデータは向いていません。n Apache Arrowにはunionという機能があり、それを使えば表現できますが実用的ではないでしょう。
Cross-language¶ ↑
* All your modules use only NumPy\n (('note:すべてのモジュールでNumPyしか使っていない場合')) * NumPy format is enough(('note:(NumPyフォーマットで十分)')) * Your system uses multiple languages\n (('note:複数のプログラミング言語を使っている場合')) * Apache Arrow will be useful(('note:(Apache Arrowの出番)')) * Apache Spark, Python and R, ...
Note¶ ↑
Apache Arrowはプログラミング言語に依存せずに使えるように設計されています。n これは、大規模データを扱う分析システムはさまざまなプログラミング言語で実装された複数のモジュールで構成されていることが多いからです。n もし、すべてのモジュールでNumPyしか使っていない場合はApache ArrowではなくNumPyフォーマットで十分でしょう。n しかし、前に紹介したApache SparkのようなケースやPythonとRを一緒に使っている場合はApache Arrowで効いてきます。
Use case: RAPIDS¶ ↑
# image # src = https://docs.rapids.ai/overview/RAPIDS%200.15%20Release%20Deck.pdf # page = 3 # relative-height = 130 # relative-clip-y = 15 # relative-clip-height = 70
(('tag:right')) (('tag:margin-top * 6')) (('note:((<URL:docs.rapids.ai/overview/RAPIDS%200.15%20Release%20Deck.pdf#page=3>))'))
Slide properties¶ ↑
: enable-clear-blue-slide-body-vertical-centering
false
: enable-title-on-image
false
Note¶ ↑
大規模データを扱う分析システムの例を見てみましょう。n RAPIDSはすべてGPU上でデータ分析をするためのツール一式を提供しています。n GPUのメモリー上ではデータをApache Arrowフォーマットで持っていて、すべてのモジュールはApache Arrowフォーマットを扱います。n この構成にすることで劇的に分析処理を高速化できます。
Use case: RAPIDS¶ ↑
# image # src = https://docs.rapids.ai/overview/RAPIDS%200.15%20Release%20Deck.pdf # page = 8 # relative-height = 120 # relative-clip-y = 15 # relative-clip-height = 80
(('tag:right')) (('tag:margin-top * 5')) (('note:((<URL:docs.rapids.ai/overview/RAPIDS%200.15%20Release%20Deck.pdf#page=8>))'))
Slide properties¶ ↑
: enable-clear-blue-slide-body-vertical-centering
false
: enable-title-on-image
false
Note¶ ↑
これはどのように高速化されるかを示した図です。n 1番上がApache Hadoopを使ったケースです。n 各処理の前後にHDFSからデータを読み書きする処理が入っています。n 2番目がApache Sparkを使ったケースです。n 最初にHDFSからデータを読み込んだら後はHDFSのデータを読み書きをしないのでApache Hadoopのケースより高速になっています。n 3番目がGPUを活用したケースです。n HDFSからのデータ読み込みは1度だけですが、各処理の間にCPUとGPU間でのデータの読み書きが増えています。n 1番下がApache Arrowを活用したケースです。n すべての処理でGPU上のApache Arrowデータを使うので、CPUとGPU間でのデータの読み書きがなくなります。n これでApache Hadoopのケースよりも10000倍速くなることもあるということです。
Data sizen(('note:データサイズ'))¶ ↑
* If you have only small data\n (('note:小さなデータの場合')) * Any format will work well\n (('note:なにを使ってもいい')) * We need something to process large data\n (('note:大規模データを処理するには工夫が必要'))
Note¶ ↑
データサイズについてもう一度考えてみましょう。n データが小さい場合はなにを使っても力技でなんとかなります。n しかし、大規模データではそうもいきません。
Large data with Apache Arrown(('note:Apache Arrowで大規模データ'))¶ ↑
* Memory mapping(('note:(メモリーマップ)')) * can process large data without loading all data on memory at once\n (('note:大規模データを一度にすべてメモリー上に載せなくても処理できる')) * Record batch(('note:(レコードバッチ)')) * can process large data with batches\n (('note:大規模データをバッチに分割して処理できる')) * can process large data as stream\n (('note:大規模データをストリームとして処理できる'))
Note¶ ↑
Apache Arrowは大規模データを前提に設計されているので大規模データを扱うための仕組みがあります。n 1つはメモリーマップという仕組みに対応していることです。n メモリーマップを使うと1度にすべてのデータをメモリー上に載せなくても処理できます。n レコードバッチは大規模データを小さく分割して処理する仕組みです。n レコードバッチ単位で処理が完結するならストリームとして大規模データを処理できます。
Memory mappingn(('note:メモリーマップ'))¶ ↑
# image # src = images/memory-mapping.svg # relative-height = 100
Slide properties¶ ↑
: enable-title-on-image
false
Note¶ ↑
メモリーマップについて図にしてみました。n ファイルシステム上にあるデータを一部だけメモリー上に載せて処理できます。n どのデータをメモリー上に載せるかはOSが管理してくれるのでプログラムはシンプルになります。
Record batchn(('note:レコードバッチ'))¶ ↑
# image # src = images/record-batch.svg # relative-height = 100
Slide properties¶ ↑
: enable-title-on-image
false
Note¶ ↑
レコードバッチについて図にしてみました。n 大規模データでも複数のレコードバッチに分割すればメモリー上で分析できます。
Fast data transfern(('note:高速データ転送'))¶ ↑
* Enough network bandwidth case:\n (('note:十分なネットワーク帯域がある場合')) * Fast {,de}serialize improves performance\n (('note:高速なシリアライズ機能で高速転送が可能')) * Network bottleneck case:\n (('note:ネットワーク帯域がボトルネックになるケース')) * Other small size format may be better\n (('note:よりサイズが小さくなる別のフォーマットの方がいいかも'))
Note¶ ↑
Apache Arrowは高速にデータ転送できるように設計されています。n ネットワーク帯域が十分にある場合はシリアライズ・デシリアライズを高速化してデータ転送を高速化しています。n シリアライズ・デシリアライズが遅いというデータがあることは最初の方で示しましたが覚えていますか?n 一方、ネットワーク帯域がボトルネックになる場合はシリアライズ・デシリアライズの高速化だけでは対応できません。n より小さなデータになるフォーマットのほうが高速になるでしょう。
Network bottleneckn(('note:ネットワーク帯域がボトルネック'))¶ ↑
* The Amazon Athena use case:\n (('note:前述のAmazon Athenaの事例')) * Apache Parquet is faster than Apache Arrow\n (('note:Apache ArrowよりApache Parquetの方が高速')) * Because run-length encoding works well\n (('note:ランレングス圧縮がすごく効いていたから')) * Apache Arrow supports compression\n (('note:Apache Arrowは圧縮をサポートしている')) * (('note:Maybe, the Amazon Athena use case doesn't use it'))\n (('note:たぶん前述のAmazon Athena事例では使っていない'))
Note¶ ↑
たとえば、最初の方で紹介したAmazon AthenaのケースはCSVからApache Arrowにすることでシリアライズ・デシリアライズを高速化してデータ転送が高速になり、ボトルネックがネットワーク帯域に移っていました。n このケースではApache Parquetの方が高速でした。n 理由はApache Parquetのランレングス圧縮ですごくデータサイズが小さくなったからです。n 実は、最近のApache ArrowはLZ4とZstandardを使ったデータ圧縮をサポートしています。n おそらく、Amazon Athenaのデータではこの機能を使っていないと思いますが、この機能を使うとApache Parquetよりも速くなるかもしれません。
Apache Arrow and compression¶ ↑
# image # src = https://ursalabs.org/20200414_file_sizes.png # align = left # vertical-align = top # relative-width = 75 # image # src = https://ursalabs.org/20200414_read_py.png # align = right # vertical-align = bottom # relative-width = 75 # relative-clip-y = 12 # relative-margin-top = 12 # relative-margin-left = -3.8
(('tag:right')) (('tag:margin-top * 15')) (('note:((<URL:ursalabs.org/blog/2020-feather-v2/>))'))
Slide properties¶ ↑
: enable-clear-blue-slide-body-vertical-centering
false
: enable-title-on-image
false
Note¶ ↑
参考までにApache Arrowの圧縮機能の傾向を紹介します。n 上のグラフはファイルサイズを示しています。n Feather V2と書いているのがApache Arrowフォーマットのことです。n 圧縮することで1/10弱までファイルサイズが小さくなっていて、Apache Parquetよりも少し大きいくらいになっています。n 下のグラフは読み込み速度を示しています。n 圧縮したほうが高速に読み込めています。n Apache Parquetよりも2倍ほど高速です。n ネットワーク帯域のボトルネックが解消されればApache Arrowの方が高速になる可能性は十分にありそうです。
When should I use Apache Arrown(('note:いつApache Arrowを使えばよいか'))¶ ↑
* In-memory analytics\n (('note:メモリー内での分析')) * Not for storage(('note:(保管用ではない)')) * Not for transaction(('note:(トランザクション用ではない)')) * Columnar layout data\n (('note:カラムごとにまとまったデータ')) * Not for data in document DB\n (('note:ドキュメント指向DBに入っているようなデータは向いていない'))
Note¶ ↑
ここまででApache Arrowの設計方針を確認しながらどのようなケースに向いていてどのようなケースに向いていないかをみてきました。n おさらいしましょう。n Apache Arrowはメモリー上での分析用に設計されているので保管用途やトランザクション用途には向いていません。n カラムごとにデータをまとめるように設計されているのでドキュメント指向データベースに入っているようなデータは向いていません。
When should I use Apache Arrown(('note:いつApache Arrowを使えばよいか'))¶ ↑
* Cross-language system\n (('note:複数のプログラミング言語を使うシステム')) * Many data analytics system use multiple languages\n (('note:多くのデータ分析システムは複数のプログラミング言語を使っている')) * Large data(('note:(大規模データ)')) * Fast data transfer(('note:(高速データ転送)')) * Compression may resolve network bottleneck\n (('note:ネットワーク帯域がボトルネックになるときは圧縮するといいかも'))
Note¶ ↑
多くのデータ分析システムは複数のプログラミング言語を使っているはずなので、プログラミング言語に依存しないように設計されているApache Arrowは多くの分析システムで使えるはずです。n Apache Arrowは大規模データを扱えるように設計されています。n 高速なデータ転送のための工夫もあります。n ネットワーク帯域がボトルネックになるケースでは圧縮機能も試してみましょう。n どんなときにApache Arrowが向いていてどんなときに向いていないかわかりましたか?
Currentn&nFuture¶ ↑
Note¶ ↑
それではApache Arrowの現状と将来について説明します。
Apache Arrow 1.0.0¶ ↑
2020-07-24
Note¶ ↑
2020-07-24にApache Arrow1.0.0がリリースされました。
What does 1.0.0 mean?n(('note:1.0.0になったということはどういうこと?'))¶ ↑
Start following Semantic Versioningn (('note:セマンティックバージョン開始'))
Note¶ ↑
1.0.0というと安定性が気になると思います。n ということで、セマンティックバージョンに準じたバージョンをつけることになりました。
Semantic Versioningn(('note:セマンティックバージョン'))¶ ↑
* Backward compatible(('note:(後方互換)')) * In the same major version(('note:(メジャーバージョンが同じ間)')) * Newer can be used with older\n (('note:新しいバージョンは古いバージョンと一緒に使える')) * Forward compatible(('note:(前方互換)')) * In the same major.minor version\n (('note:メジャー・マイナーバージョンが同じ間')) * Older can be used with newer w/o new features\n (('note:古いバージョンは新機能を使わないなら新しいバージョンと一緒に使える'))
Note¶ ↑
セマンティックバージョンはバージョンで互換性を担保する仕組みです。n メジャーバージョンが同じ時は後方互換性があり、マイナーバージョンまで同じ場合は前方互換性があります。
Versions in Apache Arrown(('note:Apache Arrowのバージョン'))¶ ↑
* Apache Arrow format(('note:(Apache Arrowフォーマット)')) * File format(('note:(ファイルフォーマット)')) * Memory layout(('note:(メモリー上でのデータの配置方法)')) * Apache Arrow libraries such pyarrow\n (('note:pyarrowのようなApache Arrowライブラリー')) * Read/write Apache Arrow file format\n (('note:Apache Arrowファイルフォーマットを読み書き')) * Process Apache Arrow memory layout data\n (('note:メモリー内のApache Arrowデータの処理'))
Note¶ ↑
Aapche Arrowのバージョンには2つあります。n 1つはApache Arrowフォーマットのバージョンです。n これはこれまでの説明で「Apache Arrow」と言っていたもののことです。n 実は「Apache Arrow」はフォーマットのことだけを指すものではありません。n つまり、これまでの説明は正確な説明ではありませんでした。n Apache Arrowフォーマットを扱うライブラリーのことも指します。
Release cyclen(('note:リリースサイクル'))¶ ↑
Per 3-4 monthsn (('note:3-4ヶ月ごと'))
Note¶ ↑
Aapche Arrowは3-4ヶ月ごとにリリースされています。
Release and versionn(('note:リリースとバージョン'))¶ ↑
* Apache Arrow format's version * It's bumped only when needed\n (('note:必要なときだけバージョンアップ')) * Apache Arrow libraries' version * Major version is always bumped\n (('note:常にメジャーバージョンアップ')) * 2020-07: 1.0.0 * 2020-10: 2.0.0
Note¶ ↑
フォーマットのバージョンは必要なときだけあがります。n 一方、ライブラリーのバージョンは常にメジャーバージョンがあがります。
Major version upn(('note:メジャーバージョンアップ'))¶ ↑
It may break compatibilityn (('note:互換性がなくなるかもしれない'))
Note¶ ↑
メジャーバージョンがあがるということは互換性が保証されないということです。
You should pin pyarrow versionn(('note:pyarrowのバージョンは固定するべき'))¶ ↑
requirements.txt:
pyarrow~=1.0.*
Note¶ ↑
pyarrowを使うときはバージョンを固定してください。
You may not use pyarrow directlyn(('note:直接pyarrowを使わないかもしれない'))¶ ↑
* Your dependencies may use pyarrow internally instead\n (('note:依存しているモジュールが内部で使っているかも')) * pandas uses pyarrow to read Apache Parquet\n (('note:pandasはApache Parquetを読み込むためにpyarrowを使っている')) * PySpark uses pyarrow to communicate Spark\n (('note:PySparkはSparkと通信するためにpyarrowを使っている')) * Modules use pyarrow will be increased\n (('note:pyarrowを使うモジュールは増えていくはず'))
Note¶ ↑
ただ、みなさんが直接pyarrowを使うことは少ないかもしれません。n というのは、各種モジュールがpyarrowを使って、みなさんは各種モジュール経由で暗黙のうちに使うことのほうが多いだろうからです。
Ecosystemn(('note:エコシステム'))¶ ↑
* The more many modules support Arrow,\n the more we can improve performance\n (('note:Apache Arrow対応モジュールが増えるほど性能アップ')) * Because we don't need to convert to Arrow\n (('note:Apache Arrowフォーマットに変換する必要がなくなるから')) * Many modules start supporting Arrow!\n (('note:多くのモジュールがApache Arrowの対応を始めている!')) * Because 1.0.0 was released\n (('note:1.0.0がリリースされたから'))
Note¶ ↑
より多くのモジュールがApache Arrowを使うとよりApache Arrowの恩恵を受けやすくなります。n Apache Arrowフォーマットに変換する処理が減るからです。n 多くのモジュールがApache Arrowに対応し始めていてエコシステムが動き始めています。
BigQuery Storage API¶ ↑
# rouge python from google.cloud import bigquery_storage_v1 client = bigquery_storage_v1.BigQueryReadClient() ... stream = client.read_rows(...) arrow_table = stream.to_arrow(...)
(('note:See also: ((<URL:medium.com/google-cloud/announcing-google-cloud-bigquery-version-1-17-0-1fc428512171>))'))
Note¶ ↑
たとえば、BigQuery内のデータを取得するAPIであるBigQuery Storage APIはApache Arrowフォーマットでデータを返す機能を追加しました。
pandas, Dask and Vaex¶ ↑
* Use pyarrow to RW Apache Parquet\n (('note:Apache Parquetフォーマットを読み書きするためにpyarrowを使用')) * Not use Apache Arrow for internal memory layout\n (('note:内部のデータの持ち方はApache Arrowではない')) * cuDF does but not use pyarrow to process data\n (('note:cuDFはApache Arrowデータとして持っているがpyarrowでは処理していない'))
Note¶ ↑
pandas, Dask, VaexといったデータフレームライブラリーはApache Parquetフォーマットを読み書きするためにparrowを使っています。n ただ、内部のデータの持ち方はApache Arrowフォーマットではありません。
Current pyarrow use casesn(('note:現時点でのpyarrowの利用例'))¶ ↑
* Apache Parquet reader/writer * Apache Arrow data representation\n (('note:Apache Arrowデータの表現')) * Not used for internal memory layout\n (('note:内部のデータ表現としては使われていない')) * (('note:NumPy's memory layout is used for numeric')) * (('note:Apache Arrow's memory layout is compatible with NumPy's one')) * Why?(('note:(どうして?)'))
Note¶ ↑
現在のpyarrowの使い方で多いのはApache Parquetフォーマットの読み書きのためと、メモリー上のApache Arrowデータを表現のためです。n 処理対象のデータをApache Arrowデータとしては使っていません。n どうしてでしょうか。
Apache Arrow nativendata processingn(('note:Apache Arrowデータの処理'))¶ ↑
Work In Progressn (('note:実装中'))
Note¶ ↑
それはメモリー上のApache Arrowデータの処理機能がまだ実装中だからです。
Data processingn(('note:データ処理'))¶ ↑
* Current:(('note:(現在)')) * Gandiva and compute functions\n (('note:((<URL:https://arrow.apache.org/docs/cpp/api/compute.html>))'))\n (('note:Gandivaと計算関数がある')) * Missing some features such as sort related\n (('note:ソート関連などまだ機能が足りない')) * Future:(('note:(将来)')) * Apache Arrow native data frame\n (('note:Apache Arrowデータ用データフレーム'))
Note¶ ↑
現在は、Gandivaと計算関数で実装されているデータ処理機能がありますが、ソート関連機能など足りない機能があります。n 将来は、メモリー上のApache Arrowデータに対して動くデータフレームライブラリーを提供する予定です。
Apache Arrow native data framen(('note:Apache Arrowデータ用データフレーム'))¶ ↑
* File system module(('note:(ファイルシステムモジュール)')) * Read/write files with the same API\n (('note:同じAPIでファイル操作')) * Current: Local, HDFS and S3 * Dataset module(('note:(データセットモジュール)')) * Read/write semantic datasets stored in different locations and formats\n (('note:様々な場所・フォーマットのデータを論理的なデータセットとして読み書き')) * Current: Apache Arrow, Apache Parquet and CSV
Note¶ ↑
Apache Arrow用のデータフレームライブラリーのためにサブモジュールを開発しているのが現状です。n ファイルシステムモジュールとデータセットモジュールはすべての機能はまだ揃っていませんが動きます。
Apache Arrow native data framen(('note:Apache Arrowデータ用データフレーム'))¶ ↑
* Query engine module(('note:(クエリーエンジンモジュール)')) * Process query against dataset\n (('note:データセットに対してクエリー実行')) * Current: Not started(('note:(現在:未着手)')) * Data frame module(('note:(データフレームモジュール)')) * Provide higher level API for these modules\n (('note:これらのモジュールを使う高レベルのAPI')) * Current: Not started(('note:(現在:未着手)'))
Note¶ ↑
クエリーエンジンモジュールとデータフレームモジュールは未着手です。
Wrap upn(('note:まとめ'))¶ ↑
* Apache Arrow 1.0.0 was released!\n (('note:Apache Arrow 1.0.0がリリースされた!')) * Semantic versioning(('note:(セマンティックバージョン)')) * You will use Apache Arrow implicitly\n (('note:知らないうちにApache Arrowを使うことが増えるはず')) * You can't use pyarrow for data processing yet\n (('note:pyarrowでデータ処理をするにはまだ機能不足')) * (('wait'))But I want to use ASAP!\n (('note:でも、すぐに使いたい!'))
Note¶ ↑
今回はどのようなときにApache Arrowが向いていてどのようなときに向いていないかを説明しました。n Apache Arrow 1.0.0がリリースされたことでユーザーは増え始めています。n pandas経由などすでに知らないうちにApache Arrowを使っていることもあるでしょう。n ただ、まだpyarrowでデータを処理できません。n でも、早く使いたいですよね!
Join us!n(('note:おいでよ!'))¶ ↑
* The Apache Arrow project welcomes all!\n (('note:((<URL:https://arrow.apache.org/community/>))'))\n (('note:Apache Arrowプロジェクトは歓迎するよ!')) * You can get features what you want quickly if you join developing them\n (('note:開発に参加すると欲しい機能がより早く手に入るよ!')) * Community in Japanese: Red Data Tools\n (('note:((<URL:https://gitter.im/red-data-tools/ja>))'))\n (('note:日本語で相談したい人はRed Data Toolsへ')) * ClearCode Inc. supports it:\n (('note:((<URL:https://www.clear-code.com/services/apache-arrow.html>))'))\n (('note:クリアコードは商用サポートを提供しているよ'))
Note¶ ↑
そう思ったみなさんはぜひApache Arrowの開発に参加してください!n 開発に参加すると欲しい機能をより早く実現できます。n 開発に参加する方法は公式サイトに説明があります。n 日本語で相談したい人はRed Data Toolsというプロジェクトに来てください。n 私が始めたプロジェクトで、私をはじめApache Arrowの開発に参加している人が数人います。n 日本語で相談できます。n もし、仕事で取り組みたい場合はクリアコードという私たちの会社がApache Arrowのコンサルティングサポートを提供しています。n 成果をできるだけApache Arrow本体に還元するように進めます。n どのような方法でも大丈夫です。n ぜひApache Arrowの開発に参加してください!