This is an automated email from the ASF dual-hosted git repository.
github-bot pushed a commit to branch asf-site
in repository https://gitbox.apache.org/repos/asf/arrow-site.git
The following commit(s) were added to refs/heads/asf-site by this push:
new 0cefc4d Updating built site (build
3e200ab7044f75096229f62f40e08bceaeb993cc)
0cefc4d is described below
commit 0cefc4d98cd420120bc8754dd2a9ea1c04f2fe95
Author: Sutou Kouhei <[email protected]>
AuthorDate: Mon Oct 28 01:23:53 2019 +0000
Updating built site (build 3e200ab7044f75096229f62f40e08bceaeb993cc)
---
...manifest-3cb7c865f41f8a9598131303e5b51e71.json} | 2 +-
.../introducing-arrow-flight-japanese/index.html | 391 +++++++++++++++++++++
.../2019/10/13/introducing-arrow-flight/index.html | 10 +-
blog/index.html | 6 +-
feed.xml | 305 ++++++++--------
5 files changed, 547 insertions(+), 167 deletions(-)
diff --git a/assets/.sprockets-manifest-0a4e782dc7e2bee42e7fdcd5258ea172.json
b/assets/.sprockets-manifest-3cb7c865f41f8a9598131303e5b51e71.json
similarity index 79%
rename from assets/.sprockets-manifest-0a4e782dc7e2bee42e7fdcd5258ea172.json
rename to assets/.sprockets-manifest-3cb7c865f41f8a9598131303e5b51e71.json
index 5fa011b..3d0d9a6 100644
--- a/assets/.sprockets-manifest-0a4e782dc7e2bee42e7fdcd5258ea172.json
+++ b/assets/.sprockets-manifest-3cb7c865f41f8a9598131303e5b51e71.json
@@ -1 +1 @@
-{"files":{"main-18cd3029557f73c1ee82e41113127b04f6fcd84c56d9db0cb9c40ebe26ef6e33.js":{"logical_path":"main.js","mtime":"2019-10-26T14:24:28-04:00","size":124531,"digest":"18cd3029557f73c1ee82e41113127b04f6fcd84c56d9db0cb9c40ebe26ef6e33","integrity":"sha256-GM0wKVV/c8HuguQRExJ7BPb82ExW2dsMucQOvibvbjM="}},"assets":{"main.js":"main-18cd3029557f73c1ee82e41113127b04f6fcd84c56d9db0cb9c40ebe26ef6e33.js"}}
\ No newline at end of file
+{"files":{"main-18cd3029557f73c1ee82e41113127b04f6fcd84c56d9db0cb9c40ebe26ef6e33.js":{"logical_path":"main.js","mtime":"2019-10-27T21:23:51-04:00","size":124531,"digest":"18cd3029557f73c1ee82e41113127b04f6fcd84c56d9db0cb9c40ebe26ef6e33","integrity":"sha256-GM0wKVV/c8HuguQRExJ7BPb82ExW2dsMucQOvibvbjM="}},"assets":{"main.js":"main-18cd3029557f73c1ee82e41113127b04f6fcd84c56d9db0cb9c40ebe26ef6e33.js"}}
\ No newline at end of file
diff --git a/blog/2019/10/13/introducing-arrow-flight-japanese/index.html
b/blog/2019/10/13/introducing-arrow-flight-japanese/index.html
new file mode 100644
index 0000000..00ae8f7
--- /dev/null
+++ b/blog/2019/10/13/introducing-arrow-flight-japanese/index.html
@@ -0,0 +1,391 @@
+<!DOCTYPE html>
+<html lang="en-US">
+ <head>
+ <meta charset="UTF-8">
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <!-- The above meta tags *must* come first in the head; any other head
content must come *after* these tags -->
+
+ <title>Apache Arrow Flightの紹介:高速データトランスポートフレームワーク | Apache Arrow</title>
+
+
+ <!-- Begin Jekyll SEO tag v2.6.1 -->
+<meta name="generator" content="Jekyll v3.8.4" />
+<meta property="og:title" content="Apache Arrow Flightの紹介:高速データトランスポートフレームワーク"
/>
+<meta name="author" content="wesm" />
+<meta property="og:locale" content="en_US" />
+<meta name="description" content="この記事ではArrow
Flightという高速データサービスを構築するためのフレームワークを紹介します。この1.5年、Flightの開発を進めてきました。Flightの開発者・利用者を探しています。"
/>
+<meta property="og:description" content="この記事ではArrow
Flightという高速データサービスを構築するためのフレームワークを紹介します。この1.5年、Flightの開発を進めてきました。Flightの開発者・利用者を探しています。"
/>
+<link rel="canonical"
href="https://arrow.apache.org/blog/2019/10/13/introducing-arrow-flight-japanese/"
/>
+<meta property="og:url"
content="https://arrow.apache.org/blog/2019/10/13/introducing-arrow-flight-japanese/"
/>
+<meta property="og:site_name" content="Apache Arrow" />
+<meta property="og:image" content="https://arrow.apache.org/img/arrow.png" />
+<meta property="og:type" content="article" />
+<meta property="article:published_time" content="2019-10-13T02:00:00-04:00" />
+<meta name="twitter:card" content="summary_large_image" />
+<meta property="twitter:image"
content="https://arrow.apache.org/img/arrow.png" />
+<meta property="twitter:title" content="Apache Arrow
Flightの紹介:高速データトランスポートフレームワーク" />
+<meta name="twitter:site" content="@ApacheArrow" />
+<meta name="twitter:creator" content="@wesm" />
+<script type="application/ld+json">
+{"description":"この記事ではArrow
Flightという高速データサービスを構築するためのフレームワークを紹介します。この1.5年、Flightの開発を進めてきました。Flightの開発者・利用者を探しています。","@type":"BlogPosting","publisher":{"@type":"Organization","logo":{"@type":"ImageObject","url":"https://arrow.apache.org/img/logo.png"},"name":"wesm"},"headline":"Apache
Arrow
Flightの紹介:高速データトランスポートフレームワーク","dateModified":"2019-10-13T02:00:00-04:00","datePublished":"2019-10-13T02:00:00-04:00","url":"https://arrow.apache.org/blog/2019/10/13/introducing-arrow-flight-japanese/
[...]
+<!-- End Jekyll SEO tag -->
+
+
+ <!-- favicons -->
+ <link rel="icon" type="image/png" sizes="16x16"
href="/img/favicon-16x16.png" id="light1">
+ <link rel="icon" type="image/png" sizes="32x32"
href="/img/favicon-32x32.png" id="light2">
+ <link rel="apple-touch-icon" type="image/png" sizes="180x180"
href="/img/apple-touch-icon.png" id="light3">
+ <link rel="apple-touch-icon" type="image/png" sizes="120x120"
href="/img/apple-touch-icon-120x120.png" id="light4">
+ <link rel="apple-touch-icon" type="image/png" sizes="76x76"
href="/img/apple-touch-icon-76x76.png" id="light5">
+ <link rel="apple-touch-icon" type="image/png" sizes="60x60"
href="/img/apple-touch-icon-60x60.png" id="light6">
+ <!-- dark mode favicons -->
+ <link rel="icon" type="image/png" sizes="16x16"
href="/img/favicon-16x16-dark.png" id="dark1">
+ <link rel="icon" type="image/png" sizes="32x32"
href="/img/favicon-32x32-dark.png" id="dark2">
+ <link rel="apple-touch-icon" type="image/png" sizes="180x180"
href="/img/apple-touch-icon-dark.png" id="dark3">
+ <link rel="apple-touch-icon" type="image/png" sizes="120x120"
href="/img/apple-touch-icon-120x120-dark.png" id="dark4">
+ <link rel="apple-touch-icon" type="image/png" sizes="76x76"
href="/img/apple-touch-icon-76x76-dark.png" id="dark5">
+ <link rel="apple-touch-icon" type="image/png" sizes="60x60"
href="/img/apple-touch-icon-60x60-dark.png" id="dark6">
+
+ <script>
+ // Switch to the dark-mode favicons if prefers-color-scheme: dark
+ function onUpdate() {
+ light1 = document.querySelector('link#light1');
+ light2 = document.querySelector('link#light2');
+ light3 = document.querySelector('link#light3');
+ light4 = document.querySelector('link#light4');
+ light5 = document.querySelector('link#light5');
+ light6 = document.querySelector('link#light6');
+
+ dark1 = document.querySelector('link#dark1');
+ dark2 = document.querySelector('link#dark2');
+ dark3 = document.querySelector('link#dark3');
+ dark4 = document.querySelector('link#dark4');
+ dark5 = document.querySelector('link#dark5');
+ dark6 = document.querySelector('link#dark6');
+
+ if (matcher.matches) {
+ light1.remove();
+ light2.remove();
+ light3.remove();
+ light4.remove();
+ light5.remove();
+ light6.remove();
+ document.head.append(dark1);
+ document.head.append(dark2);
+ document.head.append(dark3);
+ document.head.append(dark4);
+ document.head.append(dark5);
+ document.head.append(dark6);
+ } else {
+ dark1.remove();
+ dark2.remove();
+ dark3.remove();
+ dark4.remove();
+ dark5.remove();
+ dark6.remove();
+ document.head.append(light1);
+ document.head.append(light2);
+ document.head.append(light3);
+ document.head.append(light4);
+ document.head.append(light5);
+ document.head.append(light6);
+ }
+ }
+ matcher = window.matchMedia('(prefers-color-scheme: dark)');
+ matcher.addListener(onUpdate);
+ onUpdate();
+ </script>
+
+ <link rel="stylesheet"
href="//fonts.googleapis.com/css?family=Lato:300,300italic,400,400italic,700,700italic,900">
+
+ <link href="/css/main.css" rel="stylesheet">
+ <link href="/css/syntax.css" rel="stylesheet">
+ <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js"
integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo"
crossorigin="anonymous"></script>
+ <script
src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js"
integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49"
crossorigin="anonymous"></script>
+
+ <!-- Global Site Tag (gtag.js) - Google Analytics -->
+<script async
src="https://www.googletagmanager.com/gtag/js?id=UA-107500873-1"></script>
+<script>
+ window.dataLayer = window.dataLayer || [];
+ function gtag(){dataLayer.push(arguments)};
+ gtag('js', new Date());
+
+ gtag('config', 'UA-107500873-1');
+</script>
+
+
+ </head>
+
+
+<body class="wrap">
+ <header>
+ <nav class="navbar navbar-expand-md navbar-dark bg-dark">
+ <a class="navbar-brand" href="/"><img src="/img/arrow-inverse-300px.png"
height="60px"/></a>
+ <button class="navbar-toggler" type="button" data-toggle="collapse"
data-target="#arrow-navbar" aria-controls="arrow-navbar" aria-expanded="false"
aria-label="Toggle navigation">
+ <span class="navbar-toggler-icon"></span>
+ </button>
+
+ <!-- Collect the nav links, forms, and other content for toggling -->
+ <div class="collapse navbar-collapse" id="arrow-navbar">
+ <ul class="nav navbar-nav">
+ <li class="nav-item dropdown">
+ <a class="nav-link dropdown-toggle" href="#"
+ id="navbarDropdownProjectLinks" role="button"
data-toggle="dropdown"
+ aria-haspopup="true" aria-expanded="false">
+ Project Links
+ </a>
+ <div class="dropdown-menu"
aria-labelledby="navbarDropdownProjectLinks">
+ <a class="dropdown-item" href="/install/">Installation</a>
+ <a class="dropdown-item" href="/release/">Releases</a>
+ <a class="dropdown-item" href="/faq/">FAQ</a>
+ <a class="dropdown-item" href="/blog/">Blog</a>
+ <a class="dropdown-item"
href="https://github.com/apache/arrow">Source Code</a>
+ <a class="dropdown-item"
href="https://issues.apache.org/jira/browse/ARROW">Issue Tracker</a>
+ </div>
+ </li>
+ <li class="nav-item dropdown">
+ <a class="nav-link dropdown-toggle" href="#"
+ id="navbarDropdownCommunity" role="button" data-toggle="dropdown"
+ aria-haspopup="true" aria-expanded="false">
+ Community
+ </a>
+ <div class="dropdown-menu" aria-labelledby="navbarDropdownCommunity">
+ <a class="dropdown-item"
href="http://mail-archives.apache.org/mod_mbox/arrow-user/">User Mailing
List</a>
+ <a class="dropdown-item"
href="http://mail-archives.apache.org/mod_mbox/arrow-dev/">Dev Mailing List</a>
+ <a class="dropdown-item"
href="https://cwiki.apache.org/confluence/display/ARROW">Developer Wiki</a>
+ <a class="dropdown-item" href="/committers/">Committers</a>
+ <a class="dropdown-item" href="/powered_by/">Powered By</a>
+ </div>
+ </li>
+ <li class="nav-item">
+ <a class="nav-link" href="/docs/format/Columnar.html"
+ role="button" aria-haspopup="true" aria-expanded="false">
+ Specification
+ </a>
+ </li>
+ <li class="nav-item dropdown">
+ <a class="nav-link dropdown-toggle" href="#"
+ id="navbarDropdownDocumentation" role="button"
data-toggle="dropdown"
+ aria-haspopup="true" aria-expanded="false">
+ Documentation
+ </a>
+ <div class="dropdown-menu"
aria-labelledby="navbarDropdownDocumentation">
+ <a class="dropdown-item" href="/docs">Project Docs</a>
+ <a class="dropdown-item" href="/docs/python">Python</a>
+ <a class="dropdown-item" href="/docs/cpp">C++</a>
+ <a class="dropdown-item" href="/docs/java">Java</a>
+ <a class="dropdown-item" href="/docs/c_glib">C GLib</a>
+ <a class="dropdown-item" href="/docs/js">JavaScript</a>
+ <a class="dropdown-item" href="/docs/r">R</a>
+ </div>
+ </li>
+ <!-- <li><a href="/blog">Blog</a></li> -->
+ <li class="nav-item dropdown">
+ <a class="nav-link dropdown-toggle" href="#"
+ id="navbarDropdownASF" role="button" data-toggle="dropdown"
+ aria-haspopup="true" aria-expanded="false">
+ ASF Links
+ </a>
+ <div class="dropdown-menu" aria-labelledby="navbarDropdownASF">
+ <a class="dropdown-item" href="http://www.apache.org/">ASF
Website</a>
+ <a class="dropdown-item"
href="http://www.apache.org/licenses/">License</a>
+ <a class="dropdown-item"
href="http://www.apache.org/foundation/sponsorship.html">Donate</a>
+ <a class="dropdown-item"
href="http://www.apache.org/foundation/thanks.html">Thanks</a>
+ <a class="dropdown-item"
href="http://www.apache.org/security/">Security</a>
+ </div>
+ </li>
+ </ul>
+ <div class="flex-row justify-content-end ml-md-auto">
+ <a class="d-sm-none d-md-inline pr-2"
href="https://www.apache.org/events/current-event.html">
+ <img src="https://www.apache.org/events/current-event-234x60.png"/>
+ </a>
+ <a href="http://www.apache.org/">
+ <img src="/img/asf_logo.svg" width="120px"/>
+ </a>
+ </div>
+ </div><!-- /.navbar-collapse -->
+ </div>
+ </nav>
+
+ </header>
+
+ <div class="container p-lg-4">
+ <main role="main">
+
+
+
+<h1>
+ Apache Arrow Flightの紹介:高速データトランスポートフレームワーク
+ <a href="/blog/2019/10/13/introducing-arrow-flight-japanese/"
class="permalink" title="Permalink">∞</a>
+</h1>
+
+
+
+<p>
+ <span class="badge badge-secondary">Published</span>
+ <span class="published">
+ 13 Oct 2019
+ </span>
+ <br />
+ <span class="badge badge-secondary">By</span>
+
+ <a href="https://wesmckinney.com">Wes McKinney (wesm) </a>
+
+</p>
+
+
+ <!--
+
+-->
+
+<p><a href="/blog/2019/10/13/introducing-arrow-flight/">原文(English)</a></p>
+
+<p>この1.5年、Apache
Arrowコミュニティーは<strong>Flight</strong>の設計と実装を進めてきました。Flightは高速なデータトランスポートを実現するための新しいクライアント・サーバー型のフレームワークです。Flightを使うとネットワーク越しに大きなデータセットを送る処理を簡単に実現できます。Flightは特定用途向けに設計されたものではないため、幅広い用途で利用できます。</p>
+
+<p>Flightの実装は、まず、<a
href="https://grpc.io/">gRPC</a>を使ったArrow列指向フォーマット(つまり「Arrowレコードバッチ」)のトランスポートの最適化に注力しました。gRPCはGoogleが開発しているHTTP/2ベースのRPCライブラリー・フレームワークで、広く利用されています。gRPCも特定用途向けではなく幅広い用途で使えるように設計されています。これまでFlightをgRPCベースで実装することに注力してきましたが、gRPCでだけ使えるようにしたいわけではありません。</p>
+
+<p>Flightと他のデータトランスポートフレームワークとの大きな違いは並列転送機能です。クライアントとサーバークラスター間で同時にデータをストリームで転送できます。この機能により、簡単にスケーラブルなデータサービスを開発できます。スケーラブルなデータサービスとはクライアント数が増えても大丈夫なサービスです。</p>
+
+<p>Apache Arrow 0.15.0でC++(Pytonバインディングあり)とJavaでFlightを使えるようになっています。
現時点ではベータユーザー向けです。ベータユーザーとはFlight内部の低レベルの改良によりAPIやプロトコルが変わっても適応できるユーザーのことです。</p>
+
+<h2 id="モチベーション">モチベーション</h2>
+
+<p>多くの人がネットワーク越しに大きなデータセットにアクセスすることに関して困っています。リモートのデータサービスからデータセットを読むためのさまざまな転送プロトコルやツールがたくさんあります。たとえばODBCやJDBCです。この10年、ファイルベースでデータを保管することが多くなりました。このときにはCSVやAvroやParquetといったフォーマットがよく使われます。しかし、この方法ではデシリアライズする前に生データをローカルのホストに転送しなければいけないという問題があります。</p>
+
+<p>Apache Arrowの初期からやってきた作業によりさまざまな方法でデータトランスポートを加速できます。<a
href="https://github.com/apache/arrow/blob/master/docs/source/format/Columnar.rst">Arrow列指向フォーマット</a>には次の重要な機能があります。</p>
+
+<ul>
+ <li>表形式データの「転送用の」表現です。この表現はデータ受信側でデシリアライズが必要ありません。</li>
+
<li>標準で「バッチをストリーム送信」するためのモードがあります。このモードでは、大きなデータセットを複数の行ごとにまとめて転送します。(Arrowの用語では「レコードバッチ」と呼んでいます。)この記事では「データストリーム」について話します。データストリームとはApache
Arrowプロジェクトのバイナリープロトコルを使った一連のArrowレコードバッチです。</li>
+
<li>このフォーマットはプログラミング言語に依存していません。このフォーマットは現在11のプログラミング言語がサポートしています。サポートしているプログラミング言語は増え続けています。</li>
+</ul>
+
+<p>ODBCのような標準的なプロトコルの各実装は、通常、それぞれ独自の転送用バイナリープロトコルを実装します。これらのプロトコルは各ライブラリーの公開インターフェイスの表現と相互に変換しなければいけません。ODBC・JDBCライブラリーのパフォーマンスは場合によって大きく異なります。</p>
+
+<p>私たちのFlightの設計で目指していることは、データサービス用の新しいプロトコルを作ることです。このプロトコルは転送用のデータ表現にも開発者向けの公開APIにもArrow列指向フォーマットを使います。こうすることで、データトランスポート関連のシリアライズコストを減らし、分散データシステム全体を効率化できます。さらに、すでに別の用途にApache
Arrowを使っているシステム間では非常に効率的にデータをやりとりできます。</p>
+
+<h2 id="flightの基礎">Flightの基礎</h2>
+
+<p>Arrow
Flightライブラリーはデータストリームを送受信できるサービスを実装するための開発者向けフレームワークを提供します。Flightサーバーは次の基本的なリクエストをサポートしています。</p>
+
+<ul>
+
<li><strong>Handshake</strong>:クライアントが認証済みかを確認するシンプルなリクエスト。いくつかのケースでは、以降のリクエストのために実装定義のセッショントークンを確立します。</li>
+ <li><strong>ListFlights</strong>:利用可能なデータストリームのリストを返します。</li>
+ <li><strong>GetSchema</strong>:データストリームのスキーマを返します。</li>
+
<li><strong>GetFlightInfo</strong>:対象のデータセット用の「アクセスプラン」を返します。複数のデータストリームを消費しなければいけないかもしれません。このリクエストにはシリアライズしたカスタムコマンドを含めることができます。たとえば、アプリケーション固有のパラメーターを含めることができます。</li>
+ <li><strong>DoGet</strong>:クライアントにデータストリームを送信します。</li>
+ <li><strong>DoPut</strong>: クライアントからデータストリームを受信します。</li>
+ <li><strong>DoAction</strong>:実装依存のアクションを実行し、結果を返します。つまり、一般的な関数呼び出しです。</li>
+ <li><strong>ListActions</strong>:利用可能なアクションの種類を返します。</li>
+</ul>
+
+<p>gRPCの「双方向の」ストリーミングサポート(<a
href="https://grpc.io/docs/guides/concepts/">HTTP/2ストリーミング</a>上に実装されています)を活用して、リクエスト処理中でもデータとメタデータをクライアント・サーバー間でやりとりできます。</p>
+
+<p>単純なFlightの構成は1台のサーバーとそのサーバーに接続し<code
class="highlighter-rouge">DoGet</code>リクエストをするクライアントという構成です。</p>
+
+<div align="center">
+<img src="/img/20191014_flight_simple.png" alt="Flight Simple Architecture"
width="50%" class="img-responsive" />
+</div>
+
+<h2 id="grpcごしのデータスループットの最適化">gRPCごしのデータスループットの最適化</h2>
+
+<p>gRPCのような汎用メッセージングライブラリーを使うことには多くの利点があります。汎用ライブラリーはすでに多数の問題を解決しているからです。gRPCの場合はGoogleが多数の問題を解決していました。しかし、大きなデータセットのトランスポート性能を改善するためにいくつかの処理を改善する必要がありました。多くのgRPCユーザーは比較的小さなメッセージしか扱っていないからです。</p>
+
+<p>一番よくサポートされているgRPCを使う方法はサービスを<a
href="https://github.com/protocolbuffers/protobuf">Protocol
Buffers</a>(「Protobuf」と呼ばれることもあります)の<code
class="highlighter-rouge">.proto</code>ファイルで定義する方法です。gRPCのProtobufプラグインはgRPCサービスのスタブを生成します。このスタブを使ってアプリケーションを実装します。RPCコマンドとデータメッセージは<a
href="https://developers.google.com/protocol-buffers/docs/encoding">Protobufワイヤーフォーマット</a>を使ってシリアライズします。Flightでは「普通のgRPCとProtocol
Buffers」を使っているので、Arrow列指向フォーマットのことを知らないgRPCクライアントでもFlightサービスとやりとりできますし、Arrowデータの中身を気にせずに処理
[...]
+
+<p>Flightの中の主要なデータ関連のProtobufの型は<code
class="highlighter-rouge">FlightData</code>と呼ばれています。一般的にProtobufメッセージの読み書きにはコストがかかります。そのため、C++でもJavaでもgRPCにいくつか次のような低レベルの最適化を実装しています。</p>
+
+<ul>
+ <li><code
class="highlighter-rouge">FlightData</code>用のProtobufワイヤーフォーマットを生成します。<code
class="highlighter-rouge">FlightData</code>には送信対象のArrowレコードバッチが含まれていますが、メモリーコピー・シリアライズ処理は一切ありません。</li>
+ <li>Protobufで表現された<code
class="highlighter-rouge">FlightData</code>からメモリーコピー・デシリアライズ処理なしでArrowレコードバッチを再構築できます。実際には、Protocol
Bufersライブラリーにエンコードされたデータペイロードを触らせないようにしています。</li>
+</ul>
+
+<p>Protobufを使うがProtobufのメッセージパースのオーバーヘッドはなくしたいという両立できない2つのことを両立させようとしているということです。Flight実装は上述の最適化をして高速化しています。素のgRPCクライアントでもFlightサービスとやりとりできますが、素のgRPCクライアントにはこのような最適化はないので、Protobufライブラリーを使って<code
class="highlighter-rouge">FlightData</code>をデシリアライズすることになります。そのため、素のgRPCクライアントを使うといくらか性能が落ちます。</p>
+
+<p>FlightのC++実装でのデータスループットベンチマークの結果での絶対的な性能ですが、どちらもローカルホストで動いているサーバー・クライアント間のTCPスループットは2-3GB/sを上回っていました。ただし、TLSは無効にした状態です。このベンチマークは約4秒で12GBのデータを転送できることを示しています。</p>
+
+<div class="language-shell highlighter-rouge"><div class="highlight"><pre
class="highlight"><code><span class="nv">$ </span>./arrow-flight-benchmark
<span class="nt">--records_per_stream</span> 100000000
+Bytes <span class="nb">read</span>: 12800000000
+Nanos: 3900466413
+Speed: 3129.63 MB/s
+</code></pre></div></div>
+
+<p>この結果から次の2つのことを言えます。1つはFlightとgRPCを使うと相対的に小さなオーバーヘッドはあるということです。もう1つは多くの実際のFlightアプリケーションではネットワークの帯域がボトルネックになりそうということです。</p>
+
+<h2
id="水平方向のスケーラビリティ並列データアクセスとパーティション化したデータアクセス">水平方向のスケーラビリティ:並列データアクセスとパーティション化したデータアクセス</h2>
+
+<p>分散型のデータベースシステムの多くは「コーディネーター」を通してクライアントのリクエストを処理するアーキテクチャーパターンを使っています。クライアントへのデータセットを複数回転送するという明らかに効率に課題がある点はさておき、巨大なデータセットへのアクセスに対するスケーラビリティの問題もあります。</p>
+
+<p>Flightで次のようなシステムを作れるようにしました。それはこのようなボトルネックに取り組まずに水平方向にスケーラブルなデータサービスを作れるシステムです。<code
class="highlighter-rouge">GetFlightInfo</code> RPCを使ったクライアントのリクエストは
<strong>エンドポイント</strong> のリストを返します。返ってくる各エンドポイントにはサーバーの位置と
<strong>チケット</strong> の情報が入っています。チケットはデータセットの一部を取得する<code
class="highlighter-rouge">DoGet</code>リクエストに入れてサーバーに送ります。データセット全体にアクセスするためにはすべてのエンドポイントを処理する必要があります。どのエンドポイントのFlightのストリームから処理しなければいけないということはありません。どのエンドポイントのFlightのス�
��リームから処理しても構いません。しかし、特定の順序で処理するための仕組みは用意しています。その仕組みとはア [...]
+
+<p>この複数エンドポイントパターンにはたくさんの利点があります。</p>
+
+<ul>
+ <li>複数のクライアントが複数のエンドポイントから並列にデータを読み込めます。</li>
+ <li><code
class="highlighter-rouge">GetFlightInfo</code>「プランニング」リクエストを提供するサービスは兄弟サービスに処理を移譲できます。これにより、データの局所性の利点を得られたり、単純にロードバランスしやすくなったりします。</li>
+
<li>分散クラスター中のノードは異なる役割を引き受けることができます。たとえば、クラスター内の一部のノードはクエリープランニングに責任を持つかもしれません。一方、他のノードはデータストリームリクエスト(<code
class="highlighter-rouge">DoGet</code>または<code
class="highlighter-rouge">DoPut</code>)だけを処理するかもしれません。</li>
+</ul>
+
+<p>次の図はサービスの役割を分けた複数ノードアーキテクチャーの例です。</p>
+
+<div align="center">
+<img src="/img/20191014_flight_complex.png" alt="Flight Complex Architecture"
width="60%" class="img-responsive" />
+</div>
+
+<h2 id="アクションアプリケーション固有のロジックでflightを拡張">アクション:アプリケーション固有のロジックでFlightを拡張</h2>
+
+<p><code
class="highlighter-rouge">GetFlightInfo</code>リクエストはデータセットをリクエストするときにシリアライズしたコマンドを中身を気にせずに送ることができますが、クライアントはデータストリームの送受信以外の操作をサーバーに依頼できなければいけないかもしれません。たとえば、クライアントは特定のデータセットをメモリー上に「ピン止め」することを要求するかもしれません。ピン止めすることで他のクライアントからの後続のリクエストを高速に処理できます。</p>
+
+<p>Flightサービスは追加で「アクション」を定義できます。<code
class="highlighter-rouge">DoAction</code>
RPCでアクションを実行できます。アクションリクエストには実行したいアクションの名前と追加情報が入っています。追加情報は省略可能です。アクションの結果はgRPCストリームです。このgRPCストリーム中には任意の結果を入れられます。</p>
+
+<p>いくつかアクションの例を紹介します。</p>
+
+<ul>
+ <li>メタデータを見つけるアクション。組み込みの<code class="highlighter-rouge">ListFlights</code>
RPCでも提供されている機能ですが、<code
class="highlighter-rouge">ListFlights</code>の機能で不十分な場合はアクションで実現できます。</li>
+ <li>セッション固有のパラメーターを設定するアクション。</li>
+</ul>
+
+<p>サーバーはアクションを1つも実装しなくてもよいことに注意してください。また、アクションは結果を返さなくてもよいです。</p>
+
+<h2 id="暗号化と認証">暗号化と認証</h2>
+
+<p>Flightは組み込みで暗号化をサポートしています。gRPCの組み込みのTLS/OpenSSLの機能を使っています。</p>
+
+<p>クライアント側・サーバー側ともに拡張可能な認証ハンドラーがあります。この認証ハンドラーを使えば、ユーザー名とパスワードのようなシンプルな認証スキーマも使えますし、ケルベロスのような複雑な認証も使えます。Flightプロトコルには組み込みの<code
class="highlighter-rouge">BasicAuth</code>機能がついています。そのため、追加の開発なしでそのままユーザー名とパスワードの認証を実現できます。</p>
+
+<h2 id="ミドルウェアとトレース">ミドルウェアとトレース</h2>
+
+<p>gRPCには「インターセプター」というコンセプトがあります。インターセプターを使うと開発者が定義した「ミドルウェア」を開発できます。ミドルウェアを使うと届いたリクエストと送るリクエストに介在することができます。このような処理をするフレームワークに<a
href="https://opentracing.io/">OpenTracing</a>があります。</p>
+
+<p>ミドルウェアの機能は最近Flightに追加された機能です。そのため、今のところはmasterブランチでしか使えません。</p>
+
+<h2 id="grpcを使っているがgrpcだけではない">gRPCを使っているがgRPCだけではない</h2>
+
+<p><code class="highlighter-rouge">DoGet</code>リクエストでサーバーの位置を指定する方法にはRFC
3986準拠のURIを使っています。たとえば、TLSを使ったgRPCは<code
class="highlighter-rouge">grpc+tls://$HOST:$PORT</code>というように指定します。</p>
+
+<p>Flightサーバーの「コマンド」レイヤーにgRPCを使っているのは妥当だと思っていますが、<a
href="https://en.wikipedia.org/wiki/Remote_direct_memory_access">RDMA</a>のようなTCP以外のデータトランスポート層もサポートしたくなるかもしれません。設計・開発時間が必要になりますが、おそらく、TCP以外のプロトコル上でデータを転送するときでもgRPCを使えるでしょう。</p>
+
+<h2 id="はじめかたと今後の話">はじめかたと今後の話</h2>
+
+<p>Flightユーザー向けのドキュメントは作成中です。しかし、このライブラリーはベータユーザー向けには十分に使い物になります。ベータユーザーとは今後1年で発生するだろう軽微なAPI・プロトコルの変更に耐えられるユーザーです。</p>
+
+<p>Flightをためす簡単な方法はPython
APIを使う方法です。なぜならカスタムサーバーもカスタムクライアントもすべてPythonだけで定義できるからです。なにもコンパイルする必要はありません。Arrowのコードにある<a
href="https://github.com/apache/arrow/tree/apache-arrow-0.15.0/python/examples/flight">PythonでのFlightクライアントとサーバーの例</a>を参考にできます。</p>
+
+<p>実際に使っている例もあります。Dremioは<a
href="https://github.com/dremio-hub/dremio-flight-connector">Arrow
Flightベースの</a>コネクターを開発しました。このコネクターは<a
href="https://www.dremio.com/is-time-to-replace-odbc-jdbc/">ODBCよりも20-50倍よい性能を発揮する</a>ことを示しました。ArrowのコントリビューターであるRyan
MurrayはApache Sparkユーザー向けにFlight対応エンドポイントに接続する<a
href="https://github.com/rymurr/flight-spark-source">データソース実装</a>を作りました。</p>
+
+<p>最後に今後の話をします。gRPCではない(あるいはTCPではない)データトランスポートをサポートできないか研究開発を進めるかもしれません。Flightの開発が進むとユーザーが使えるFlight対応サービスが増えていくでしょう。Flightは開発フレームワークなので、ユーザーが使うAPIは高レベルなAPIだけになるようにするつもりです。高レベルなAPIではFlightの詳細と特定のFlightアプリケーションに関連する詳細を隠します。</p>
+
+
+ </main>
+
+ <hr/>
+<footer class="footer">
+ <p>Apache Arrow, Arrow, Apache, the Apache feather logo, and the Apache
Arrow project logo are either registered trademarks or trademarks of The Apache
Software Foundation in the United States and other countries.</p>
+ <p>© 2016-2019 The Apache Software Foundation</p>
+ <script type="text/javascript"
src="/assets/main-18cd3029557f73c1ee82e41113127b04f6fcd84c56d9db0cb9c40ebe26ef6e33.js"
integrity="sha256-GM0wKVV/c8HuguQRExJ7BPb82ExW2dsMucQOvibvbjM="
crossorigin="anonymous"></script>
+</footer>
+
+ </div>
+</body>
+</html>
diff --git a/blog/2019/10/13/introducing-arrow-flight/index.html
b/blog/2019/10/13/introducing-arrow-flight/index.html
index bb4d45c..d7c41e8 100644
--- a/blog/2019/10/13/introducing-arrow-flight/index.html
+++ b/blog/2019/10/13/introducing-arrow-flight/index.html
@@ -12,7 +12,7 @@
<!-- Begin Jekyll SEO tag v2.6.1 -->
<meta name="generator" content="Jekyll v3.8.4" />
<meta property="og:title" content="Introducing Apache Arrow Flight: A
Framework for Fast Data Transport" />
-<meta name="author" content="Wes McKinney" />
+<meta name="author" content="wesm" />
<meta property="og:locale" content="en_US" />
<meta name="description" content="This post introduces Arrow Flight, a
framework for building high performance data services. We have been building
Flight over the last 18 months and are looking for developers and users to get
involved." />
<meta property="og:description" content="This post introduces Arrow Flight, a
framework for building high performance data services. We have been building
Flight over the last 18 months and are looking for developers and users to get
involved." />
@@ -26,9 +26,9 @@
<meta property="twitter:image"
content="https://arrow.apache.org/img/arrow.png" />
<meta property="twitter:title" content="Introducing Apache Arrow Flight: A
Framework for Fast Data Transport" />
<meta name="twitter:site" content="@ApacheArrow" />
-<meta name="twitter:creator" content="@Wes McKinney" />
+<meta name="twitter:creator" content="@wesm" />
<script type="application/ld+json">
-{"description":"This post introduces Arrow Flight, a framework for building
high performance data services. We have been building Flight over the last 18
months and are looking for developers and users to get
involved.","@type":"BlogPosting","publisher":{"@type":"Organization","logo":{"@type":"ImageObject","url":"https://arrow.apache.org/img/logo.png"},"name":"Wes
McKinney"},"headline":"Introducing Apache Arrow Flight: A Framework for Fast
Data Transport","dateModified":"2019-10-13T02:00 [...]
+{"description":"This post introduces Arrow Flight, a framework for building
high performance data services. We have been building Flight over the last 18
months and are looking for developers and users to get
involved.","@type":"BlogPosting","publisher":{"@type":"Organization","logo":{"@type":"ImageObject","url":"https://arrow.apache.org/img/logo.png"},"name":"wesm"},"headline":"Introducing
Apache Arrow Flight: A Framework for Fast Data
Transport","dateModified":"2019-10-13T02:00:00-04:0 [...]
<!-- End Jekyll SEO tag -->
@@ -230,7 +230,7 @@
<br />
<span class="badge badge-secondary">By</span>
- Wes McKinney
+ <a href="https://wesmckinney.com">Wes McKinney (wesm) </a>
</p>
@@ -239,6 +239,8 @@
-->
+<p>Translations: <a
href="/blog/2019/10/13/introducing-arrow-flight-japanese/">日本語</a></p>
+
<p>Over the last 18 months, the Apache Arrow community has been busy designing
and
implementing <strong>Flight</strong>, a new general-purpose client-server
framework to
simplify high performance transport of large datasets over network
interfaces.</p>
diff --git a/blog/index.html b/blog/index.html
index 0c3989c..b4686a1 100644
--- a/blog/index.html
+++ b/blog/index.html
@@ -233,7 +233,7 @@
<br />
<span class="badge badge-secondary">By</span>
- Wes McKinney
+ <a href="https://wesmckinney.com">Wes McKinney (wesm) </a>
</p>
@@ -241,6 +241,8 @@
-->
+<p>Translations: <a
href="/blog/2019/10/13/introducing-arrow-flight-japanese/">日本語</a></p>
+
<p>Over the last 18 months, the Apache Arrow community has been busy designing
and
implementing <strong>Flight</strong>, a new general-purpose client-server
framework to
simplify high performance transport of large datasets over network
interfaces.</p>
@@ -505,6 +507,8 @@ service.</p>
+
+
<div class="blog-post" style="margin-bottom: 4rem">
diff --git a/feed.xml b/feed.xml
index f9f43a4..eb82e96 100644
--- a/feed.xml
+++ b/feed.xml
@@ -1,7 +1,148 @@
-<?xml version="1.0" encoding="utf-8"?><feed
xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/"
version="3.8.4">Jekyll</generator><link
href="https://arrow.apache.org/feed.xml" rel="self" type="application/atom+xml"
/><link href="https://arrow.apache.org/" rel="alternate" type="text/html"
/><updated>2019-10-26T14:24:23-04:00</updated><id>https://arrow.apache.org/feed.xml</id><title
type="html">Apache Arrow</title><subtitle>Apache Arrow is a cross-language
developm [...]
+<?xml version="1.0" encoding="utf-8"?><feed
xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/"
version="3.8.4">Jekyll</generator><link
href="https://arrow.apache.org/feed.xml" rel="self" type="application/atom+xml"
/><link href="https://arrow.apache.org/" rel="alternate" type="text/html"
/><updated>2019-10-27T21:23:46-04:00</updated><id>https://arrow.apache.org/feed.xml</id><title
type="html">Apache Arrow</title><subtitle>Apache Arrow is a cross-language
developm [...]
-->
+<p><a
href="/blog/2019/10/13/introducing-arrow-flight/">原文(English)</a></p>
+
+<p>この1.5年、Apache
Arrowコミュニティーは<strong>Flight</strong>の設計と実装を進めてきました。Flightは高速なデータトランスポートを実現するための新しいクライアント・サーバー型のフレームワークです。Flightを使うとネットワーク越しに大きなデータセットを送る処理を簡単に実現できます。Flightは特定用途向けに設計されたものではないため、幅広い用途で利用できます。</p>
+
+<p>Flightの実装は、まず、<a
href="https://grpc.io/">gRPC</a>を使ったArrow列指向フォーマット(つまり「Arrowレコードバッチ」)のトランスポートの最適化に注力しました。gRPCはGoogleが開発しているHTTP/2ベースのRPCライブラリー・フレームワークで、広く利用されています。gRPCも特定用途向けではなく幅広い用途で使えるように設計されています。これまでFlightをgRPCベースで実装することに注力してきましたが、gRPCでだけ使えるようにしたいわけではありません。</p>
+
+<p>Flightと他のデータトランスポートフレームワークとの大きな違いは並列転送機能です。クライアントとサーバークラスター間で同時にデータをストリームで転送できます。この機能により、簡単にスケーラブルなデータサービスを開発できます。スケーラブルなデータサービスとはクライアント数が増えても大丈夫なサービスです。</p>
+
+<p>Apache Arrow 0.15.0でC++(Pytonバインディングあり)とJavaでFlightを使えるようになっています。
現時点ではベータユーザー向けです。ベータユーザーとはFlight内部の低レベルの改良によりAPIやプロトコルが変わっても適応できるユーザーのことです。</p>
+
+<h2 id="モチベーション">モチベーション</h2>
+
+<p>多くの人がネットワーク越しに大きなデータセットにアクセスすることに関して困っています。リモートのデータサービスからデータセットを読むためのさまざまな転送プロトコルやツールがたくさんあります。たとえばODBCやJDBCです。この10年、ファイルベースでデータを保管することが多くなりました。このときにはCSVやAvroやParquetといったフォーマットがよく使われます。しかし、この方法ではデシリアライズする前に生データをローカルのホストに転送しなければいけないという問題があります。</p>
+
+<p>Apache Arrowの初期からやってきた作業によりさまざまな方法でデータトランスポートを加速できます。<a
href="https://github.com/apache/arrow/blob/master/docs/source/format/Columnar.rst">Arrow列指向フォーマット</a>には次の重要な機能があります。</p>
+
+<ul>
+ <li>表形式データの「転送用の」表現です。この表現はデータ受信側でデシリアライズが必要ありません。</li>
+
<li>標準で「バッチをストリーム送信」するためのモードがあります。このモードでは、大きなデータセットを複数の行ごとにまとめて転送します。(Arrowの用語では「レコードバッチ」と呼んでいます。)この記事では「データストリーム」について話します。データストリームとはApache
Arrowプロジェクトのバイナリープロトコルを使った一連のArrowレコードバッチです。</li>
+
<li>このフォーマットはプログラミング言語に依存していません。このフォーマットは現在11のプログラミング言語がサポートしています。サポートしているプログラミング言語は増え続けています。</li>
+</ul>
+
+<p>ODBCのような標準的なプロトコルの各実装は、通常、それぞれ独自の転送用バイナリープロトコルを実装します。これらのプロトコルは各ライブラリーの公開インターフェイスの表現と相互に変換しなければいけません。ODBC・JDBCライブラリーのパフォーマンスは場合によって大きく異なります。</p>
+
+<p>私たちのFlightの設計で目指していることは、データサービス用の新しいプロトコルを作ることです。このプロトコルは転送用のデータ表現にも開発者向けの公開APIにもArrow列指向フォーマットを使います。こうすることで、データトランスポート関連のシリアライズコストを減らし、分散データシステム全体を効率化できます。さらに、すでに別の用途にApache
Arrowを使っているシステム間では非常に効率的にデータをやりとりできます。</p>
+
+<h2 id="flightの基礎">Flightの基礎</h2>
+
+<p>Arrow
Flightライブラリーはデータストリームを送受信できるサービスを実装するための開発者向けフレームワークを提供します。Flightサーバーは次の基本的なリクエストをサポートしています。</p>
+
+<ul>
+
<li><strong>Handshake</strong>:クライアントが認証済みかを確認するシンプルなリクエスト。いくつかのケースでは、以降のリクエストのために実装定義のセッショントークンを確立します。</li>
+
<li><strong>ListFlights</strong>:利用可能なデータストリームのリストを返します。</li>
+
<li><strong>GetSchema</strong>:データストリームのスキーマを返します。</li>
+
<li><strong>GetFlightInfo</strong>:対象のデータセット用の「アクセスプラン」を返します。複数のデータストリームを消費しなければいけないかもしれません。このリクエストにはシリアライズしたカスタムコマンドを含めることができます。たとえば、アプリケーション固有のパラメーターを含めることができます。</li>
+
<li><strong>DoGet</strong>:クライアントにデータストリームを送信します。</li>
+ <li><strong>DoPut</strong>:
クライアントからデータストリームを受信します。</li>
+
<li><strong>DoAction</strong>:実装依存のアクションを実行し、結果を返します。つまり、一般的な関数呼び出しです。</li>
+
<li><strong>ListActions</strong>:利用可能なアクションの種類を返します。</li>
+</ul>
+
+<p>gRPCの「双方向の」ストリーミングサポート(<a
href="https://grpc.io/docs/guides/concepts/">HTTP/2ストリーミング</a>上に実装されています)を活用して、リクエスト処理中でもデータとメタデータをクライアント・サーバー間でやりとりできます。</p>
+
+<p>単純なFlightの構成は1台のサーバーとそのサーバーに接続し<code
class="highlighter-rouge">DoGet</code>リクエストをするクライアントという構成です。</p>
+
+<div align="center">
+<img src="/img/20191014_flight_simple.png" alt="Flight
Simple Architecture" width="50%"
class="img-responsive" />
+</div>
+
+<h2 id="grpcごしのデータスループットの最適化">gRPCごしのデータスループットの最適化</h2>
+
+<p>gRPCのような汎用メッセージングライブラリーを使うことには多くの利点があります。汎用ライブラリーはすでに多数の問題を解決しているからです。gRPCの場合はGoogleが多数の問題を解決していました。しかし、大きなデータセットのトランスポート性能を改善するためにいくつかの処理を改善する必要がありました。多くのgRPCユーザーは比較的小さなメッセージしか扱っていないからです。</p>
+
+<p>一番よくサポートされているgRPCを使う方法はサービスを<a
href="https://github.com/protocolbuffers/protobuf">Protocol
Buffers</a>(「Protobuf」と呼ばれることもあります)の<code
class="highlighter-rouge">.proto</code>ファイルで定義する方法です。gRPCのProtobufプラグインはgRPCサービスのスタブを生成します。このスタブを使ってアプリケーションを実装します。RPCコマンドとデータメッセージは<a
href="https://developers.google.com/protocol-buffers/docs/encoding">Protobufワイヤーフォーマット</a>を使ってシリアライズします。Flightでは「普通のgRPCとProtocol
Buffers」を使っているので、Ar [...]
+
+<p>Flightの中の主要なデータ関連のProtobufの型は<code
class="highlighter-rouge">FlightData</code>と呼ばれています。一般的にProtobufメッセージの読み書きにはコストがかかります。そのため、C++でもJavaでもgRPCにいくつか次のような低レベルの最適化を実装しています。</p>
+
+<ul>
+ <li><code
class="highlighter-rouge">FlightData</code>用のProtobufワイヤーフォーマットを生成します。<code
class="highlighter-rouge">FlightData</code>には送信対象のArrowレコードバッチが含まれていますが、メモリーコピー・シリアライズ処理は一切ありません。</li>
+ <li>Protobufで表現された<code
class="highlighter-rouge">FlightData</code>からメモリーコピー・デシリアライズ処理なしでArrowレコードバッチを再構築できます。実際には、Protocol
Bufersライブラリーにエンコードされたデータペイロードを触らせないようにしています。</li>
+</ul>
+
+<p>Protobufを使うがProtobufのメッセージパースのオーバーヘッドはなくしたいという両立できない2つのことを両立させようとしているということです。Flight実装は上述の最適化をして高速化しています。素のgRPCクライアントでもFlightサービスとやりとりできますが、素のgRPCクライアントにはこのような最適化はないので、Protobufライブラリーを使って<code
class="highlighter-rouge">FlightData</code>をデシリアライズすることになります。そのため、素のgRPCクライアントを使うといくらか性能が落ちます。</p>
+
+<p>FlightのC++実装でのデータスループットベンチマークの結果での絶対的な性能ですが、どちらもローカルホストで動いているサーバー・クライアント間のTCPスループットは2-3GB/sを上回っていました。ただし、TLSは無効にした状態です。このベンチマークは約4秒で12GBのデータを転送できることを示しています。</p>
+
+<div class="language-shell highlighter-rouge"><div
class="highlight"><pre
class="highlight"><code><span class="nv">$
</span>./arrow-flight-benchmark <span
class="nt">--records_per_stream</span> 100000000
+Bytes <span class="nb">read</span>: 12800000000
+Nanos: 3900466413
+Speed: 3129.63 MB/s
+</code></pre></div></div>
+
+<p>この結果から次の2つのことを言えます。1つはFlightとgRPCを使うと相対的に小さなオーバーヘッドはあるということです。もう1つは多くの実際のFlightアプリケーションではネットワークの帯域がボトルネックになりそうということです。</p>
+
+<h2
id="水平方向のスケーラビリティ並列データアクセスとパーティション化したデータアクセス">水平方向のスケーラビリティ:並列データアクセスとパーティション化したデータアクセス</h2>
+
+<p>分散型のデータベースシステムの多くは「コーディネーター」を通してクライアントのリクエストを処理するアーキテクチャーパターンを使っています。クライアントへのデータセットを複数回転送するという明らかに効率に課題がある点はさておき、巨大なデータセットへのアクセスに対するスケーラビリティの問題もあります。</p>
+
+<p>Flightで次のようなシステムを作れるようにしました。それはこのようなボトルネックに取り組まずに水平方向にスケーラブルなデータサービスを作れるシステムです。<code
class="highlighter-rouge">GetFlightInfo</code>
RPCを使ったクライアントのリクエストは <strong>エンドポイント</strong>
のリストを返します。返ってくる各エンドポイントにはサーバーの位置と <strong>チケット</strong>
の情報が入っています。チケットはデータセットの一部を取得する<code
class="highlighter-rouge">DoGet</code>リクエストに入れてサーバーに送ります。データセット全体にアクセスするためにはすべてのエンドポイントを処理する必要があります。どのエンドポイントのFlightのストリームから処理しなければいけないと�
�うことはありませ [...]
+
+<p>この複数エンドポイントパターンにはたくさんの利点があります。</p>
+
+<ul>
+ <li>複数のクライアントが複数のエンドポイントから並列にデータを読み込めます。</li>
+ <li><code
class="highlighter-rouge">GetFlightInfo</code>「プランニング」リクエストを提供するサービスは兄弟サービスに処理を移譲できます。これにより、データの局所性の利点を得られたり、単純にロードバランスしやすくなったりします。</li>
+
<li>分散クラスター中のノードは異なる役割を引き受けることができます。たとえば、クラスター内の一部のノードはクエリープランニングに責任を持つかもしれません。一方、他のノードはデータストリームリクエスト(<code
class="highlighter-rouge">DoGet</code>または<code
class="highlighter-rouge">DoPut</code>)だけを処理するかもしれません。</li>
+</ul>
+
+<p>次の図はサービスの役割を分けた複数ノードアーキテクチャーの例です。</p>
+
+<div align="center">
+<img src="/img/20191014_flight_complex.png" alt="Flight
Complex Architecture" width="60%"
class="img-responsive" />
+</div>
+
+<h2
id="アクションアプリケーション固有のロジックでflightを拡張">アクション:アプリケーション固有のロジックでFlightを拡張</h2>
+
+<p><code
class="highlighter-rouge">GetFlightInfo</code>リクエストはデータセットをリクエストするときにシリアライズしたコマンドを中身を気にせずに送ることができますが、クライアントはデータストリームの送受信以外の操作をサーバーに依頼できなければいけないかもしれません。たとえば、クライアントは特定のデータセットをメモリー上に「ピン止め」することを要求するかもしれません。ピン止めすることで他のクライアントからの後続のリクエストを高速に処理できます。</p>
+
+<p>Flightサービスは追加で「アクション」を定義できます。<code
class="highlighter-rouge">DoAction</code>
RPCでアクションを実行できます。アクションリクエストには実行したいアクションの名前と追加情報が入っています。追加情報は省略可能です。アクションの結果はgRPCストリームです。このgRPCストリーム中には任意の結果を入れられます。</p>
+
+<p>いくつかアクションの例を紹介します。</p>
+
+<ul>
+ <li>メタデータを見つけるアクション。組み込みの<code
class="highlighter-rouge">ListFlights</code>
RPCでも提供されている機能ですが、<code
class="highlighter-rouge">ListFlights</code>の機能で不十分な場合はアクションで実現できます。</li>
+ <li>セッション固有のパラメーターを設定するアクション。</li>
+</ul>
+
+<p>サーバーはアクションを1つも実装しなくてもよいことに注意してください。また、アクションは結果を返さなくてもよいです。</p>
+
+<h2 id="暗号化と認証">暗号化と認証</h2>
+
+<p>Flightは組み込みで暗号化をサポートしています。gRPCの組み込みのTLS/OpenSSLの機能を使っています。</p>
+
+<p>クライアント側・サーバー側ともに拡張可能な認証ハンドラーがあります。この認証ハンドラーを使えば、ユーザー名とパスワードのようなシンプルな認証スキーマも使えますし、ケルベロスのような複雑な認証も使えます。Flightプロトコルには組み込みの<code
class="highlighter-rouge">BasicAuth</code>機能がついています。そのため、追加の開発なしでそのままユーザー名とパスワードの認証を実現できます。</p>
+
+<h2 id="ミドルウェアとトレース">ミドルウェアとトレース</h2>
+
+<p>gRPCには「インターセプター」というコンセプトがあります。インターセプターを使うと開発者が定義した「ミドルウェア」を開発できます。ミドルウェアを使うと届いたリクエストと送るリクエストに介在することができます。このような処理をするフレームワークに<a
href="https://opentracing.io/">OpenTracing</a>があります。</p>
+
+<p>ミドルウェアの機能は最近Flightに追加された機能です。そのため、今のところはmasterブランチでしか使えません。</p>
+
+<h2 id="grpcを使っているがgrpcだけではない">gRPCを使っているがgRPCだけではない</h2>
+
+<p><code
class="highlighter-rouge">DoGet</code>リクエストでサーバーの位置を指定する方法にはRFC
3986準拠のURIを使っています。たとえば、TLSを使ったgRPCは<code
class="highlighter-rouge">grpc+tls://$HOST:$PORT</code>というように指定します。</p>
+
+<p>Flightサーバーの「コマンド」レイヤーにgRPCを使っているのは妥当だと思っていますが、<a
href="https://en.wikipedia.org/wiki/Remote_direct_memory_access">RDMA</a>のようなTCP以外のデータトランスポート層もサポートしたくなるかもしれません。設計・開発時間が必要になりますが、おそらく、TCP以外のプロトコル上でデータを転送するときでもgRPCを使えるでしょう。</p>
+
+<h2 id="はじめかたと今後の話">はじめかたと今後の話</h2>
+
+<p>Flightユーザー向けのドキュメントは作成中です。しかし、このライブラリーはベータユーザー向けには十分に使い物になります。ベータユーザーとは今後1年で発生するだろう軽微なAPI・プロトコルの変更に耐えられるユーザーです。</p>
+
+<p>Flightをためす簡単な方法はPython
APIを使う方法です。なぜならカスタムサーバーもカスタムクライアントもすべてPythonだけで定義できるからです。なにもコンパイルする必要はありません。Arrowのコードにある<a
href="https://github.com/apache/arrow/tree/apache-arrow-0.15.0/python/examples/flight">PythonでのFlightクライアントとサーバーの例</a>を参考にできます。</p>
+
+<p>実際に使っている例もあります。Dremioは<a
href="https://github.com/dremio-hub/dremio-flight-connector">Arrow
Flightベースの</a>コネクターを開発しました。このコネクターは<a
href="https://www.dremio.com/is-time-to-replace-odbc-jdbc/">ODBCよりも20-50倍よい性能を発揮する</a>ことを示しました。ArrowのコントリビューターであるRyan
MurrayはApache Sparkユーザー向けにFlight対応エンドポイントに接続する<a
href="https://github.com/rymurr/flight-spark-source">データソース実装</a>を作りました。</p>
+
+<p>最後に今後の話をします。gRPCではない(あるいはTCPではない)データトランスポートをサポートできないか研究開発を進めるかもしれません。Flightの開発が進むとユーザーが使えるFlight対応サービスが増えていくでしょう。Flightは開発フレームワークなので、ユーザーが使うAPIは高レベルなAPIだけになるようにするつもりです。高レベルなAPIではFlightの詳細と特定のFlightアプリケーションに関連する詳細を隠します。</p></content><author><name>wesm</name></author><media:thumbnail
xmlns:media="http://search.yahoo.com/mrss/"
url="https://arrow.apache.org/img/arrow.png" /></entry><entry><title
type="html">Introducing Apache Arrow Flight: A Framework for Fast Data
Transport< [...]
+
+-->
+
+<p>Translations: <a
href="/blog/2019/10/13/introducing-arrow-flight-japanese/">日本語</a></p>
+
<p>Over the last 18 months, the Apache Arrow community has been busy
designing and
implementing <strong>Flight</strong>, a new general-purpose
client-server framework to
simplify high performance transport of large datasets over network
interfaces.</p>
@@ -258,7 +399,7 @@ lot of the Flight work from here will be creating
user-facing Flight-enabled
services. Since Flight is a development framework, we expect that user-facing
APIs will utilize a layer of API veneer that hides many general Flight details
and details related to a particular application of Flight in a custom data
-service.</p></content><author><name>Wes
McKinney</name></author><media:thumbnail
xmlns:media="http://search.yahoo.com/mrss/"
url="https://arrow.apache.org/img/arrow.png" /></entry><entry><title
type="html">Apache Arrow 0.15.0 Release</title><link
href="https://arrow.apache.org/blog/2019/10/06/0.15.0-release/" rel="alternate"
type="text/html" title="Apache Arrow 0.15.0 Release"
/><published>2019-10-06T02:00:00-04:00</published><updated>2019-10-06T02:00:00-04:00</updated><id>https://
[...]
+service.</p></content><author><name>wesm</name></author><media:thumbnail
xmlns:media="http://search.yahoo.com/mrss/"
url="https://arrow.apache.org/img/arrow.png" /></entry><entry><title
type="html">Apache Arrow 0.15.0 Release</title><link
href="https://arrow.apache.org/blog/2019/10/06/0.15.0-release/" rel="alternate"
type="text/html" title="Apache Arrow 0.15.0 Release"
/><published>2019-10-06T02:00:00-04:00</published><updated>2019-10-06T02:00:00-04:00</updated><id>https://arrow.ap
[...]
-->
@@ -1767,162 +1908,4 @@ transform it and copy it back to the socket
connection.</p>
<p>Additional benchmarks and fine-tuning parameters can be found under
<code class="highlighter-rouge">sparklyr</code>
<a
href="https://github.com/rstudio/sparklyr/pull/1611">/rstudio/sparklyr/pull/1611</a>
and <code class="highlighter-rouge">SparkR</code> <a
href="https://github.com/apache/spark/pull/22954">/apache/spark/pull/22954</a>.
Looking forward to bringing this feature
-to the Spark, Arrow and R communities.</p></content><author><name>Javier
Luraschi</name></author><media:thumbnail
xmlns:media="http://search.yahoo.com/mrss/"
url="https://arrow.apache.org/img/arrow.png" /></entry><entry><title
type="html">Apache Arrow 0.12.0 Release</title><link
href="https://arrow.apache.org/blog/2019/01/21/0.12.0-release/" rel="alternate"
type="text/html" title="Apache Arrow 0.12.0 Release"
/><published>2019-01-21T08:00:00-05:00</published><updated>2019-01-21T08: [...]
-
--->
-
-<p>The Apache Arrow team is pleased to announce the 0.12.0 release. This
is the
-largest release yet in the project, covering 3 months of development work and
-includes <a
href="https://issues.apache.org/jira/issues/?jql=project%20%3D%20ARROW%20AND%20status%20in%20(Resolved%2C%20Closed)%20AND%20fixVersion%20%3D%200.12.0"><strong>614
resolved issues</strong></a> from <a
href="https://arrow.apache.org/release/0.12.0.html#contributors"><strong>77
distinct contributors</strong></a>.</p>
-
-<p>See the <a
href="https://arrow.apache.org/install">Install Page</a> to
learn how to get the libraries for your
-platform. The <a
href="https://arrow.apache.org/release/0.12.0.html">complete
changelog</a> is also available.</p>
-
-<p>It’s a huge release, but we’ll give some brief highlights and new
from the
-project to help guide you to the parts of the project that may be of
interest.</p>
-
-<h2 id="new-committers-and-pmc-member">New committers and PMC
member</h2>
-
-<p>The Arrow team is growing! Since the 0.11.0 release we have added 3
new
-committers:</p>
-
-<ul>
- <li><a href="https://github.com/sbinet">Sebastien
Binet</a>, who has mainly worked on the Go implementation</li>
- <li><a href="https://github.com/romainfrancois">Romain
Francois</a>, who has mainly worked on the R implementation</li>
- <li><a href="https://github.com/shiro615">Yosuke
Shiro</a>, who has mainly worked on the GLib (C) and Ruby
-implementations</li>
-</ul>
-
-<p>We also pleased to announce that <a
href="https://github.com/kszucs">Krisztián Szűcs</a> has
been promoted
-from committer to PMC (Project Management Committee) member.</p>
-
-<p>Thank you for all your contributions!</p>
-
-<h2 id="code-donations">Code donations</h2>
-
-<p>Since the last release, we have received 3 code donations into the
Apache
-project.</p>
-
-<ul>
- <li>A <a
href="http://incubator.apache.org/ip-clearance/arrow-csharp-library.html">native
C# .NET library</a> donated by Feyen Zylstra LLC.</li>
- <li>A <a
href="http://incubator.apache.org/ip-clearance/arrow-parquet-ruby.html">Ruby
library for Parquet files</a> which uses the existing GLib bindings to
-the C++ Parquet library.</li>
- <li>A <a
href="http://incubator.apache.org/ip-clearance/arrow-parquet-rust.html">native
Rust Parquet library</a></li>
-</ul>
-
-<p>We are excited to continue to grow the Apache Arrow development
community.</p>
-
-<h2 id="combined-project-level-documentation">Combined
project-level documentation</h2>
-
-<p>Since the last release, we have merged the Python and C++
documentation to
-create a combined project-wide documentation site:
-https://arrow.apache.org/docs. There is now some prose documentation about many
-parts of the C++ library. We intend to keep adding documentation for other
-parts of Apache Arrow to this site.</p>
-
-<h2 id="packages">Packages</h2>
-
-<p>We start providing the official APT and Yum repositories for C++ and
-GLib (C). See the <a
href="https://arrow.apache.org/install/">install
document</a> for details.</p>
-
-<h2 id="c-notes">C++ notes</h2>
-
-<p>Much of the C++ development work the last 3 months concerned internal
code
-refactoring and performance improvements. Some user-visible highlights of
note:</p>
-
-<ul>
- <li>Experimental support for <a
href="https://github.com/apache/arrow/blob/master/cpp/src/arrow/sparse_tensor.h">in-memory
sparse tensors (or ndarrays)</a>, with
-support for zero-copy IPC</li>
- <li>Support for building on Alpine Linux</li>
- <li>Significantly improved hash table utilities, with improved hash
table
-performance in many parts of the library</li>
- <li>IO library improvements for both read and write
buffering</li>
- <li>A fast <a
href="https://github.com/apache/arrow/blob/master/cpp/src/arrow/util/trie.h">trie
implementation</a> for string searching</li>
- <li>Many improvements to the parallel CSV reader in performance and
features. See
-the changelog</li>
-</ul>
-
-<p>Since the LLVM-based Gandiva expression compiler was donated to
Apache Arrow
-during the last release cycle, development there has been moving along. We
-expect to have Windows support for Gandiva and to ship this in downstream
-packages (like Python) in the 0.13 release time frame.</p>
-
-<h2 id="go-notes">Go notes</h2>
-
-<p>The Arrow Go development team has been expanding. The Go library has
gained
-support for many missing features from the columnar format as well as semantic
-constructs like chunked arrays and tables that are used heavily in the C++
-project.</p>
-
-<h2 id="glib-and-ruby-notes">GLib and Ruby notes</h2>
-
-<p>Development of the GLib-based C bindings and corresponding Ruby
interfaces have
-advanced in lock-step with the C++, Python, and R libraries. In this release,
-there are many new features in C and Ruby:</p>
-
-<ul>
- <li>Compressed file read/write support</li>
- <li>Support for using the C++ parallel CSV reader</li>
- <li>Feather file support</li>
- <li>Gandiva bindings</li>
- <li>Plasma bindings</li>
-</ul>
-
-<h2 id="python-notes">Python notes</h2>
-
-<p>We fixed a ton of bugs and made many improvements throughout the
Python
-project. Some highlights from the Python side include:</p>
-
-<ul>
- <li>Python 3.7 support: wheels and conda packages are now available
for Python
-3.7</li>
- <li>Substantially improved memory use when converting strings types to
pandas
-format, including when reading Parquet files. Parquet users should notice
-significantly lower memory use in common use cases</li>
- <li>Support for reading and writing compressed files, can be used for
CSV files,
-IPC, or any other form of IO</li>
- <li>The new <code
class="highlighter-rouge">pyarrow.input_stream</code> and
<code
class="highlighter-rouge">pyarrow.output_stream</code>
functions support
-read and write buffering. This is analogous to <code
class="highlighter-rouge">BufferedIOBase</code> from the
-Python standard library, but the internals are implemented natively in
C++.</li>
- <li>Gandiva (LLVM expression compiler) bindings, though not yet
available in
-pip/conda yet. Look for this in 0.13.0.</li>
- <li>Many improvements to Arrow CUDA integration, including
interoperability with
-Numba</li>
-</ul>
-
-<h2 id="r-notes">R notes</h2>
-
-<p>The R library made huge progress in 0.12, with work led by new
committer Romain
-Francois. The R project’s features are not far behind the Python library, and
-we are hoping to be able to make the R library available to CRAN users for use
-with Apache Spark or for reading and writing Parquet files over the next
-quarter.</p>
-
-<p>Users of the <code
class="highlighter-rouge">feather</code> R library will see
significant speed increases in many
-cases when reading Feather files with the new Arrow R library.</p>
-
-<h2 id="rust-notes">Rust notes</h2>
-
-<p>Rust development had an active last 3 months; see the changelog for
details.</p>
-
-<p>A native Rust implementation was just donated to the project, and the
community
-intends to provide a similar level of functionality for reading and writing
-Parquet files using the Arrow in-memory columnar format as an
intermediary.</p>
-
-<h2 id="upcoming-roadmap-outlook-for-2019">Upcoming Roadmap,
Outlook for 2019</h2>
-
-<p>Apache Arrow has become a large, diverse open source project. It is
now being
-used in dozens of downstream open source and commercial projects. Work will be
-proceeding in many areas in 2019:</p>
-
-<ul>
- <li>Development of in-memory query execution engines (e.g. in C++,
Rust)</li>
- <li>Expanded support for reading and writing the Apache Parquet
format, and other
-common data formats like Apache Avro, CSV, JSON, and Apache ORC.</li>
- <li>New Flight RPC system for fast messaging of Arrow
datasets</li>
- <li>Expanded support in existing programming languages</li>
- <li>New programming language bindings or native
implementations</li>
-</ul>
-
-<p>It promises to be an exciting 2019. We look forward to having you
involved in
-the development
community.</p></content><author><name>wesm</name></author><media:thumbnail
xmlns:media="http://search.yahoo.com/mrss/"
url="https://arrow.apache.org/img/arrow.png" /></entry></feed>
\ No newline at end of file
+to the Spark, Arrow and R communities.</p></content><author><name>Javier
Luraschi</name></author><media:thumbnail
xmlns:media="http://search.yahoo.com/mrss/"
url="https://arrow.apache.org/img/arrow.png" /></entry></feed>
\ No newline at end of file