#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 双向流的特性,允许客户端和服务端在请求被处理时同时发送数据和元数据给对方。 - 一个简单的流程示例: - ![](https://arrow.apache.org/img/20191014_flight_simple.png) ----- # 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 或者 发送数据流) - ![](https://arrow.apache.org/img/20191014_flight_complex.png) ------- # 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。