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 案例 详解🔗 大数据模块直达链接
评论