写点什么

大数据 -147 Java 访问 Apache Kudu:从建表到 CRUD(含 KuduSession 刷新模式与多 Master 配置)

作者:武子康
  • 2025-11-09
    山东
  • 本文字数:3766 字

    阅读完需:约 12 分钟

大数据-147 Java 访问 Apache Kudu:从建表到 CRUD(含 KuduSession 刷新模式与多 Master 配置)

TL;DR

  • 场景:用 Java(kudu-client 1.4.0)在本地多 Master 集群上完成 Kudu 表的建表、增删改查全流程。

  • 结论:示例能跑通,但存在 flush 顺序、表名不一致、地址尾逗号等易踩坑点;生产与示例配置差异大。

  • 产出:可直接复用的代码骨架 + 常见错误定位与修复清单 + 版本/模式选择指引。


版本矩阵


新建工程

由于重复了太多次,这里直接跳过了。

导入依赖

<dependency>  <groupId>org.apache.kudu</groupId>  <artifactId>kudu-client</artifactId>  <version>1.4.0</version></dependency>
复制代码

创建新表

  • 必须指定表连接到的 Master 节点主机名

  • 必须定义 Schema

  • 必须指定副本数量、分区策略、数量

编写代码

package icu.wzk.kudu;public class KuduCreateTable {
public static void main(String[] args) throws KuduException { String masterAddress = "localhost:7051,localhost:7151,localhost:7251"; KuduClient.KuduClientBuilder kuduClientBuilder = new KuduClient.KuduClientBuilder(masterAddress); KuduClient kuduClient = kuduClientBuilder.build();
String tableName = "student"; List<ColumnSchema> columnSchemas = new ArrayList<>(); ColumnSchema id = new ColumnSchema .ColumnSchemaBuilder("id", Type.INT32) .key(true) .build(); columnSchemas.add(id); ColumnSchema name = new ColumnSchema .ColumnSchemaBuilder("name", Type.STRING) .key(false) .build(); columnSchemas.add(name);
Schema schema = new Schema(columnSchemas); CreateTableOptions options = new CreateTableOptions(); // 副本数量为1 options.setNumReplicas(1); List<String> colrule = new ArrayList<>(); colrule.add("id"); options.addHashPartitions(colrule, 3);
kuduClient.createTable(tableName, schema, options); kuduClient.close(); }
}
复制代码

测试运行

控制台未输出内容
复制代码


运行结果如下图所示:


查看 Kudu

我们查看 Kudu 的 Tables,可以看到刚才创建的表如下:


删除表

编写代码

package icu.wzk.kudu;public class KuduDeleteTable {
public static void main(String[] args) throws KuduException { String masterAddress = "localhost:7051,localhost:7151,localhost:7251,"; KuduClient client = new KuduClient.KuduClientBuilder(masterAddress) .defaultAdminOperationTimeoutMs(5000) .build(); client.deleteTable("student"); client.close(); }
}
复制代码

测试运行

控制台没有输出内容,这里运行截图如下:


查看 Kudu

查看 Kudu 服务的 Table 页,里边的数据表已经删除了。


插入数据

  • 获取客户端

  • 打开一张表

  • 创建会话

  • 设置刷新模式

  • 获取插入实例

  • 声明带插入的数据

  • 刷入数据

  • 应用插入实例

  • 关闭会话

创建新表

我们运行刚才的创建新表代码,把 student 表先生成出来,具体运行这里跳过了。

编写代码

package icu.wzk.kudu;public class KuduInsert {
public static void main(String[] args) throws KuduException { String masterAddr = "localhost:7051,localhost:7151,localhost:7251"; KuduClient client = new KuduClient .KuduClientBuilder(masterAddr) .defaultAdminOperationTimeoutMs(5000) .build(); KuduTable stuTable = client.openTable("student"); KuduSession kuduSession = client.newSession(); kuduSession.setFlushMode(SessionConfiguration.FlushMode.MANUAL_FLUSH); Insert insert = stuTable.newInsert(); insert.getRow().addInt("id", 1); insert.getRow().addString("name", "wzk"); kuduSession.flush(); kuduSession.apply(insert); kuduSession.close(); client.close(); }
}
复制代码


在代码中,有一个叫:kuduSession.setFlushMode:


  • AUTO_FLUSH_SYNC(默认):意思是调用 KuduSession apply 方法后,客户端会在当前刷新到服务器后再返回,这种情况不能够批量插入数据,调用 flush 方法不会起作用,应为此时缓冲区已经被刷新到了服务器。

  • AUTO_FLUSH_BACKGROUD:意思是调用 apply 方法后,客户端会立即返回,但是写入将在后台发送,可能与来自同一会话的其他写入一起进行批处理。如果没有足够的缓冲空间,KuduSession apply 会阻塞,缓冲空间不可用。因为写入操作是在后台进行的,因此任何一个错误都将存储在一个会话本地缓冲区中。注意:这个模式可能会导致插入是乱序的,这是因为在这种模式下,多个写操作可以并发的发送到服务器。且这是一个 Kudu 的 BUG,详细请看:https://issues.apache.org/jira/browse/KUDU-1767https://issues.apache.org/jira/browse/KUDU-1767

  • MANUAL_FLUSH:调用 apply 后,会非常快的返回,但是写操作不会发送,直到用户使用 flush 函数,如果缓冲区超过了限制大小,apply 就会返回一个错误。

测试运行

控制台无输出内容,运行的截图如下图所示:


查询数据

编写代码

Kudu 的查询数据用 Scanner


package icu.wzk.kudu;public class KuduSelect {
public static void main(String[] args) throws KuduException { String masterAddr = "localhost:7051,localhost:7151,localhost:7251"; KuduClient client = new KuduClient .KuduClientBuilder(masterAddr) .build(); KuduTable kuduTable = client.openTable("user"); KuduScanner kuduScanner = client.newScannerBuilder(kuduTable).build(); while (kuduScanner.hasMoreRows()) { for (RowResult result : kuduScanner.nextRows()) { int id = result.getInt("id"); String name = result.getString("name"); int age = result.getInt("age"); System.out.println("id: " + id + ", name: " + name + ", age: " + age); } } client.close(); }
}
复制代码

测试运行

运行结果如下图所示:


更改数据

编写代码

package icu.wzk.kudu;public class KuduUpdate {
public static void main(String[] args) throws KuduException { String masterAddress = "localhost:7051,localhost:7151,localhost:7251"; KuduClient client = new KuduClient .KuduClientBuilder(masterAddress) .build(); KuduTable stuTable = client.openTable("student"); KuduSession kuduSession = client.newSession(); kuduSession.setFlushMode(SessionConfiguration.FlushMode.MANUAL_FLUSH); Update update = stuTable.newUpdate(); update.getRow().addInt("id", 1); update.getRow().addString("name", "wzk_icu"); kuduSession.apply(update); kuduSession.close(); client.close(); }
}
复制代码

删除指定行

编写代码

package icu.wzk.kudu;public class KuduDelete {
public static void main(String[] args) throws KuduException { String masterAddress = "localhost:7051,localhost:7151,localhost:7251"; KuduClient client = new KuduClient .KuduClientBuilder(masterAddress) .build(); KuduSession kuduSession = client.newSession(); KuduTable stuTable = client.openTable("student"); kuduSession.setFlushMode(SessionConfiguration.FlushMode.MANUAL_FLUSH); Delete delete = stuTable.newDelete(); PartialRow row = delete.getRow(); row.addInt("id", 1); kuduSession.flush(); kuduSession.apply(delete); kuduSession.close(); client.close(); }
}
复制代码

测试运行

控制台没有输出任何内容,运行过程截图如下:


错误速查

其他系列

🚀 AI 篇持续更新中(长期更新)

AI 炼丹日志-29 - 字节跳动 DeerFlow 深度研究框斜体样式架 私有部署 测试上手 架构研究,持续打造实用 AI 工具指南!AI-调查研究-108-具身智能 机器人模型训练全流程详解:从预训练到强化学习与人类反馈🔗 AI模块直达链接

💻 Java 篇持续更新中(长期更新)

Java-154 深入浅出 MongoDB 用 Java 访问 MongoDB 数据库 从环境搭建到 CRUD 完整示例 MyBatis 已完结,Spring 已完结,Nginx 已完结,Tomcat 已完结,分布式服务正在更新!深入浅出助你打牢基础!🔗 Java模块直达链接

📊 大数据板块已完成多项干货更新(300 篇):

包括 Hadoop、Hive、Kafka、Flink、ClickHouse、Elasticsearch 等二十余项核心组件,覆盖离线+实时数仓全栈!大数据-278 Spark MLib - 基础介绍 机器学习算法 梯度提升树 GBDT 案例 详解🔗 大数据模块直达链接

发布于: 4 小时前阅读数: 8
用户头像

武子康

关注

永远好奇 无限进步 2019-04-14 加入

Hi, I'm Zikang,好奇心驱动的探索者 | INTJ / INFJ 我热爱探索一切值得深究的事物。对技术、成长、效率、认知、人生有着持续的好奇心和行动力。 坚信「飞轮效应」,相信每一次微小的积累,终将带来深远的改变。

评论

发布
暂无评论
大数据-147 Java 访问 Apache Kudu:从建表到 CRUD(含 KuduSession 刷新模式与多 Master 配置)_Java_武子康_InfoQ写作社区