#arrow
- 来源: [Introducing Apache Arrow Flight: A Framework for Fast Data Transport](https://arrow.apache.org/blog/2019/10/13/introducing-arrow-flight/)
- 定位:通用的 client-server 框架,简化大数据集高性能跨网络传输。
- 最初专注于在 gRPC 之上传输 Arrow 列存格式(Arrow record batches),但并不专属于 gRPC。
- 与其他数据传输框架不同的最大特性之一是:**parallel transfer**
----
# Motivation
- 竞品:ODBC、JDBC等,从 remote data services 读取 datasets
- 挑战:raw data must be transferred to local hosts before being deserialized.
- Arrow 列式格式具有一些关键特性可以帮助我们:
- on-the-wire,接收时不需要反序列化
- streaming batches,一次一批数据(record batches)
- 格式是语言独立的,已经有 11 种语言的支持,并且还在增加。
- 设计目标:over-the-write 数据表示和 public API 都适用 Arrow 列存格式。
- 可以减少/消除序列化开销。
- 如果系统已经使用了 Arrow,接入它很方便。
------
# Flight Basics
- Arrow Flight 库提供了一个开发框架,可以实现一套接收和发送 data streams 的服务。
- 一个 Flight Server 支持几种基本的请求:
- **Handshake**:判断客户端是否已认证,某些情况下实现 session token 相关逻辑。
- **ListFlights**:返回 available data streams 列表
- **GetSchema**:返回某个 data stream 的 schema
- **GetFlightInfo**:针对某一个感兴趣的数据集,返回一个 access plan,可能需要消费多个 data stream。此请求可以接受包含自定义序列化命令的内容,例如用户特定的应用程序参数。
- **DoGet**:发送一个 data stream 给 client。
- **DoPut**:从 client 接受一个 data stream。
- **DoAction**:执行一个特定于实现的操作并返回任何结果。
- **ListAction**:返回 available action types 的列表。
- 我们利用了 gRPC 双向流的特性,允许客户端和服务端在请求被处理时同时发送数据和元数据给对方。
- 一个简单的流程示例:
- 
-----
# Optimizing Data Throughput over gRPC
- Flight 中主要与数据相关的 Protobuf 类型就是 `FlightData`。
- 读写 Protobuf 消息通常都有开销,所以我们在 C 和 Java 上针对 gRPC 做了一些低层次的优化:
- 从 record batch 生成 FlightData 的 protobuf 线上格式,不需要内存拷贝和序列化。
- 从 FlightData 中重建 Arrow record 也不需要内存拷贝和反序列化。
---------
# Horizontal Scalability: Parallel and Partitioned Data Access
- 在许多分布式数据库的架构中,客户端的请求结果都需要 coordinator 路由中转。除了多次传输带来的效率问题,扩展能力上也会有问题。
- Flight 中,客户端请求一个 dataset 时,使用 `GetFlightInfo`会返回 endpoints 的列表,每个都包含了:
1. server 的位置
2. 一个 ticket ,用于发送后续的 `DoGet`请求获取整个数据集中的部分数据。
- 提供了应用程序定义的元数据,可用于序列化排序信息(多个 Flight streams 之间的)。
- Multiple-endpoint 模式的好处:
- client 可以并行读取多个 endpoints
- 处理 GetFlighFlightInfo planning 请求的 service,可以将数据传输工作委派给其他 services,来获取更好的 data locality 或者负载均衡。
- 分布式集群中的节点可以扮演不同的角色(planning 或者 发送数据流)
- 
-------
# Actions: Extending Flight with application business logic
- 虽然 `GetFlightInfo` 请求 dataset 时,支持发送不透明的序列化后命令。
- Client 可能需要请求 server 来执行某种操作,例如将某个 dataset pin 到内存中。
- 一个 FlightService 可选地可以定义 actions,通过 `DoAction` RPC 调用。
----
# Encryption and Authentication
- 支持 gRPC 内置的 TLS/OpenSSL 能力。
- 认证方面,支持可扩展的身份认证机制。
- 内置了 BasicAuth(用户名+密码)。
------
# Middleware and Tracing
- gRPC interceptors,如 OpenTracing。
----
# gRPC, but not only gRPC
- `GoGet` 请求使用了 RFC 3986 兼容的 URLs。
- TLS指定格式:`grpc+tls://$HOST:$PORT`
- TCP以外如 RDMA。