基于 Arrow Flight SQL 的高速数据传输链路

数据仓库 PALO

  • 功能发布记录
  • 操作手册1
    • LDAP认证
    • 时区
    • 使用S3-SDK访问对象存储
    • 权限管理
    • 物化视图
    • 变量
    • 资源管理
    • 数据更新与删除
      • 标记删除
      • Sequence-Column
      • 数据更新
      • 数据删除
    • 备份与恢复
      • 备份与恢复
    • 数据导出1
      • SELECT INTO OUTFILE
      • MySQL Dump
      • 数据导出概述
      • Export
    • 数据导出
      • 全量数据导出
      • 导出查询结果集
      • 导出总览
      • 导出数据到外部表
    • 查询加速1
      • 查询缓存
      • 物化视图
        • 同步物化视图
        • 物化视图概览
        • 异步物化视图
          • 异步物化视图常见问题
          • 最佳实践
          • 异步物化视图概述
          • 创建、查询与维护异步物化视图
    • 数据导入
      • JSON格式数据导入说明
      • 导入本地数据
      • 导入BOS中的数据
      • 导入事务和原子性
      • 通过外部表同步数据
      • 使用JDBC同步数据
      • 列的映射、转换与过滤
      • 订阅Kafka日志
      • 严格模式
      • 导入总览
    • 数据更新与删除1
      • 事务
      • 数据更新
        • 主键模型的导入更新
        • 主键模型的 Update 更新
        • 数据更新概述
        • 主键模型的更新并发控制
        • 聚合模型的导入更新
      • 数据删除
        • 删除操作概述
        • Truncate 操作
        • 表原子替换
        • Delete 操作
        • 基于导入的批量删除
        • 临时分区
    • 数据导入1
      • 高并发导入优化(Group Commit)
      • 导入概览
      • 异常数据处理
      • 导入高可用性
      • 导入时实现数据转换
      • 数据源
        • Kafka
        • S3 兼容存储
        • 从其他 TP 系统迁移数据
        • HDFS
        • 从其他 AP 系统迁移数据
        • Flink
        • 本地文件
      • 导入方式
        • Broker Load
        • MySQL Load
        • Insert Into Values
        • Stream Load
        • Insert Into Select
        • Routine Load
      • 文件格式
        • CSV
        • JSON
        • Parquet
        • ORC
      • 复杂数据类型
        • MAP
        • Variant
        • JSON
        • STRUCT
        • Bitmap
        • HLL
        • ARRAY
  • 开发指南
    • 迁移ClickHouse数据
    • Doris集群间数据迁移
    • 数据更新与删除
      • 事务
      • 数据更新
        • 主键模型的导入更新
        • 主键模型的 Update 更新
        • 数据更新概述
        • 主键模型的更新并发控制
        • 聚合模型的导入更新
      • 数据删除
        • 删除操作概述
        • Truncate 操作
        • 表原子替换
        • Delete 操作
        • 基于导入的批量删除
        • 临时分区
    • 查询加速
      • 查询缓存
      • Colocation Join
      • 高并发点查
      • Hint
        • Hint 概述
        • Leading Hint
        • Distribute Hint
      • 物化视图
        • 同步物化视图
        • 物化视图概览
        • 异步物化视图
          • 异步物化视图常见问题
          • 最佳实践
          • 异步物化视图概述
          • 创建、查询与维护异步物化视图
      • 高效去重
        • BITMAP 精准去重
        • HLL 近似去重
      • 优化技术原理
        • TOPN 查询优化
        • 统计信息
        • Pipeline 执行引擎
        • 查询优化器介绍
        • Runtime Filter
      • 查询调优概述
        • 调优概述
        • 诊断工具
        • 分析工具
        • 调优流程
      • 查询优化实践
        • 常见调优参数
        • 计划调优
          • 使用 Hint 控制代价改写
          • 使用异步物化视图透明改写
          • 使用 Leading Hint 控制 Join 顺序
          • 优化表 Schema 设计
          • 使用分区裁剪优化扫表
          • 优化索引设计和使用
          • 使用 Hint 调整 Join Shuffle 方式
          • DML 计划调优
          • 使用 Colocate Group 优化 Join
          • 使用同步物化视图透明改写
          • 使用 SQL Cache 加速查询
        • 执行调优
          • 数据倾斜处理
          • RuntimeFilter 的等待时间调整
          • 并行度调优
    • 数据查询
      • 连接(JOIN)
      • 子查询
      • 复杂类型查询
      • 列转行 (Lateral View)
      • MySQL 兼容性
      • 聚合多维分析
      • 分析函数(窗口函数)
      • 公用表表达式(CTE)
      • 自定义函数
        • 别名函数
        • Java UDF, UDAF, UDTF
    • 数据导出
      • SELECT INTO OUTFILE
      • MySQL Dump
      • 最佳实践
      • 数据导出概述
      • Export
    • 数据导入
      • 高并发导入优化(Group Commit)
      • 异常数据处理
      • 导入高可用性
      • 导入时实现数据转换
      • 导入最佳实践
      • 数据源
        • Kafka
        • Snowflake
        • S3 兼容存储
        • Google Cloud Storage
        • 从其他 TP 系统迁移数据
        • Azure Storage
        • 腾讯云 COS
        • MinIO
        • HDFS
        • 阿里云 OSS
        • 华为云 OBS
        • 从其他 AP 系统迁移数据
        • Flink
        • Redshift
        • Amazon S3
        • 本地文件
        • BigQuery
      • 导入方式
        • Broker Load
        • MySQL Load
        • Insert Into Values
        • Stream Load
        • Insert Into Select
        • Routine Load
      • 文件格式
        • CSV
        • JSON
        • Parquet
        • ORC
      • 复杂数据类型
        • MAP
        • Variant
        • JSON
        • STRUCT
        • Bitmap
        • HLL
        • ARRAY
    • BI工具接入
      • Sugar
      • Navicat
      • Tableau
      • DBeaver
      • 永洪BI
      • FineBI(帆软)
    • 数据库连接
      • 通过 MySQL 协议连接
      • 基于 Arrow Flight SQL 的高速数据传输链路
    • 湖仓一体
      • 分析 S3或HDFS 上的文件
      • 湖仓一体概述
      • SQL 方言兼容
      • 弹性计算节点
      • 云服务认证接入
      • 元数据缓存
      • 外表统计信息
      • 数据缓存
      • 数据库分析
        • MySQL
        • JDBC Catalog
        • Oracle
        • OceanBase
        • SAP HANA
        • 阿里云 MaxCompute
        • ClickHouse
        • PostgreSQL
        • IBM Db2
        • SQL Server
        • Elasticsearch
      • 湖仓一体最佳实践
        • 使用 PALO 和 Paimon
        • 使用 PALO 和 Iceberg
        • 使用 PALO 和 Hudi
        • 使用 PALO 和 LakeSoul
      • 数据湖构建
        • Iceberg
        • Hive
      • 数据湖分析
        • Hudi Catalog
        • 阿里云 DLF
        • Iceberg Catalog
        • Paimon Catalog
        • Hive Catalog
    • 数据表设计
      • 行业混存
      • 数据压缩
      • Schema 变更
      • 数据类型
      • 自增列
      • 概览
      • 数据库建表最佳实践
      • 冷热数据分层
        • SSD 和 HDD 层级存储
        • 远程存储
        • 冷热数据分层概述
      • 表索引
        • 倒排索引
        • 前缀索引与排序键
        • N-Gram 索引
        • BloomFilter 索引
        • 索引概述
      • 数据划分
        • 数据分桶
        • 数据分布概念
        • 动态分区
        • 自动分区
        • 手动分区
        • 常见文档
      • 数据模型
        • 使用注意
        • 模型概述
        • 主键模型
        • 明细模型
        • 聚合模型
  • 版本发布历史
    • 百度数据仓库 Palo 2.0 版本全新发布
  • SQL手册
    • 字面常量
    • 别名
    • SQL-手册
    • 数据类型
    • SQL语句
    • 注释
    • 内置函数
    • 白名单管理
    • SQL操作符
    • 内置函数
      • 聚合函数
      • 位操作函数
      • 字符串函数
      • 条件函数
      • 数学函数
      • JSON解析函数
      • 类型转换函数
      • 格式转换函数
      • 通用函数
      • 时间和日期函数
      • BITMAP函数
      • 窗口函数
      • 哈希函数
      • HLL函数
    • 语法帮助
      • DML
        • INSERT
        • ROUTINE-LOAD
        • RESTORE
        • SELECT-INTO-OUTFILE
        • ALTER-ROUTINE-LOAD
        • BROKER-LOAD
        • BACKUP
        • EXPORT
        • STREAM-LOAD
      • DDL
        • CREATE-FILE
        • DROP-RESOURCE
        • CREATE-RESOURCE
        • CREATE-MATERIALIZED-VIEW
        • DROP-RESROUCE
        • CREATE-TABLE
        • DROP-REPOSITORY
        • CREATE-REPOSITORY
        • CREATE-ODBC-TABLE
      • 信息查看语句
        • SHOW-BACKUP
        • SHOW-ALTER-TABLE-MATERIALIZED-VIEW
        • SHOW-SNAPSHOT
        • SHOW-ROUTINE-LOAD
        • SHOW-CREATE-ROUTINE-LOAD
        • SHOW-ROLES
        • SHOW-GRANTS
        • SHOW-EXPORT
        • SHOW-ROUTINE-LOAD-TASK
        • SHOW-REPOSITORIES
        • SHOW-LOAD
        • SHOW-RESOURCES
        • SHOW-RESTORE
        • SHOW-PROPERTY
        • SHOW-FILE
      • 辅助命令
        • PAUSE-ROUTINE-LOAD
        • STOP-ROUTINE-LOAD
        • ALTER-ROUTINE-LOAD
        • CANCEL-LOAD
        • RESUME-ROUTINE-LOAD
      • 账户管理
        • SET-PROPERTY
        • REVOKE
        • GRANT
        • CREATE-ROLE
        • DROP-ROLE
        • CREATE-USER
        • DROP-USER
        • SET-PASSWORD
  • 快速入门
    • 快速上手
    • 存算分离
    • 存算一体
  • 典型实践
    • 如何开启Debug日志
    • 导入分析
    • 查询分析
  • 操作手册
    • 权限和子用户
    • 存算一体
      • 连接集群
      • 查询分析
      • 监控告警
        • 监控指标
        • 告警配置
      • 备份恢复
        • 通过管理页面备份与恢复
        • 备份与恢复
      • 权限管理
        • 集群权限
        • 控制台权限
      • 集群管理
        • 集群创建
        • 停止与删除
        • 重置管理员密码
        • 集群扩缩容
        • 集群详情
    • 存算分离
      • 连接集群
      • 计算组管理
        • 重启计算组
        • 创建计算组
      • 监控告警
        • 监控指标
        • 告警配置
      • 权限管理
        • 集群权限
        • 控制台权限
      • 集群管理
        • 停止与删除
        • 创建集群
        • 重置管理员密码
        • 集群详情
  • 服务等级协议SLA
    • 服务等级协议(SLA)v1.0
  • 产品概述
    • 系统架构
    • 产品特点
    • 产品介绍
  • 视频专区
    • 操作指南
    • 产品简介
  • 产品定价
    • 预付费
    • 计费说明
    • 后付费
所有文档
menu
没有找到结果,请重新输入

数据仓库 PALO

  • 功能发布记录
  • 操作手册1
    • LDAP认证
    • 时区
    • 使用S3-SDK访问对象存储
    • 权限管理
    • 物化视图
    • 变量
    • 资源管理
    • 数据更新与删除
      • 标记删除
      • Sequence-Column
      • 数据更新
      • 数据删除
    • 备份与恢复
      • 备份与恢复
    • 数据导出1
      • SELECT INTO OUTFILE
      • MySQL Dump
      • 数据导出概述
      • Export
    • 数据导出
      • 全量数据导出
      • 导出查询结果集
      • 导出总览
      • 导出数据到外部表
    • 查询加速1
      • 查询缓存
      • 物化视图
        • 同步物化视图
        • 物化视图概览
        • 异步物化视图
          • 异步物化视图常见问题
          • 最佳实践
          • 异步物化视图概述
          • 创建、查询与维护异步物化视图
    • 数据导入
      • JSON格式数据导入说明
      • 导入本地数据
      • 导入BOS中的数据
      • 导入事务和原子性
      • 通过外部表同步数据
      • 使用JDBC同步数据
      • 列的映射、转换与过滤
      • 订阅Kafka日志
      • 严格模式
      • 导入总览
    • 数据更新与删除1
      • 事务
      • 数据更新
        • 主键模型的导入更新
        • 主键模型的 Update 更新
        • 数据更新概述
        • 主键模型的更新并发控制
        • 聚合模型的导入更新
      • 数据删除
        • 删除操作概述
        • Truncate 操作
        • 表原子替换
        • Delete 操作
        • 基于导入的批量删除
        • 临时分区
    • 数据导入1
      • 高并发导入优化(Group Commit)
      • 导入概览
      • 异常数据处理
      • 导入高可用性
      • 导入时实现数据转换
      • 数据源
        • Kafka
        • S3 兼容存储
        • 从其他 TP 系统迁移数据
        • HDFS
        • 从其他 AP 系统迁移数据
        • Flink
        • 本地文件
      • 导入方式
        • Broker Load
        • MySQL Load
        • Insert Into Values
        • Stream Load
        • Insert Into Select
        • Routine Load
      • 文件格式
        • CSV
        • JSON
        • Parquet
        • ORC
      • 复杂数据类型
        • MAP
        • Variant
        • JSON
        • STRUCT
        • Bitmap
        • HLL
        • ARRAY
  • 开发指南
    • 迁移ClickHouse数据
    • Doris集群间数据迁移
    • 数据更新与删除
      • 事务
      • 数据更新
        • 主键模型的导入更新
        • 主键模型的 Update 更新
        • 数据更新概述
        • 主键模型的更新并发控制
        • 聚合模型的导入更新
      • 数据删除
        • 删除操作概述
        • Truncate 操作
        • 表原子替换
        • Delete 操作
        • 基于导入的批量删除
        • 临时分区
    • 查询加速
      • 查询缓存
      • Colocation Join
      • 高并发点查
      • Hint
        • Hint 概述
        • Leading Hint
        • Distribute Hint
      • 物化视图
        • 同步物化视图
        • 物化视图概览
        • 异步物化视图
          • 异步物化视图常见问题
          • 最佳实践
          • 异步物化视图概述
          • 创建、查询与维护异步物化视图
      • 高效去重
        • BITMAP 精准去重
        • HLL 近似去重
      • 优化技术原理
        • TOPN 查询优化
        • 统计信息
        • Pipeline 执行引擎
        • 查询优化器介绍
        • Runtime Filter
      • 查询调优概述
        • 调优概述
        • 诊断工具
        • 分析工具
        • 调优流程
      • 查询优化实践
        • 常见调优参数
        • 计划调优
          • 使用 Hint 控制代价改写
          • 使用异步物化视图透明改写
          • 使用 Leading Hint 控制 Join 顺序
          • 优化表 Schema 设计
          • 使用分区裁剪优化扫表
          • 优化索引设计和使用
          • 使用 Hint 调整 Join Shuffle 方式
          • DML 计划调优
          • 使用 Colocate Group 优化 Join
          • 使用同步物化视图透明改写
          • 使用 SQL Cache 加速查询
        • 执行调优
          • 数据倾斜处理
          • RuntimeFilter 的等待时间调整
          • 并行度调优
    • 数据查询
      • 连接(JOIN)
      • 子查询
      • 复杂类型查询
      • 列转行 (Lateral View)
      • MySQL 兼容性
      • 聚合多维分析
      • 分析函数(窗口函数)
      • 公用表表达式(CTE)
      • 自定义函数
        • 别名函数
        • Java UDF, UDAF, UDTF
    • 数据导出
      • SELECT INTO OUTFILE
      • MySQL Dump
      • 最佳实践
      • 数据导出概述
      • Export
    • 数据导入
      • 高并发导入优化(Group Commit)
      • 异常数据处理
      • 导入高可用性
      • 导入时实现数据转换
      • 导入最佳实践
      • 数据源
        • Kafka
        • Snowflake
        • S3 兼容存储
        • Google Cloud Storage
        • 从其他 TP 系统迁移数据
        • Azure Storage
        • 腾讯云 COS
        • MinIO
        • HDFS
        • 阿里云 OSS
        • 华为云 OBS
        • 从其他 AP 系统迁移数据
        • Flink
        • Redshift
        • Amazon S3
        • 本地文件
        • BigQuery
      • 导入方式
        • Broker Load
        • MySQL Load
        • Insert Into Values
        • Stream Load
        • Insert Into Select
        • Routine Load
      • 文件格式
        • CSV
        • JSON
        • Parquet
        • ORC
      • 复杂数据类型
        • MAP
        • Variant
        • JSON
        • STRUCT
        • Bitmap
        • HLL
        • ARRAY
    • BI工具接入
      • Sugar
      • Navicat
      • Tableau
      • DBeaver
      • 永洪BI
      • FineBI(帆软)
    • 数据库连接
      • 通过 MySQL 协议连接
      • 基于 Arrow Flight SQL 的高速数据传输链路
    • 湖仓一体
      • 分析 S3或HDFS 上的文件
      • 湖仓一体概述
      • SQL 方言兼容
      • 弹性计算节点
      • 云服务认证接入
      • 元数据缓存
      • 外表统计信息
      • 数据缓存
      • 数据库分析
        • MySQL
        • JDBC Catalog
        • Oracle
        • OceanBase
        • SAP HANA
        • 阿里云 MaxCompute
        • ClickHouse
        • PostgreSQL
        • IBM Db2
        • SQL Server
        • Elasticsearch
      • 湖仓一体最佳实践
        • 使用 PALO 和 Paimon
        • 使用 PALO 和 Iceberg
        • 使用 PALO 和 Hudi
        • 使用 PALO 和 LakeSoul
      • 数据湖构建
        • Iceberg
        • Hive
      • 数据湖分析
        • Hudi Catalog
        • 阿里云 DLF
        • Iceberg Catalog
        • Paimon Catalog
        • Hive Catalog
    • 数据表设计
      • 行业混存
      • 数据压缩
      • Schema 变更
      • 数据类型
      • 自增列
      • 概览
      • 数据库建表最佳实践
      • 冷热数据分层
        • SSD 和 HDD 层级存储
        • 远程存储
        • 冷热数据分层概述
      • 表索引
        • 倒排索引
        • 前缀索引与排序键
        • N-Gram 索引
        • BloomFilter 索引
        • 索引概述
      • 数据划分
        • 数据分桶
        • 数据分布概念
        • 动态分区
        • 自动分区
        • 手动分区
        • 常见文档
      • 数据模型
        • 使用注意
        • 模型概述
        • 主键模型
        • 明细模型
        • 聚合模型
  • 版本发布历史
    • 百度数据仓库 Palo 2.0 版本全新发布
  • SQL手册
    • 字面常量
    • 别名
    • SQL-手册
    • 数据类型
    • SQL语句
    • 注释
    • 内置函数
    • 白名单管理
    • SQL操作符
    • 内置函数
      • 聚合函数
      • 位操作函数
      • 字符串函数
      • 条件函数
      • 数学函数
      • JSON解析函数
      • 类型转换函数
      • 格式转换函数
      • 通用函数
      • 时间和日期函数
      • BITMAP函数
      • 窗口函数
      • 哈希函数
      • HLL函数
    • 语法帮助
      • DML
        • INSERT
        • ROUTINE-LOAD
        • RESTORE
        • SELECT-INTO-OUTFILE
        • ALTER-ROUTINE-LOAD
        • BROKER-LOAD
        • BACKUP
        • EXPORT
        • STREAM-LOAD
      • DDL
        • CREATE-FILE
        • DROP-RESOURCE
        • CREATE-RESOURCE
        • CREATE-MATERIALIZED-VIEW
        • DROP-RESROUCE
        • CREATE-TABLE
        • DROP-REPOSITORY
        • CREATE-REPOSITORY
        • CREATE-ODBC-TABLE
      • 信息查看语句
        • SHOW-BACKUP
        • SHOW-ALTER-TABLE-MATERIALIZED-VIEW
        • SHOW-SNAPSHOT
        • SHOW-ROUTINE-LOAD
        • SHOW-CREATE-ROUTINE-LOAD
        • SHOW-ROLES
        • SHOW-GRANTS
        • SHOW-EXPORT
        • SHOW-ROUTINE-LOAD-TASK
        • SHOW-REPOSITORIES
        • SHOW-LOAD
        • SHOW-RESOURCES
        • SHOW-RESTORE
        • SHOW-PROPERTY
        • SHOW-FILE
      • 辅助命令
        • PAUSE-ROUTINE-LOAD
        • STOP-ROUTINE-LOAD
        • ALTER-ROUTINE-LOAD
        • CANCEL-LOAD
        • RESUME-ROUTINE-LOAD
      • 账户管理
        • SET-PROPERTY
        • REVOKE
        • GRANT
        • CREATE-ROLE
        • DROP-ROLE
        • CREATE-USER
        • DROP-USER
        • SET-PASSWORD
  • 快速入门
    • 快速上手
    • 存算分离
    • 存算一体
  • 典型实践
    • 如何开启Debug日志
    • 导入分析
    • 查询分析
  • 操作手册
    • 权限和子用户
    • 存算一体
      • 连接集群
      • 查询分析
      • 监控告警
        • 监控指标
        • 告警配置
      • 备份恢复
        • 通过管理页面备份与恢复
        • 备份与恢复
      • 权限管理
        • 集群权限
        • 控制台权限
      • 集群管理
        • 集群创建
        • 停止与删除
        • 重置管理员密码
        • 集群扩缩容
        • 集群详情
    • 存算分离
      • 连接集群
      • 计算组管理
        • 重启计算组
        • 创建计算组
      • 监控告警
        • 监控指标
        • 告警配置
      • 权限管理
        • 集群权限
        • 控制台权限
      • 集群管理
        • 停止与删除
        • 创建集群
        • 重置管理员密码
        • 集群详情
  • 服务等级协议SLA
    • 服务等级协议(SLA)v1.0
  • 产品概述
    • 系统架构
    • 产品特点
    • 产品介绍
  • 视频专区
    • 操作指南
    • 产品简介
  • 产品定价
    • 预付费
    • 计费说明
    • 后付费
  • 文档中心
  • arrow
  • 数据仓库PALO
  • arrow
  • 开发指南
  • arrow
  • 数据库连接
  • arrow
  • 基于 Arrow Flight SQL 的高速数据传输链路
本页目录
  • 实现原理
  • Python 使用方法
  • 安装 Library
  • 连接 PALO
  • 建表与获取元数据
  • 导入数据
  • 执行查询
  • 完整代码
  • JDBC Connector with Arrow Flight SQL
  • Java 使用方法
  • ADBC Driver
  • JDBC Driver
  • JDBC 和 Java 连接方式的选择
  • 与其他大数据组件交互
  • Spark & Flink
  • 支持 BI 工具
  • 扩展应用
  • 多 BE 并行返回结果
  • 多 BE 共享同一个可供集群外部访问的 IP
  • FAQ
  • 2.1 Release Note
  • v2.1.9
  • v2.1.8
  • v2.1.7
  • v2.1.6
  • v2.1.5
  • 3.0 Release Note
  • v3.0.5
  • v3.0.4
  • v3.0.3
  • v3.0.2
  • v3.0.1

基于 Arrow Flight SQL 的高速数据传输链路

更新时间:2025-08-21

实现原理

在 PALO 中查询结果以列存格式的 Block 组织。在 2.1 以前版本,可以通过 MySQL Client 或 JDBC/ODBC 驱动传输至目标客户端,需要将行存格式的 Bytes 再反序列化为列存格式。基于 Arrow Flight SQL 构建高速数据传输链路,若目标客户端同样支持 Arrow 列存格式,整体传输过程将完全避免序列化/反序列化操作,彻底消除因此带来时间及性能损耗。

安装 Apache Arrow 你可以去官方文档找到详细的安装教程。

Python 使用方法

使用 Python 的 ADBC Driver 连接 PALO 实现数据的极速读取,下面的步骤使用 Python(版本 >= 3.9)的 ADBC Driver 执行一系列常见的数据库语法操作,包括 DDL、DML、设置 Session 变量以及 Show 语句等。

安装 Library

Library 被发布在 PyPI,可通过以下方式简单安装:

Plain Text
1pip install adbc_driver_manager
2pip install adbc_driver_flightsql

在代码中 import 以下模块/库来使用已安装的 Library:

Python
1import adbc_driver_manager
2import adbc_driver_flightsql.dbapi as flight_sql
3
4>>> print(adbc_driver_manager.__version__)
51.1.0
6>>> print(adbc_driver_flightsql.__version__)
71.1.0

连接 PALO

创建与 PALO Arrow Flight SQL 服务交互的客户端。需提供 PALO FE 的 Host、Arrow Flight Port、登陆用户名以及密码,并进行以下配置。 修改 PALO FE 和 BE 的配置参数:

  • 修改 fe/conf/fe.conf 中 arrow_flight_sql_port 为一个可用端口,如 8070。
  • 修改 be/conf/be.conf中 arrow_flight_sql_port 为一个可用端口,如 8050。

注: fe.conf 与 be.conf 中配置的 arrow_flight_sql_port 端口号不相同

修改配置并重启集群后,在 fe/log/fe.log 文件中搜索到 Arrow Flight SQL service is started 表明 FE 的 Arrow Flight Server 启动成功;在 be/log/be.INFO 文件中搜索到 Arrow Flight Service bind to host 表明 BE 的 Arrow Flight Server 启动成功。

假设 PALO 实例中 FE 和 BE 的 Arrow Flight SQL 服务将分别在端口 8070 和 8050 上运行,且 PALO 用户名/密码为“user”/“pass”,那么连接过程如下所示:

Python
1conn = flight_sql.connect(uri="grpc://{FE_HOST}:{fe.conf:arrow_flight_sql_port}", db_kwargs={
2            adbc_driver_manager.DatabaseOptions.USERNAME.value: "user",
3            adbc_driver_manager.DatabaseOptions.PASSWORD.value: "pass",
4        })
5cursor = conn.cursor()

连接完成后,可以通过 SQL 使返回的 Cursor 与 PALO 交互,执行例如建表、获取元数据、导入数据、查询等操作。

建表与获取元数据

将 Query 传递给 cursor.execute()函数,执行建表与获取元数据操作:

Python
1cursor.execute("DROP DATABASE IF EXISTS arrow_flight_sql FORCE;")
2print(cursor.fetchallarrow().to_pandas())
3
4cursor.execute("create database arrow_flight_sql;")
5print(cursor.fetchallarrow().to_pandas())
6
7cursor.execute("show databases;")
8print(cursor.fetchallarrow().to_pandas())
9
10cursor.execute("use arrow_flight_sql;")
11print(cursor.fetchallarrow().to_pandas())
12
13cursor.execute("""CREATE TABLE arrow_flight_sql_test
14    (
15         k0 INT,
16         k1 DOUBLE,
17         K2 varchar(32) NULL DEFAULT "" COMMENT "",
18         k3 DECIMAL(27,9) DEFAULT "0",
19         k4 BIGINT NULL DEFAULT '10',
20         k5 DATE,
21    )
22    DISTRIBUTED BY HASH(k5) BUCKETS 5
23    PROPERTIES("replication_num" = "1");""")
24print(cursor.fetchallarrow().to_pandas())
25
26cursor.execute("show create table arrow_flight_sql_test;")
27print(cursor.fetchallarrow().to_pandas())

如果 StatusResult 返回 0,则说明 Query 执行成功(这样设计的原因是为了兼容 JDBC)。

Plain Text
1  StatusResult
20            0
3
4  StatusResult
50            0
6
7                   Database
80         __internal_schema
91          arrow_flight_sql
10..                      ...
11507             udf_auth_db
12
13[508 rows x 1 columns]
14
15  StatusResult
160            0
17
18  StatusResult
190            0
20                   Table                                       Create Table
210  arrow_flight_sql_test  CREATE TABLE `arrow_flight_sql_test` (\n  `k0`...

导入数据

执行 INSERT INTO,向所创建表中导入少量测试数据:

Python
1cursor.execute("""INSERT INTO arrow_flight_sql_test VALUES
2        ('0', 0.1, "ID", 0.0001, 9999999999, '2023-10-21'),
3        ('1', 0.20, "ID_1", 1.00000001, 0, '2023-10-21'),
4        ('2', 3.4, "ID_1", 3.1, 123456, '2023-10-22'),
5        ('3', 4, "ID", 4, 4, '2023-10-22'),
6        ('4', 122345.54321, "ID", 122345.54321, 5, '2023-10-22');""")
7print(cursor.fetchallarrow().to_pandas())

如下所示则证明导入成功:

Plain Text
1  StatusResult
20            0

如果需要导入大批量数据到 PALO,可以使用 pyPALO 执行 Stream Load 来实现。

执行查询

接着对上面导入的表进行查询查询,包括聚合、排序、Set Session Variable 等操作。

Python
1cursor.execute("select * from arrow_flight_sql_test order by k0;")
2print(cursor.fetchallarrow().to_pandas())
3
4cursor.execute("set exec_mem_limit=2000;")
5print(cursor.fetchallarrow().to_pandas())
6
7cursor.execute("show variables like \"%exec_mem_limit%\";")
8print(cursor.fetchallarrow().to_pandas())
9
10cursor.execute("select k5, sum(k1), count(1), avg(k3) from arrow_flight_sql_test group by k5;")
11print(cursor.fetch_df())

结果如下所示:

Plain Text
1   k0            k1    K2                k3          k4          k5
20   0       0.10000    ID       0.000100000  9999999999  2023-10-21
31   1       0.20000  ID_1       1.000000010           0  2023-10-21
42   2       3.40000  ID_1       3.100000000      123456  2023-10-22
53   3       4.00000    ID       4.000000000           4  2023-10-22
64   4  122345.54321    ID  122345.543210000           5  2023-10-22
7
8[5 rows x 6 columns]
9
10  StatusResult
110            0
12
13    Variable_name Value Default_Value Changed
140  exec_mem_limit  2000    2147483648       1
15
16           k5  Nullable(Float64)_1  Int64_2 Nullable(Decimal(38, 9))_3
170  2023-10-22         122352.94321        3            40784.214403333
181  2023-10-21              0.30000        2                0.500050005
19
20[2 rows x 5 columns]

注意: fetch 查询结果需要使用 cursor.fetchallarrow() 返回 arrow 格式,或使用 cursor.fetch_df() 直接返回 pandas dataframe,这将保持数据的列存格式。不能使用 cursor.fetchall(),否则会将列存格式的数据转回行存,这和使用 mysql-client 没有本质区别,甚至由于在 client 侧多了一次列转行的操作,可能比 mysql-client 还慢。

完整代码

Python
1# PALO Arrow Flight SQL Test
2
3# step 1, library is released on PyPI and can be easily installed.
4# pip install adbc_driver_manager
5# pip install adbc_driver_flightsql
6import adbc_driver_manager
7import adbc_driver_flightsql.dbapi as flight_sql
8
9# step 2, create a client that interacts with the PALO Arrow Flight SQL service.
10# Modify arrow_flight_sql_port in fe/conf/fe.conf to an available port, such as 8070.
11# Modify arrow_flight_sql_port in be/conf/be.conf to an available port, such as 8050.
12conn = flight_sql.connect(uri="grpc://{FE_HOST}:{fe.conf:arrow_flight_sql_port}", db_kwargs={
13            adbc_driver_manager.DatabaseOptions.USERNAME.value: "root",
14            adbc_driver_manager.DatabaseOptions.PASSWORD.value: "",
15        })
16cursor = conn.cursor()
17
18# interacting with PALO via SQL using Cursor
19def execute(sql):
20    print("\n### execute query: ###\n " + sql)
21    cursor.execute(sql)
22    print("### result: ###")
23    print(cursor.fetchallarrow().to_pandas())
24
25# step3, execute DDL statements, create database/table, show stmt.
26execute("DROP DATABASE IF EXISTS arrow_flight_sql FORCE;")
27execute("show databases;")
28execute("create database arrow_flight_sql;")
29execute("show databases;")
30execute("use arrow_flight_sql;")
31execute("""CREATE TABLE arrow_flight_sql_test
32    (
33         k0 INT,
34         k1 DOUBLE,
35         K2 varchar(32) NULL DEFAULT "" COMMENT "",
36         k3 DECIMAL(27,9) DEFAULT "0",
37         k4 BIGINT NULL DEFAULT '10',
38         k5 DATE,
39    )
40    DISTRIBUTED BY HASH(k5) BUCKETS 5
41    PROPERTIES("replication_num" = "1");""")
42execute("show create table arrow_flight_sql_test;")
43
44
45# step4, insert into
46execute("""INSERT INTO arrow_flight_sql_test VALUES
47        ('0', 0.1, "ID", 0.0001, 9999999999, '2023-10-21'),
48        ('1', 0.20, "ID_1", 1.00000001, 0, '2023-10-21'),
49        ('2', 3.4, "ID_1", 3.1, 123456, '2023-10-22'),
50        ('3', 4, "ID", 4, 4, '2023-10-22'),
51        ('4', 122345.54321, "ID", 122345.54321, 5, '2023-10-22');""")
52
53
54# step5, execute queries, aggregation, sort, set session variable
55execute("select * from arrow_flight_sql_test order by k0;")
56execute("set exec_mem_limit=2000;")
57execute("show variables like \"%exec_mem_limit%\";")
58execute("select k5, sum(k1), count(1), avg(k3) from arrow_flight_sql_test group by k5;")
59
60# step6, close cursor 
61cursor.close()

JDBC Connector with Arrow Flight SQL

Arrow Flight SQL 协议的开源 JDBC 驱动兼容标准的 JDBC API,可用于大多数 BI 工具通过 JDBC 访问 PALO,并支持高速传输 Apache Arrow 数据。使用方法与通过 MySQL 协议的 JDBC 驱动连接 PALO 类似,只需将链接 URL 中的 jdbc:mysql 协议换成 jdbc:arrow-flight-sql 协议,查询返回的结果依然是 JDBC 的 ResultSet 数据结构。

POM dependency:

Java
1<properties>
2    <arrow.version>17.0.0</arrow.version>
3</properties>
4<dependencies>
5    <dependency>
6        <groupId>org.apache.arrow</groupId>
7        <artifactId>flight-sql-jdbc-core</artifactId>
8        <version>${arrow.version}</version>
9    </dependency>
10</dependencies>

注意: 使用 Java 9 或更高版本时,必须通过在 Java 命令中添加 --add-opens=java.base/java.nio=ALL-UNNAMED 来暴露一些 JDK 内部结构,否则,您可能会看到一些错误,如 module java.base does not "opens java.nio" to unnamed module 或者 module java.base does not "opens java.nio" to org.apache.arrow.memory.core 或者 java.lang.NoClassDefFoundError: Could not initialize class org.apache.arrow.memory.util.MemoryUtil (Internal; Prepare)

Shell
1# Directly on the command line
2$ java --add-opens=java.base/java.nio=ALL-UNNAMED -jar ...
3# Indirectly via environment variables
4$ env _JAVA_OPTIONS="--add-opens=java.base/java.nio=ALL-UNNAMED" java -jar ...

如果在 IntelliJ IDEA 中调试,需要在 Run/Debug Configurations 的 Build and run 中增加 --add-opens=java.base/java.nio=ALL-UNNAMED,参照下面的图片:

连接代码示例如下:

Java
1import java.sql.Connection;
2import java.sql.DriverManager;
3import java.sql.ResultSet;
4import java.sql.Statement;
5
6Class.forName("org.apache.arrow.driver.jdbc.ArrowFlightJdbcDriver");
7String DB_URL = "jdbc:arrow-flight-sql://{FE_HOST}:{fe.conf:arrow_flight_sql_port}?useServerPrepStmts=false"
8        + "&cachePrepStmts=true&useSSL=false&useEncryption=false";
9String USER = "root";
10String PASS = "";
11
12Connection conn = DriverManager.getConnection(DB_URL, USER, PASS);
13Statement stmt = conn.createStatement();
14ResultSet resultSet = stmt.executeQuery("select * from information_schema.tables;");
15while (resultSet.next()) {
16    System.out.println(resultSet.toString());
17}
18
19resultSet.close();
20stmt.close();
21conn.close();

Java 使用方法

除了使用 JDBC,与 Python 类似,Java 也可以创建 Driver 读取 PALO 并返回 Arrow 格式的数据,下面分别是使用 AdbcDriver 和 JdbcDriver 连接 PALO Arrow Flight Server。

POM dependency:

Java
1<properties>
2    <adbc.version>0.15.0</adbc.version>
3</properties>
4
5<dependencies>
6    <dependency>
7        <groupId>org.apache.arrow.adbc</groupId>
8        <artifactId>adbc-driver-jdbc</artifactId>
9        <version>${adbc.version}</version>
10    </dependency>
11    <dependency>
12        <groupId>org.apache.arrow.adbc</groupId>
13        <artifactId>adbc-core</artifactId>
14        <version>${adbc.version}</version>
15    </dependency>
16    <dependency>
17        <groupId>org.apache.arrow.adbc</groupId>
18        <artifactId>adbc-driver-manager</artifactId>
19        <version>${adbc.version}</version>
20    </dependency>
21    <dependency>
22        <groupId>org.apache.arrow.adbc</groupId>
23        <artifactId>adbc-sql</artifactId>
24        <version>${adbc.version}</version>
25    </dependency>
26    <dependency>
27        <groupId>org.apache.arrow.adbc</groupId>
28        <artifactId>adbc-driver-flight-sql</artifactId>
29        <version>${adbc.version}</version>
30    </dependency>
31</dependencies>

ADBC Driver

连接代码示例如下:

Java
1// 1. new driver
2final BufferAllocator allocator = new RootAllocator();
3FlightSqlDriver driver = new FlightSqlDriver(allocator);
4Map<String, Object> parameters = new HashMap<>();
5AdbcDriver.PARAM_URI.set(parameters, Location.forGrpcInsecure("{FE_HOST}", {fe.conf:arrow_flight_sql_port}).getUri().toString());
6AdbcDriver.PARAM_USERNAME.set(parameters, "root");
7AdbcDriver.PARAM_PASSWORD.set(parameters, "");
8AdbcDatabase adbcDatabase = driver.open(parameters);
9
10// 2. new connection
11AdbcConnection connection = adbcDatabase.connect();
12AdbcStatement stmt = connection.createStatement();
13
14// 3. execute query
15stmt.setSqlQuery("select * from information_schema.tables;");
16QueryResult queryResult = stmt.executeQuery();
17ArrowReader reader = queryResult.getReader();
18
19// 4. load result
20List<String> result = new ArrayList<>();
21while (reader.loadNextBatch()) {
22    VectorSchemaRoot root = reader.getVectorSchemaRoot();
23    String tsvString = root.contentToTSVString();
24    result.add(tsvString);
25}
26System.out.printf("batchs %d\n", result.size());
27
28// 5. close
29reader.close();
30queryResult.close();
31stmt.close();
32connection.close();

JDBC Driver

连接代码示例如下:

Java
1final Map<String, Object> parameters = new HashMap<>();
2AdbcDriver.PARAM_URI.set(
3        parameters,"jdbc:arrow-flight-sql://{FE_HOST}:{fe.conf:arrow_flight_sql_port}?useServerPrepStmts=false&cachePrepStmts=true&useSSL=false&useEncryption=false");
4AdbcDriver.PARAM_USERNAME.set(parameters, "root");
5AdbcDriver.PARAM_PASSWORD.set(parameters, "");
6try (
7        BufferAllocator allocator = new RootAllocator();
8        AdbcDatabase db = new JdbcDriver(allocator).open(parameters);
9        AdbcConnection connection = db.connect();
10        AdbcStatement stmt = connection.createStatement()
11) {
12    stmt.setSqlQuery("select * from information_schema.tables;");
13    AdbcStatement.QueryResult queryResult = stmt.executeQuery();
14    ArrowReader reader = queryResult.getReader();
15    List<String> result = new ArrayList<>();
16    while (reader.loadNextBatch()) {
17        VectorSchemaRoot root = reader.getVectorSchemaRoot();
18        String tsvString = root.contentToTSVString();
19        result.add(tsvString);
20    }
21    long etime = System.currentTimeMillis();
22    System.out.printf("batchs %d\n", result.size());
23
24    reader.close();
25    queryResult.close();
26    stmt.close();
27}  catch (Exception e) {
28    e.printStackTrace();
29}

JDBC 和 Java 连接方式的选择

JDBC/Java Arrow Flight SQL Sample 是 JDBC/Java 使用 Arrow FLight SQL 的 demo,你可以使用它来测试向 Arrow Flight Server 发送查询的多种连接方法,帮助你了解如何使用 Arrow FLight SQL 并测试性能。

  1. 上述三种 Java Arrow Flight SQL 连接方式的选择上,如果后续的数据分析将基于行存的数据格式,那么使用 jdbc:arrow-flight-sql,这将返回 JDBC ResultSet 格式的数据;如果后续的数据分析可以基于 Arrow 格式或其他列存数据格式,那么使用 Flight AdbcDriver 或 Flight JdbcDriver 直接返回 Arrow 格式的数据,这将避免行列转换,并可利用 Arrow 的特性加速数据解析。
  2. 无论解析 JDBC ResultSet 还是 Arrow 格式的数据,所耗费的时间都大于读取数据的耗时,如果你那里使用 Arrow Flight SQL 的性能不符合预期,和 jdbc:mysql:// 相比提升有限,不妨分析下是否解析数据耗时太长。
  3. 对所有连接方式而言,JDK 17 都比 JDK 1.8 读取数据的速度更快。
  4. 当读取数据量非常大时,使用 Arrow Flight SQL 将比 jdbc:mysql:// 使用更少的内存,所以如果你受内存不足困扰,同样可以尝试下 Arrow Flight SQL。
  5. 除了上述三种连接方式,还可以使用原生的 FlightClient 连接 Arrow Flight Server,可以更加灵活的并行读取多个 Endpoints。Flight AdbcDriver 也是基于 FlightClient 创建的链接,相较于直接使用 FlightClient 更简单。

与其他大数据组件交互

Spark & Flink

Arrow Flight 官方目前没有支持 Spark 和 Flink 的计划。

社区之前参考开源的 Spark-Flight-Connector,在 Spark 中使用 FlightClient 连接 PALO 测试,发现 Arrow 与 PALO Block 之间数据格式转换的速度更快,是 CSV 格式与 PALO Block 之间转换速度的 10 倍,而且对 Map,Array 等复杂类型的支持更好,这是因为 Arrow 数据格式的压缩率高,传输时网络开销小。不过目前 PALO Arrow Flight 还没有实现多节点并行读取,仍是将查询结果汇总到一台 BE 节点后返回,对简单的批量导出数据而言,性能可能没有 PALO Spark Connector 快,后者支持 Tablet 级别的并行读取。如果你希望在 Spark 使用 Arrow Flight SQL 连接 PALO,可以参考开源的 Spark-Flight-Connector 和 Dremio-Flight-Connector 自行实现。

支持 BI 工具

自 PALO v2.1.8 开始,支持 DBeaver 等 BI 工具使用 arrow-flight-sql 协议连接 PALO。

扩展应用

多 BE 并行返回结果

PALO 默认会将一个查询在所有 BE 节点上的结果汇总聚合到一个 BE 节点上,在 Mysql/JDBC 查询中 FE 会向这个汇总数据的节点请求查询结果,在 Arrow Flight SQL 查询中 FE 会将这个节点的 IP/Port 包装在 Endpoint 中返回给 ADBC Client,ADBC Client 会请求这个 Endpoint 对应的 BE 节点拉取数据。

如果查询只是简单的 Select 从 PALO 拉取数据,没有 Join、Sort、窗口函数等有数据 Shuffle 行为的算子,可以将查询按照 Tablet 粒度拆分,现在 PALO Spark/Flink Connector 就是用的这个方法实现并行读取数据,分为两个步骤: 1. 执行 explain sql,FE 返回的查询计划中 ScanOperator 包含 Scan 的所有 Tablet ID List。 2. 依据上面的 Tablet ID List 将原始 SQL 拆分为多个 SQL,每个 SQL 只读取部分 Tablet,用法类似 SELECT * FROM t1 TABLET(10001,10002) limit 1000;,拆分后的多个 SQL 可以并行执行。参考 Support select table sample。

如果查询最外层是聚合,SQL 类似 select k1, sum(k2) from xxx group by k1,PALO v3.0.4 版本后,执行 set enable_parallel_result_sink=true; 后允许一个查询的每个 BE 节点独立返回查询结果,ADBC Client 收到 FE 返回的 Endpoint 列表后并行从多个 BE 节点拉取结果。不过注意当聚合结果很小时,多 BE 返回会增加 RPC 的压力。具体实现参考 support parallel result sink。理论上除了最外层是排序的查询,其他查询都可以支持每个 BE 节点并行返回结果,不过暂时没有这方便的需求,没有更进一步实现。

多 BE 共享同一个可供集群外部访问的 IP

如果存在一个 PALO 集群,它的 FE 节点可以被集群外部访问,它的所有 BE 节点只可以被集群内部访问。这在使用 Mysql Client 和 JDBC 连接 PALO 执行查询是没问题的,查询结果将由 PALO FE 节点返回。但使用 Arrow Flight SQL 连接 PALO 无法执行查询,因为 ADBC Client 需要连接 PALO BE 节点拉取查询结果,但 PALO BE 节点不允许被集群外部访问。

在生产环境中,很多时候不方便将 PALO BE 节点暴露到集群外。但可以为所有 PALO BE 节点增加了一层反向代理(比如 Nginx),集群外部的 Client 连接 Nginx 时会随机路由到一台 PALO BE 节点上。默认情况下,Arrow Flight SQL 查询结果会随机保存在一台 PALO BE 节点上,如果和 Nginx 随机路由的 PALO BE 节点不同,需要在 PALO BE 节点内部做一次数据转发。

自 PALO v2.1.8 开始,你可以在所有 PALO BE 节点的 be.conf 中将 public_host 和 arrow_flight_sql_proxy_port 配置成多 PALO BE 节点共享的可供集群外部访问的 IP 和端口,查询结果可以正确转发后返回 ADBC Client。

Conf
1    public_host={nginx ip}
2    arrow_flight_sql_proxy_port={nginx port}

FAQ

  1. Q: 报错 connection error: desc = "transport: Error while dialing: dial tcp ip:arrow_flight_port: i/o timeout"。

    A: 如果报错信息中的 ip:arrow_flight_port 是 PALO FE 节点的 IP 和 arrow-flight-prot,

    Plain Text
    1首先检查 PALO FE 节点的 arrow-flight-server 是否正常启动,在 fe/log/fe.log 文件中搜索到 `Arrow Flight SQL service is started` 表明 FE 的 Arrow Flight Server 启动成功。
    2
    3若 PALO FE 节点的 arrow-flight-server 正常启动,,检查 Client 所在机器能否 `ping` 通报错信息 `<ip:arrow_flight_port>` 中的 IP,若无法 `ping` 通,需要为 PALO FE 节点开通一个可供外部访问的 IP,并重新部署集群。

    A: 如果报错信息中的 ip:arrow_flight_port 是 PALO BE 节点的 IP 和 arrow-flight-prot。

    Plain Text
    1首先检查 PALO BE 节点的 arrow-flight-server 是否正常启动,在 be/log/be.INFO 文件中搜索到 `Arrow Flight Service bind to host` 表明 BE 的 Arrow Flight Server 启动成功。
    2
    3若 PALO BE 节点的 arrow-flight-server 正常启动,检查 Client 所在机器能否 `ping` 通报错信息 `<ip:arrow_flight_port>` 中的 IP,若无法 `ping` 通,若已知 PALO BE 节点处于无法被外部访问的内网,下面两个方法:
    4
    5    - 考虑为每个 PALO BE 节点开通一个可供外部访问的 IP,自 PALO v2.1.8 开始,你可以在这个 PALO BE 节点的 `be.conf` 中将 `public_host` 配置成这个 IP,同理将所有 PALO BE 节点的 `public_host` 配置成对应 BE 节点可被 Client 访问的 IP。
    6
    7    - 参考上文 [多 BE 共享同一个可供集群外部访问的 IP] 章节,可以为所有 PALO BE 节点增加了一层反向代理。
    8
    9若不清楚 PALO BE 是否完全处于内网,检查 Client 所在机器与 PALO BE 节点所在机器的其他 IP 之间的连通性,在 PALO BE 节点所在机器执行 `ifconfig` 返回当前机器所有的 IP,其中一个 IP 应该和 `<ip:arrow_flight_port>` 中的 IP 相同,并且和 `show backends` 打印的这个 PALO BE 节点的 IP 相同,依次 `ping` `ifconfig` 返回的其他 IP,若 PALO BE 节点存在可以被 Client 访问的 IP,参考上文同样将这个 IP 配置为 `public_host`。若 PALO BE 节点所有的 IP 均无法被 Client 访问,那么 PALO BE 节点完全处于内网。
  2. Q:使用 JDBC 或 JAVA 连接 Arrow Flight SQL 时报错 module java.base does not "opens java.nio" to unnamed module 或者 module java.base does not "opens java.nio" to org.apache.arrow.memory.core 或者 java.lang.NoClassDefFoundError: Could not initialize class org.apache.arrow.memory.util.MemoryUtil (Internal; Prepare)

    A:首先检查 fe/conf/fe.conf 中 JAVA_OPTS_FOR_JDK_17 是否包含 --add-opens=java.base/java.nio=ALL-UNNAMED,若没有则添加。然后参考上文 [JDBC Connector with Arrow Flight SQL] 中的注意事项在 Java 命令中添加 --add-opens=java.base/java.nio=ALL-UNNAMED,如果在 IntelliJ IDEA 中调试,需要在 Run/Debug Configurations 的 Build and run 中增加 --add-opens=java.base/java.nio=ALL-UNNAMED。

  3. Q: ARM 环境报错 get flight info statement failed, arrow flight schema timeout, TimeoutException: Waited 5000 milliseconds for io.grpc.stub.Client。

    A: 如果 Linux 内核版本 <= 4.19.90,需要升级到 4.19.279 及以上,或者在低版本 Linux 内核的环境中重新编译 PALO BE,具体编译方法参考文档<docs/dev/install/source-install/compilation-arm>

    问题原因:这是因为老版本 Linux 内核和 Arrow 存在兼容性问题,cpp: arrow::RecordBatch::MakeEmpty() 构造 Arrow Record Batch 时会卡住,导致 PALO BE 的 Arrow Flight Server 在 5000ms 内没有回应 PALO FE 的 Arrow Flight Server 的 RPC 请求,导致 FE 给 Client 返回 rpc timeout failed。Spark 和 Flink 读取 PALO 时也是将查询结果转换成 Arrow Record Batch 后返回,所以也存在同样的问题。

    kylinv10 SP2 和 SP3 的 Linux 内核版本最高只有 4.19.90-24.4.v2101.ky10.aarch64,无法继续升级内核版本,只能在 kylinv10 上重新编译 PALO BE,如果使用新版本 ldb_toolchain 编译 PALO BE 后问题依然存在,可以尝试使用低版本 ldb_toolchain v0.17 编译,如果你的 ARM 环境无法连外网,华为云提供 ARM + kylinv10,阿里云提供 x86 + kylinv10

  4. Q: prepared statement 传递参数报错。

    A: 目前 jdbc:arrow-flight-sql 和 Java ADBC/JDBCDriver 不支持 prepared statement 传递参数,类似select * from xxx where id=?,将报错 parameter ordinal 1 out of range,这是 Arrow Flight SQL 的一个 BUG(GitHub Issue)。

  5. Q: 如何修改 jdbc:arrow-flight-sql 每次读取的批次大小,在某些场景下提升性能。

    A: 通过修改org.apache.arrow.adbc.driver.jdbc.JdbcArrowReader文件中makeJdbcConfig方法中的 setTargetBatchSize,默认是 1024,然后将修改后的文件保存到本地同名路径目录下,从而覆盖原文件生效。

  6. Q: ADBC v0.10,JDBC 和 Java ADBC/JDBCDriver 不支持并行读取。

    A: 没有实现stmt.executePartitioned()这个方法,只能使用原生的 FlightClient 实现并行读取多个 Endpoints, 使用方法sqlClient=new FlightSqlClient, execute=sqlClient.execute(sql), endpoints=execute.getEndpoints(), for(FlightEndpoint endpoint: endpoints),此外,ADBC V0.10 默认的 AdbcStatement 实际是 JdbcStatement,executeQuery 后将行存格式的 JDBC ResultSet 又重新转成的 Arrow 列存格式,预期到 ADBC 1.0.0 时 Java ADBC 将功能完善 GitHub Issue。

  7. Q: 在 URL 中指定 database name。

    A: 截止 Arrow v15.0,Arrow JDBC Connector 不支持在 URL 中指定 database name,比如 jdbc:arrow-flight-sql://{FE_HOST}:{fe.conf:arrow_flight_sql_port}/test?useServerPrepStmts=false 中指定连接test database 无效,只能手动执行 SQL use database。Arrow v18.0 支持了在 URL 中指定 database name,但实测仍有 BUG。

  8. Q: Python ADBC print Warning: Cannot disable autocommit; conn will not be DB-API 2.0 compliant。

    A: 使用 Python 时忽略这个 Warning,这是 Python ADBC Client 的问题,不会影响查询。

  9. Q: Python 报错 grpc: received message larger than max (20748753 vs. 16777216)。

    A: 参考 Python: grpc: received message larger than max (20748753 vs. 16777216) #2078 在 Database Option 中增加 adbc_driver_flightsql.DatabaseOptions.WITH_MAX_MSG_SIZE.value.

  10. Q: 报错 invalid bearer token。

    A: 执行 SET PROPERTY FOR 'root' 'max_user_connections' = '10000'; 修改当前用户的当前最大连接数到 10000;在 fe.conf 增加 qe_max_connection=30000 和 arrow_flight_token_cache_size=8000 并重启 FE。

    ADBC Client 和 Arrow Flight Server 端之间的连接本质上是个长链接,需要在 Server 缓存 Auth Token、Connection、Session,连接创建后不会在单个查询结束时立即断开,需要 Client 发送 close() 请求后清理,但实际上 Client 经常不会发送 close 请求,所以 Auth Token、Connection、Session 会长时间在 Arrow Flight Server 上保存,默认会在 3 天后超时断开,或者在连接数超过 arrow_flight_token_cache_size 的限制后依据 LRU 淘汰。

    截止 PALO v2.1.8,Arrow Flight 连接和 Mysql/JDBC 连接使用相同的连接数限制,包括 FE 所有用户的总连接数 qe_max_connection 和单个用户的连接数 UserProperty 中的 max_user_connections。但默认的 qe_max_connection 和 max_user_connections 分别是 1024 和 100。Arrow Flight SQL 常用来取代使用 JDBC 的场景,但 JDBC 连接会在查询结束后立即释放,所以使用 Arrow Flight SQL 时,PALO 默认的连接数限制太小,经常导致连接数超过 arrow_flight_token_cache_size 的限制后将仍在被使用的连接淘汰。

  11. Q: 使用 JDBC 或 JAVA 连接 Arrow Flight SQL 读取 Datatime 类型返回时间戳,而不是格式化时间。

    A: JDBC 或 JAVA 连接 Arrow Flight SQL 读取 Datatime 类型需要自行转换时间戳,参考 Add java parsing datetime type in arrow flight sql sample #48578。用 Python Arrow Flight SQL 读取 Datatime 类型返回结果为 2025-03-03 17:23:28Z,而 JDBC 或 JAVA 返回 1740993808。

  12. Q: 使用 JDBC 或 Java JDBC Client 连接 Arrow Flight SQL 读取 Array 嵌套类型报错 Configuration does not provide a mapping for array column 2。

    A: 参考 sample/arrow-flight-sql 使用 JAVA ADBC Client。

    Python ADBC Client、JAVA ADBC Client、Java JDBC DriverManager 读取 Array 嵌套类型都没问题,只有使用 JDBC 或 Java JDBC Client 连接 Arrow Flight SQL 有问题,实际上 Arrow Flight JDBC 的兼容性不好保证,不是 Arrow 官方开发的,由一个第三方数据库公司 Dremio 开发,之前还发现过其他兼容性问题,所以建议优先用 JAVA ADBC Client。

2.1 Release Note

v2.1.4 及之前的版本 PALO Arrow Flight 不够完善,建议升级后使用。

v2.1.9

  1. 修复 PALO 数据序列化到 Arrow 的问题。 Fix UT DataTypeSerDeArrowTest of Array/Map/Struct/Bitmap/HLL/Decimal256 types

    • 读取 Decimal256 类型失败;
    • 读取 DatetimeV2 类型微妙部分错误;
    • 读取 DateV2 类型结果不正确;
    • 读取 IPV4/IPV6 类型结果为 NULL 时报错;
  2. 修复 PALO Arrow Flight SQL 查询失败返回空结果,没有返回真实的错误信息。 Fix query result is empty and not return query error message

v2.1.8

  1. 支持 DBeaver 等 BI 工具使用 arrow-flight-sql 协议连接 PALO,支持正确显示元数据树。 Support arrow-flight-sql protocol getStreamCatalogs, getStreamSchemas, getStreamTables #46217。
  2. 支持多 BE 共享同一个可供集群外部访问的 IP 时,查询结果可以正确转发后返回 ADBC Client。 Arrow flight server supports data forwarding when BE uses public vip
  3. 支持多个 Endpoint 并行读取。 Arrow Flight support multiple endpoints
  4. 修复查询报错 FE not found arrow flight schema。 Fix FE not found arrow flight schema
  5. 修复读取允许 NULL 的列报错 BooleanBuilder::AppendValues。 Fix PALO NULL column conversion to arrow batch
  6. 修复 show processlist 显示重复的 Connection ID。 Fix arrow-flight-sql ConnectContext to use a unified ID #46284
  7. 修复读取 Datetime 和 DatetimeV2 类型丢失时区,导致比真实数据的 datetime 少 8 小时的问题。 Fix time zone issues and accuracy issues #38215

v2.1.7

  1. 修复频繁打印日志 Connection wait_timeout。 Fix kill timeout FlightSqlConnection and FlightSqlConnectProcessor close
  2. 修复 Arrow Flight Bearer Token 过期后从 Cache 中淘汰。 Fix Arrow Flight bearer token cache evict after expired

v2.1.6

  1. 修复查询报错 0.0.0.0:xxx, connection refused。 Fix return result from FE Arrow Flight server error 0.0.0.0:xxx, connection refused
  2. 修复查询报错 Reach limit of connections。 Fix exceed user property max connection cause Reach limit of connections #39127

    之前的版本执行 SET PROPERTY FOR 'root' 'max_user_connections' = '1024'; 修改当前用户的当前最大连接数到 1024,可临时规避。

    因为之前的版本只限制 Arrow Flight 连接数小于 qe_max_connection/2,qe_max_connection 是 fe 所有用户的总连接数,默认 1024,没有限制单个用户的 Arrow Flight 连接数小于 UserProperty 中的 max_user_connections,默认 100,所以当 Arrow Flight 连接数超过当前用户连接数上限时将报错 Reach limit of connections,所以需调大当前用户的 max_user_connections。

    问题详情见:Questions

  3. 增加 Conf arrow_flight_result_sink_buffer_size_rows,支持修改单次返回的查询结果 ArrowBatch 大小,默认 4096 * 8。 Add config arrow_flight_result_sink_buffer_size_rows

v2.1.5

  1. 修复 Arrow Flight SQL 查询结果为空。 Fix arrow flight result sink #36827

    PALO v2.1.4 读取大数据量时有几率报错,问题详情见:Questions

3.0 Release Note

v3.0.5

  1. 修复 PALO 数据序列化到 Arrow 的问题。 Fix UT DataTypeSerDeArrowTest of Array/Map/Struct/Bitmap/HLL/Decimal256 types

    • 读取 Decimal256 类型失败;
    • 读取 DatetimeV2 类型微妙部分错误;
    • 读取 DateV2 类型结果不正确;
    • 读取 IPV4/IPV6 类型结果为 NULL 时报错;

v3.0.4

  1. 支持 DBeaver 等 BI 工具使用 arrow-flight-sql 协议连接 PALO,支持正确显示元数据树。 Support arrow-flight-sql protocol getStreamCatalogs, getStreamSchemas, getStreamTables #46217。
  2. 支持多个 Endpoint 并行读取。 Arrow Flight support multiple endpoints
  3. 修复读取允许 NULL 的列报错 BooleanBuilder::AppendValues。 Fix PALO NULL column conversion to arrow batch
  4. 修复 show processlist 显示重复的 Connection ID。 Fix arrow-flight-sql ConnectContext to use a unified ID #46284
  5. 修复 PALO Arrow Flight SQL 查询失败返回空结果,没有返回真实的错误信息。 Fix query result is empty and not return query error message

v3.0.3

  1. 修复查询报错 0.0.0.0:xxx, connection refused。 Fix return result from FE Arrow Flight server error 0.0.0.0:xxx, connection refused
  2. 修复查询报错 Reach limit of connections。 Fix exceed user property max connection cause Reach limit of connections #39127

    之前的版本执行 SET PROPERTY FOR 'root' 'max_user_connections' = '1024'; 修改当前用户的当前最大连接数到 1024,可临时规避。

    因为之前的版本只限制 Arrow Flight 连接数小于 qe_max_connection/2,qe_max_connection 是 fe 所有用户的总连接数,默认 1024,没有限制单个用户的 Arrow Flight 连接数小于 UserProperty 中的 max_user_connections,默认 100,所以当 Arrow Flight 连接数超过当前用户连接数上限时将报错 Reach limit of connections,所以需调大当前用户的 max_user_connections。

    问题详情见:Questions

  3. 修复频繁打印日志 Connection wait_timeout。 Fix kill timeout FlightSqlConnection and FlightSqlConnectProcessor close
  4. 修复 Arrow Flight Bearer Token 过期后从 Cache 中淘汰。 Fix Arrow Flight bearer token cache evict after expired
  5. 支持多 BE 共享同一个可供集群外部访问的 IP 时,查询结果可以正确转发后返回 ADBC Client。 Arrow flight server supports data forwarding when BE uses public vip
  6. 修复查询报错 FE not found arrow flight schema。 Fix FE not found arrow flight schema
  7. 修复读取 Datetime 和 DatetimeV2 类型丢失时区,导致比真实数据的 datetime 少 8 小时的问题。 Fix time zone issues and accuracy issues #38215

v3.0.2

  1. 增加 Conf arrow_flight_result_sink_buffer_size_rows,支持修改单次返回的查询结果 ArrowBatch 大小,默认 4096 * 8。 Add config arrow_flight_result_sink_buffer_size_rows

v3.0.1

  1. 查询结果缺失,查询结果行数 = 实际行数 / BE 个数 Fix get Schema failed when enable_parallel_result_sink is false #37779

    在 PALO 3.0.0 版本,如果查询最外层是聚合,SQL 类似 select k1, sum(k2) from xxx group by k1,你可能会遇到(查询结果行数 = 实际行数 / BE 个数),这是 support parallel result sink 引入的问题,在 Fix get Schema failed when enable_parallel_result_sink is false 临时修复,在 Arrow Flight support multiple endpoints 支持多个 Endpoint 并行读取后正式修复。

上一篇
通过 MySQL 协议连接
下一篇
湖仓一体